介绍
Redis是一个内存,关键值数据存储,以其灵活性,性能,广泛的语言支持,和内置功能如 replication而闻名。复制是定期从一个数据库复制到另一个数据库的做法,以便有一个复制永远是主要实例的准确复制。
本教程概述了使用Redis内置的复制功能将数据从一个Ubuntu 18.04服务器(源
)迁移到另一个(目标
)的过程。
前提条件
要完成本教程,您将需要:
- 运行 Ubuntu 18.04 的两个服务器每台服务器都应该有一个用户配置的管理权限和一个防火墙设置为
ufw
。 要设置这个环境,请遵循我们的 Ubuntu 18.04 的初始服务器安装指南 对于两个服务器。 - 每个服务器上安装的最新版本的 Redis。
步骤 1 — (可选) 用样本数据加载您的源 Redis 实例
此可选步骤包括将您的源 Redis 实例加载一些样本数据,以便您可以尝试将数据迁移到目标实例. 如果您已经有想要迁移到目标的数据,您可以继续到 步骤 2,其中将介绍如何备份。
首先,连接到您将作为非根用户的 Redis 实例使用的 Ubuntu 服务器:
1[environment local]
2ssh sammy@source_server_ip
然后运行以下命令来访问您的 Redis 服务器:
1redis-cli
如果您已配置您的 Redis 服务器以要求密码验证,请运行auth
命令,然后运行您的 Redis 密码:
1auth source_redis_password
接下来,运行以下命令,这些命令将创建包含几个字符串、一个哈希、一个列表和一组的几个键:
1mset string1 "Redis" string2 "is" string3 "fun!"
2hmset hash1 field1 "Redis" field2 "is" field3 "fast!"
3rpush list1 "Redis" "is" "feature-rich!"
4sadd set1 "Redis" "is" "free!"
此外,运行以下到期
命令以提供一些这些密钥的时效,这将使它们 volatile,这意味着Redis将在指定时间(在这种情况下,7500秒)后删除它们:
1expire string2 7500
2expire hash1 7500
3expire set1 7500
有了它,你可以将一些示例数据导出到你的目标 Redis 实例. 现在请保持redis-cli
提示打开,因为我们将在下一步执行几项命令来备份这些数据。
步骤 2 — 备份您的源 Redis 实例
每当您计划将数据从一个服务器迁移到另一个服务器时,有可能发生错误,因此您可能会失去数据,尽管这种风险很小,但如果您在复制过程中遇到错误,我们将使用 Redis 的bgsave
命令创建源 Redis 数据库的备份。
如果您尚未打开它,请通过打开 Redis 命令行界面开始:
1redis-cli
此外,如果您已配置您的 Redis 服务器以要求密码验证,请运行auth
命令,然后是您的 Redis 密码:
1auth password
接下来,运行bgsave
命令,创建当前数据集的截图,并将其导出到 Redis 工作目录中的垃圾文件中:
1bgsave
<$>[注]
注: 您可以使用保存
或bgsave
命令拍摄您的Redis数据库。我们在这里使用bgsave
命令的原因是保存
命令运行同步,这意味着它会阻止与数据库连接的任何其他客户端。
相反,它建议使用运行 asynchronously 的 bgsave
命令,这将导致Redis将数据库折叠成两个流程:家长流程将继续为客户提供服务,而孩子在退出之前将数据库保存:
请注意,如果客户端在运行bgsave
操作时添加或修改数据,则这些更改不会在快照中捕获。
接下来,您可以通过运行exit
命令来关闭连接到您的 Redis 实例:
1exit
如果您在未来需要它,您可以在您的 Redis 实例的工作目录中找到数据丢弃文件,请记住在 前提 Redis 安装教程中,您如何将您的 Redis 实例设置为使用 `/var/lib/redis 作为工作目录。
列出您的 Redis 工作目录的内容,以确认它持有数据卸载文件:
1sudo ls /var/lib/redis
如果 dump 文件被正确导出,你会在这个命令的输出中看到它. 默认情况下,这个文件被命名为 'dump.rdb':
1[secondary_label Output]
2dump.rdb
确认您的数据已正确备份后,您将配置您的源 Redis 服务器以接受外部连接并允许复制。
步骤 3 – 配置您的 Source Redis 实例
默认情况下,Redis不配置为听取外部连接,这意味着您配置的任何复制件将无法与源实例同步,除非您更新其配置。在这里,我们将更新源实例的配置文件以允许外部连接,并设置密码,目标实例将使用它来验证复制开始后。
使用您喜爱的文本编辑器打开您的源 Redis 实例配置文件. 在这里,我们将使用 nano
:
1sudo nano /etc/redis/redis.conf
导航到以绑定
指令开头的行. 默认情况下,它将看起来像这样:
1[label /etc/redis/redis.conf]
2. . .
3bind 127.0.0.1
4. . .
此指令将Redis绑定到127.0.0.1
,这是一个IPv4循环返回地址,代表本地主机
。这意味着这个Redis实例配置为只听取来自同一个服务器的连接,如它安装的服务器。为了允许源实例接受任何连接到其公共IP地址,例如从目标实例的连接,请在127.0.0.1
后添加源Redis服务器的IP地址。
1[label /etc/redis/redis.conf]
2. . .
3bind 127.0.0.1 source_server_IP
4. . .
接下来,如果您尚未这样做,请使用requirepass
指令来配置用户必须输入的密码,才能与源实例中的数据进行交互。
1[label /etc/redis/redis.conf]
2. . .
3requirepass source_redis_password
4. . .
请注意您在这里设置的密码,因为您在配置目标服务器时需要它。
此更改后,您可以保存并关闭 Redis 配置文件. 如果您用nano
编辑了它,请按CTRL+X
,Y
,然后按ENTER
。
然后,重新启动 Redis 服务以执行这些更改:
1sudo systemctl restart redis
如果您在服务器上配置了防火墙,它将继续阻止目标服务器试图与源连接的任何尝试,假设您已将防火墙配置为ufw
,您可以更新它以允许连接到使用以下命令运行的端口。
1sudo ufw allow 6379
做出最后的更改后,您已经完成了配置您的源 Redis 服务器,继续配置您的目标 Redis 实例以作为源的复制品。
步骤 4 – 配置您的 Target Redis 实例
到目前为止,您已经配置了源 Redis 实例以接受外部连接,但是,由于您通过不评论requirepass
指令而阻止了对源的访问,您的目标实例将无法复制存储在源上的数据。
首先,将连接到您的目标 Redis 服务器,作为您的非根用户:
1[environment local]
2ssh sammy@target_server_ip
接下来,打开目标服务器的 Redis 配置文件:
1[environment second]
2sudo nano /etc/redis/redis.conf
如果您尚未这样做,您应该用requirepass
指令为目标 Redis 实例配置密码:
1[environment second]
2[label /etc/redis/redis.conf]
3. . .
4requirepass target_redis_password
5. . .
接下来,删除masterauth
指令并将其设置为您的源 Redis 实例的身份验证密码. 通过这样做,您的目标服务器在启用复制后将能够对源实例进行身份验证:
1[environment second]
2[label /etc/redis/redis.conf]
3. . .
4masterauth source_redis_password
5. . .
最后,如果您有客户端将信息编写到源实例中,则需要将其配置为将数据编写到目标实例中。
但是,要做到这一点,您需要调整只读复制
指令,默认情况下将其设置为是
,这意味着它已配置为只读
复制,客户将无法向其写作。
1[environment second]
2[label /etc/redis/redis.conf]
3. . .
4replica-read-only no
5. . .
这些都是你需要对目标配置文件进行的所有更改,这样你就可以保存和关闭它。
然后,重新启动 Redis 服务以执行这些更改:
1[environment second]
2sudo systemctl restart redis
重新启动 Redis 服务后,您的目标服务器将准备成为源的复制品,您只需执行一个单一的命令即可。
<$>[注] 注: 如果您有任何客户端将数据写入您的源 Redis 实例中,现在将是一个很好的时机来配置它们以便将数据写入您的目标。
步骤 5 – 启动和验证复制
到此时,您已经配置了您的源 Redis 实例,以接受来自目标服务器的连接,并且您已经配置了您的目标 Redis 实例,以便能够以复制品身份验证源。
首先,在目标 Redis 服务器上打开 Redis 命令行接口:
1[environment second]
2redis-cli
运行auth
命令来验证连接:
1[environment second]
2auth password
接下来,用replicaof
命令将目标实例转换为源的复制件,请确保将source_server_ip
替换为源实例的公共 IP 地址和source_port
替换为 Redis 在源实例中使用的端口:
1[environment second]
2replicaof source_server_ip source_port
从提示程序中,运行以下扫描
命令. 这将返回复制器目前持有的所有密钥:
1[environment second]
2scan 0
如果复制按预期运行,您将看到复制中持有的源实例的所有密钥. 如果您在步骤 1 中加载了样本数据的源,则扫描
命令的输出将如下:
1[secondary_label Output]
2[environment second]
31) "0"
42) 1) "string3"
5 2) "string1"
6 3) "set1"
7 4) "string2"
8 5) "hash1"
9 6) "list1"
<$>[注] 注: 请注意,此命令可能以与本示例所示的不同顺序返回密钥。
但是,如果此命令不返回源 Redis 实例中持有的相同密钥,则可能有服务器配置文件中的一个错误阻止目标数据库连接到源. 在这种情况下,关闭与目标 Redis 实例的连接,并双重检查您是否正确编辑了源和目标 Redis 服务器上的配置文件。
虽然连接是开放的,但你也可以确认你设置的过期密钥仍然是波动的。
1[environment second]
2ttl hash1
这将返回在删除此密钥之前的秒数:
1[environment second]
2[secondary_label Output]
35430
一旦您确认源实例中的数据被正确同步到目标时,您可以通过再次运行复制
命令来将目标恢复为主要实例。
1[environment second]
2replicaof no one
要确认从源复制的数据仍然存在于目标中,请重启您之前输入的扫描
命令:
1[environment second]
2scan 0
您应该在该命令的输出中看到相同的键,就像在目标仍在复制源时运行扫描
命令时一样:
1[environment second]
2[secondary_label Output]
31) "0"
42) 1) "string3"
5 2) "string1"
6 3) "set1"
7 4) "string2"
8 5) "hash1"
9 6) "list1"
因此,您已成功地将所有数据从源 Redis 实例迁移到目标,如果您有仍在向源实例编写数据的客户端,现在将是一个很好的时机来配置它们仅为目标编写。
结论
除了复制之外,您可以使用几种方法将数据从一个 Redis 实例迁移到另一个,但复制有需要相对较少的配置更改,并且只需要一个单一的命令来启动或停止的优点。
如果您想了解更多有关与 Redis 合作的信息,我们鼓励您查看我们关于如何管理 Redis 数据库的教程系列(https://www.digitalocean.com/community/tutorial_series/how-to-manage-a-redis-database).此外,如果您想将您的 Redis 数据移动到由 DigitalOcean 管理的 Redis 实例,请遵循我们的 如何做到这一点指南。