dot Redis 8 来了——而且是开源的

了解更多

如何将您的 Dynomite 数据库迁移到 Redis Enterprise 主动-主动数据库

在本文的第一部分“为什么将 Dynomite 数据库迁移到 Redis Enterprise 主动-主动数据库?”中,我们比较了 Dynomite 和 Redis Enterprise 的架构和特性。 我们展示了 Redis Enterprise 如何帮助您以功能丰富、易于管理的方式对 Redis Enterprise 进行地理分布,而不必担心并发写入之间的冲突。

第二部分将描述可用于从 Dynomite 迁移到 Redis Enterprise 的迁移选项。

请注意,此后,Redis Enterprise 的自管理产品将被称为“Redis Enterprise Software”,托管产品将被称为“Redis Enterprise Cloud”或“云订阅”。

迁移您的 Dynomite 数据库

让我们来实际操作一下,看看如何运行两种类型的迁移

  1. 使用 Redis Enterprise 的导入/导出功能进行迁移
  2. 使用 Redis Enterprise 的 ReplicaOf 功能进行迁移,也称为主动-被动

为了便于说明,让我们假设我们有一个跨越两个数据中心的 Dynomite 集群:dc-a 和 dc-b。 每个数据中心都有一个机架,每个机架由两个节点组成,数据集分布在这两个节点之间。

migration racks

如果我们还记得我们对 Dynomite 架构的描述,我们知道每个 Dynomite 机架都包含完整的数据集。

因此,无论采用导入/导出还是主动-被动方式,我们都可以将迁移范围限制在 Dynomite 设置中的单个机架内。

让我们选择 rack-1-dc-a,并假设其两个节点的 IP 如下

  • a1: 10.0.0.1
  • a2: 10.0.0.2

为了清晰起见,以下是我们的 Dynomite 设置的 yaml 配置

#a1
dyn_o_mite:
  datacenter: dc-a
  dyn_listen: 10.0.0.1:7379
  dyn_port: 7379
  dyn_seed_provider: simple_provider
  dyn_seeds:
  - 10.0.0.3:7379:rack1:dc-a:4294967294
  - 10.0.0.4:7379:rack1:dc-b:4294967294
  - 10.0.0.2:7379:rack1:dc-b:2147483647
  listen: 0.0.0.0:8379
  rack: rack1
  servers:
  - 127.0.0.1:6379:1
  timeout: 150000
  tokens: 2147483647
  secure_server_option: datacenter
  pem_key_file: /root/dynomite/conf/dynomite.pem
  data_store: 0
  stats_listen: 127.0.0.1:22222
  read_consistency : DC_QUORUM
  write_consistency : DC_QUORUM

#a2
dyn_o_mite:
  datacenter: dc-a
  dyn_listen: 10.0.0.3:7379
  dyn_port: 7379
  dyn_seed_provider: simple_provider
  dyn_seeds:
  - 10.0.0.1:7379:rack1:dc-a:2147483647
  - 10.0.0.4:7379:rack1:dc-b:4294967294
  - 10.0.0.2:7379:rack1:dc-b:2147483647
  listen: 0.0.0.0:8379
  rack: rack1
  servers:
  - 127.0.0.1:6379:1
  timeout: 150000
  tokens: 4294967294
  secure_server_option: datacenter
  pem_key_file: /root/dynomite/conf/dynomite.pem
  data_store: 0
  stats_listen: 127.0.0.1:22222
  read_consistency : DC_QUORUM
  write_consistency : DC_QUORUM

#b1
dyn_o_mite:
  datacenter: dc-b
  dyn_listen: 10.0.0.2:7379
  dyn_port: 7379
  dyn_seed_provider: simple_provider
  dyn_seeds:
  - 10.0.0.4:7379:rack1:dc-b:4294967294
  - 10.0.0.1:7379:rack1:dc-a:4294967294
  - 10.0.0.3:7379:rack1:dc-a:2147483647
  listen: 0.0.0.0:8379
  rack: rack1
  servers:
  - 127.0.0.1:6379:1
  timeout: 150000
  tokens: 2147483647
  secure_server_option: datacenter
  pem_key_file: /root/dynomite/conf/dynomite.pem
  data_store: 0
  stats_listen: 127.0.0.1:22222
  read_consistency : DC_QUORUM
  write_consistency : DC_QUORUM

#b2
dyn_o_mite:
  datacenter: dc-b
  dyn_listen: 10.0.0.4:7379
  dyn_port: 7379
  dyn_seed_provider: simple_provider
  dyn_seeds:
  - 10.0.0.2:7379:rack1:dc-b:2147483647
  - 10.0.0.1:7379:rack1:dc-a:4294967294
  - 10.0.0.3:7379:rack1:dc-a:2147483647
  listen: 0.0.0.0:8379
  rack: rack1
  servers:
  - 127.0.0.1:6379:1
  timeout: 150000
  tokens: 4294967294
  secure_server_option: datacenter
  pem_key_file: /root/dynomite/conf/dynomite.pem
  data_store: 0
  stats_listen: 127.0.0.1:22222
  read_consistency : DC_QUORUM
  write_consistency : DC_QUORUM

关于此配置和用于测试本教程的设置的一些观察结果

  • 四个运行 Ubuntu 18.04 的 GCP 虚拟机。
  • 这些虚拟机位于跨多个区域的同一 VPC 中。
  • 打开了端口 7379 和 7380,因为 Dynomite 使用这些端口来复制数据——yaml 配置中的“dyn_port”。
  • Redis OSS 在每个节点的端口 6379 上运行——请参阅 yaml 配置中的“servers”。
  • Dynomite 在端口 8379 上侦听客户端的请求(例如 redis-cli -h 10.0.0.1 -p 8379)——请参阅 yaml 配置中的“listen”。

现在我们了解了我们的设置,并决定了我们将使用哪个机架进行迁移,让我们创建一个 Redis Enterprise 数据库。

创建您的 Redis Enterprise 主动-主动数据库

由于本文的目的不是解释如何设置集群或创建数据库,请参阅以下文档以启动并运行您的主动-主动数据库

为了测试我们的两种迁移方案,我创建了一个跨越两个 Redis Enterprise Software 集群的主动-主动数据库——一个在欧洲,一个在美国。 每个集群由三个运行 Ubuntu 18.04 的虚拟机组成。 请注意,如果您创建一个没有主动-主动的数据库,迁移步骤将相同,除非本文另有说明。

让我们继续进行我们的第一种类型的迁移。

使用导入/导出功能进行迁移

Redis OSS 提供了一个名为 Redis 数据库备份文件或 RDB 的持久性选项,它会定期或在 SAVE 或 BGSAVE 命令触发时执行数据集的时间点快照。

这些快照保存在 .rdb 文件中,以下简称 RDB 文件。 我们将从我们的 Dynomite 服务器导出它们,并将它们导入到我们的 Redis Enterprise 数据库中。 请注意,使用此解决方案,增量迁移是不可能的,并且导入可能需要一段时间,具体取决于数据的大小。

重要提示:Redis Enterprise 的非地理分布式数据库和主动-主动数据库之间存在很大差异

  • 非地理分布式数据库:导入 RDB 文件时,将擦除所有现有数据库内容。
  • 主动-主动数据库:您可以导入 RDB 文件并将它们合并到您现有的数据集中。 这意味着您可以在导入之前和期间开始向您的主动-主动数据库发送写入流量。 请注意 - 如果您正在将键写入您的主动-主动数据库,而这些键已存在于 Dynomite 中,则后续导入可能会用较旧的值覆盖较新的值! 这需要仔细规划。

使用 RDB 文件将数据从 Dynomite 迁移到 Redis Enterprise 的方法如下

  • 停止 Dynomite 数据库上的流量,如果您已经仔细规划了您的迁移,并且正在使用主动-主动数据库,请切换到 Redis Enterprise 数据库。
  • 将每个节点的数据(在本例中为 a1 和 a2)导出为 RDB 文件。
  • 将 RDB 文件上传到 Redis Enterprise 集群可以访问的位置(例如,Google Cloud Storage 存储桶、AWS S3 存储桶、FTP 服务器等)。
  • 将 RDB 文件导入到 Redis Enterprise 数据库。
  • 切换到 Redis Enterprise 数据库。

让我们更详细地了解上述步骤。

可选:编辑每个节点上的 Redis OSS 配置文件

如果您使用“apt-get”安装 Redis OSS,则运行在您的 Dynomite 节点上的 Redis OSS 实例的配置文件默认位于 /etc/redis 中;如果您自己构建了 Redis OSS,则位于您的 Redis 文件夹中。 此文件名为“redis.conf”。

使用您喜欢的文本编辑器打开此文件,并搜索“dbfilename”指令。 更改每个节点上的文件名,例如 

  • node1 上的“dump1.rdb”,
  • node2 上的“dump2.rdb”。

这确保了当我们导出我们的 RDB 文件到外部存储时,它们不会具有相同的名称。 如果您愿意,您可以跳过此步骤,并在拍摄快照后更改它们的名称。

可选地,您还可以

  • 使用“dir”指令更改 RDB 文件将存储的目录。
  • 更改快照间隔或禁用自动快照。 在本教程中,我们将使用 SAVE Redis 命令来触发快照,以便我们可以确保在停止流量后转储完整的数据集。
migration file names

请注意,在编辑 Redis OSS 配置文件后,您需要重新启动 Redis OSS 服务器,以便您的更改生效。

转储数据

现在停止通过端口 8379 进入您的 Dynomite 数据库的流量。 同样,如果您要导入到主动-主动数据库,并且已经仔细规划了您的迁移,以免在导入期间冒任何意外覆盖的风险,您可以将流量切换到您的主动-主动数据库。

启动 redis-cli。 不要使用端口 8379,Dynomite 的侦听端口。 而是使用端口 6379。 这是因为我们需要连接到运行在我们的节点上的 Redis OSS 实例,而不是连接到不支持 SAVE 命令的 Dynomite 集群。 您可以只运行 redis-cli 而不带任何命令行参数。

在每个节点上,运行 DBSIZE 命令。 您将获得存储在每个 Redis OSS 实例上的键的数量。 总数应该是我们的 Dynomite 数据库中的键的数量。

#a1
127.0.0.1:6379> dbsize
(integer) 1323

#a2
127.0.0.1:6379> dbsize
(integer) 1371

运行 SAVE 命令并检查您的 RDB 文件是否已在 /var/lib/redis 中创建——或您指定的任何目录。

将两个转储文件导出到外部存储

我们现在准备好将我们的两个 RDB 文件导出到外部存储。

对于本教程,我将把这些文件导出到 Google Cloud 的 Cloud Storage,但您也可以使用其他外部存储选项,例如 FTP 服务器、另一个云服务提供商的存储解决方案,或从您的 Redis Enterprise 集群访问的外部磁盘。 您可以在下面找到关于这些选项的更多信息

在 Google Cloud 中,我创建了以下内容

  • 一个服务帐户,我为其创建了一个 JSON 密钥。
  • 一个云存储桶,我已为我的服务帐户分配了存储旧版对象读取器权限。

现在对于每个节点,我们将运行以下命令

gsutil cp path_to_dump_file gs://your_bucket

我们现在可以在我们的 Google Cloud 存储桶中看到我们的两个 RDB 文件

dump1 and dump2 files

我们现在准备好将它们导入到我们的主动-主动数据库。

将转储文件导入到 Redis Enterprise 数据库

登录到 Redis Enterprise UI 并选择您的主动-主动数据库。 如果像本教程一样,您创建了一个跨越多个集群的 Redis Enterprise 主动-主动数据库,您可以通过您喜欢的任何集群连接到 UI。 在本教程中,我们将使用我们的欧洲 (EU) 集群。

如果您使用的是云主动-主动数据库,只需连接到云 UI 并选择您的数据库。

让我们导航到我们数据库的配置页面,然后单击导入按钮。 选择适当的存储类型。 在我们的例子中,这将是 Google Cloud Storage。

我们现在可以添加我们的两个 RDB 文件的云存储路径,例如

  • /helene-test/dump1.rdb
  • /helene-test/dump2.rdb

我们还需要添加以下信息

  • 客户端 ID
  • 客户端电子邮件
  • 私钥 ID
  • 私钥

这些信息可以在您为您的 Google Cloud 服务帐户创建密钥时下载的 JSON 密钥文件中找到。

请注意,私钥在 JSON 文件中以奇怪的格式显示;它具有引号和换行符。 为了快速地以 Redis Enterprise UI 可以接受的方式格式化它,只需启动一个 python 解释器并打印它

print(WHOLE_COPIED_KEY)

我们现在有以下导入配置

google cloud storage

单击导入并等待导入完成,这将取决于数据库的大小。

检查数据库并切换

使用 redis-cli 连接到您的 Redis Enterprise 数据库的端点。尝试读取一些键,并运行 DBSIZE 命令来检查您是否拥有正确的键的总数。

redis-12000.internal.helene-eu-cluster.demo.redislabs.com:12000> dbsize
(integer) 2694

不要忘记检查 Active-Active 地理复制功能!只需连接到另一个集群的数据库端点,在本例中是美国的集群,并检查您获得的键的数量。

您的迁移现已完成。如果您尚未这样做,您可以将流量切换到您的数据库。

使用 ReplicaOf 功能进行迁移

现在让我们运行持续迁移。

Redis Enterprise 的 ‘ReplicaOf’ 功能(在 Redis Cloud UI 中也称为 Active-Passive)允许我们在两个 Redis 数据库之间持续复制数据。主要的优点是在初始同步完成后,它会复制增量,这意味着几乎没有观察到应用程序端的停机时间。

步骤如下:

  • 在 Dynomite 数据库和 Active-Active 数据库之间建立 ReplicaOf 链接
  • 等待初始同步完成
  • 停止 Dynomite 数据库上的流量
  • 等待增量复制完成
  • 删除数据库之间的 ReplicaOf 链接
  • 切换到 Active-Active 数据库

ReplicaOf 旨在以 Active-Passive 方式使用。这意味着目标被假定为被动的,并且需要容忍,以便目标得到完全重新同步(刷新目标数据库+从源数据库同步)。

在开始迁移之前,让我们讨论一些安全方面的问题。

Dynomite 设置中 Redis OSS 的安全配置

首先,您需要为 Dynomite 机架所在的网络添加一个自定义 TCP 的入站规则,端口为 6379。

其次,需要更新 Dynomite 节点上的 Redis OSS 配置文件。 默认情况下,Redis 仅侦听 IPv4 和 IPv6(如果可用)环回接口地址。 这意味着 Redis OSS 只能接受来自运行它的同一主机的客户端连接。 我们需要更新 Redis OSS 的 “bind” 指令,以便 Redis OSS 可以侦听来自我们的 Redis Enterprise 集群主机的连接。

有两种方法可以做到这一点:

  • 让 Redis OSS 仅侦听来自对等 VPC 中的机器的连接 – 推荐且更安全
  • 允许所有主机访问 Redis OSS – 不安全,尤其是因为 Dynomite 不支持数据库密码

让我们详细讨论这两种选择。

选项 1 – 使用 VPC 对等连接

第一个选择是将您的 Dynomite 机架所在的 VPC 与您的 Redis Enterprise 集群所在的 VPC 进行对等连接。 请注意,如果像我们一样,您创建了一个 Active-Active 数据库,它可以位于任何集群中。 和以前一样,我们将使用我们的欧洲 (EU) 集群进行演示。

建立网络对等连接后,您只需编辑 redis.conf 文件中的 “bind” 指令:在默认环回接口地址后添加 Dynomite 机器的私有 IP。

migration warning

对机架中的所有节点执行此操作即可! 不要忘记重新启动您的 Redis OSS 实例。

选项 2 – 不使用 VPC 对等连接

如果您无法或不想对您的网络进行对等连接,那么您需要按以下方式更新每个节点上的 Redis OSS 配置文件:

  • 注释掉 “bind” 指令,这将把您的 Redis OSS 实例暴露给互联网上的所有人
  • 将 “protected-mode” 设置为 “no”,以便来自其他主机的客户端可以连接到 Redis,即使没有配置身份验证,也没有使用 “bind” 指令显式列出特定的接口集。
migration binding

重要提示: 必须执行最后一步,因为 Dynomite 不支持 Redis 的 OSS AUTH 命令,这阻止我们设置数据库密码。 因此,如果您不使用防火墙来控制谁连接到使用的端口,任何人都可以连接到 Redis OSS 实例并访问/更改/删除其数据。 仅对您的 Redis Enterprise 集群主机开放端口 6379。

如果您真的想使用密码,您可以这样做。 但是这将使运行持续迁移变得不可能,因为您需要执行以下操作:

  • 停止 Dynomite 数据库的流量
  • 编辑 “requirepass” 指令以设置数据库密码。 从这一点开始,您将无法使用端口 8379 将任何写入流量发送到您的 Dynomite 数据库,因为需要 AUTH 命令才能访问数据库
  • 按照下面描述的方式使用 ReplicaOf 执行迁移
  • 将流量切换到 Redis Enterprise 数据库

再考虑一个安全问题,我们就可以开始我们的迁移了!

可选 – 启用 TLS

为防止未经授权的访问您的数据,Redis Enterprise 支持 TLS 协议。

如果您正在使用 Redis Enterprise 软件,您可以专门配置它以进行 ReplicaOf 通信。 如果您正在使用 Redis Enterprise Cloud,您可以启用 TLS

设置数据库之间的 ReplicaOf 链接

在 Redis Enterprise UI 中,让我们导航到我们的 Active-Active 数据库配置页面,然后单击 Edit。

我们可以选择启用 Active-Passive/ReplicaOf。 一旦我们这样做了,我们可以添加以下格式的源

redis://:@IP:port

请注意

  • ReplicaOf 最多允许 32 个源。 这意味着,如果您已将您的数据集分布在 Dynomite 机架中的 32 个以上的节点上,您将无法使用此选项
  • 如果您使用了 VPC 对等连接,您应该使用您机器的私有 IP
  • 如果您没有使用 VPC 对等连接
    • 您应该使用您机器的公共 IP
    • 如果您决定为您的数据库设置密码(并运行一次性迁移),则密码应按如下方式提供:redis://:password@IP:port。

在我们的例子中,使用 VPC 对等连接,这就是我们的源的样子

migration replica of toggle

开始迁移

现在让我们采取以下步骤:

  • 单击 Redis Enterprise UI 中的 Update,
  • 等待初始同步完成,
  • 停止 Dynomite 数据库的流量,
  • 等待增量同步完成,
  • 再次更新 Active-Active 数据库以禁用 ReplicaOf,
  • 在 Active-Active 数据库上启动流量。

检查您的数据

和以前一样,使用 redis-cli 连接到您的数据库,并检查您的数据是否已迁移。 通过连接到其他集群/其他本地端点来检查 Active-Active 地理复制。

结论

Redis 多年来一直被开发人员评为最受欢迎的数据库。 如果您正在使用 Dynomite,这可能是因为您也喜欢 Redis。 在 Redis(Redis OSS 和 Redis Enterprise 的所在地)中,我们可以帮助您的组织以更易于管理的方式对 Redis 进行地理分布,同时保持冲突解决的最高学术标准。