dot 快速的未来即将在您所在的城市举办的活动中到来。

加入我们在 Redis 发布会

如何将 Dynomite 数据库迁移到 Redis Enterprise Active-Active 数据库

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

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

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

迁移您的 Dynomite 数据库

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

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

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

migration racks

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

因此,我们可以将迁移范围限制在我们 Dynomite 设置中的单个机架内,无论是导入/导出还是 Active-Passive。

让我们选择 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 VM。
  • 这些 VM 位于跨越多个区域的同一 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 Active-Active 数据库

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

为了测试我们的两种迁移场景,我创建了一个跨越两个 Redis Enterprise 软件集群的 Active-Active 数据库 - 一个在欧洲,另一个在美国。每个集群由三台运行 Ubuntu 18.04 的 VM 组成。请注意,如果您创建的数据库没有 Active-Active,则迁移步骤将相同,除非本文另有说明。

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

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

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

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

重要事项:Redis Enterprise 的非地理分布式数据库和 Active-Active 数据库之间存在很大差异

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

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

  • 停止 Dynomite 数据库上的流量,并且如果您已仔细规划迁移,并且正在使用 Active-Active 数据库,则切换到 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”指令。更改每个节点上的文件名,例如

  • 节点 1 上的“dump1.rdb”,
  • 节点 2 上的“dump2.rdb”。

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

您可以选择

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

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

转储数据

现在停止通过端口 8379 流入您 Dynomite 数据库的流量。同样,如果您正在导入 Active-Active 数据库,并且已仔细规划迁移以避免在导入过程中意外覆盖任何数据,则可以将流量切换到 Active-Active 数据库。

启动 redis-cli。不要使用端口 8379(Dynomite 的侦听端口)。而是使用端口 6379。这是因为我们需要连接到节点上运行的 Redis OSS 实例,而不是连接到 Dynomite 集群,因为 Dynomite 集群不支持 SAVE 命令。您只需运行 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

我们现在可以将它们导入到 Active-Active 数据库中。

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

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

如果您使用的是云 Active-Active 数据库,只需连接到云 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 Geo-Duplication!只需连接到另一个集群的数据库端点,在本例中为美国端点,并检查您获得的键数量。

您的迁移现已完成。如果您尚未执行此操作,则可以将流量切换到您的数据库。

使用 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 机架所在的网络添加一个带有 6379 端口的自定义 TCP 入站规则。

其次,需要更新两个 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 实例并访问/更改/删除其数据。仅将 6379 端口打开到您的 Redis Enterprise 集群主机。

如果您确实想使用密码,您可以。但这会使您无法运行持续迁移,因为您需要执行以下操作

  • 停止 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 数据库配置页面并单击编辑。

我们有选择启用 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 中单击更新
  • 等待初始同步完成
  • 停止 Dynomite 数据库的流量
  • 等待增量同步完成
  • 再次更新 Active-Active 数据库以禁用 ReplicaOf
  • 启动 Active-Active 数据库的流量。

检查您的数据

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

结论

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