如何在Ubuntu14.04上备份和恢复Redis数据
介绍
Redis 是内存中的键值缓存和存储(即数据库),也可以持久化(永久保存)到磁盘。 在本文中,您将了解如何在 Ubuntu 14.04 服务器上备份 Redis 数据库。
默认情况下,Redis 数据以 .rdb
文件的形式保存到磁盘,该文件是 Redis 数据集的时间点快照。 快照是按指定的时间间隔制作的,因此非常适合您的备份。
先决条件
要完成本教程中的步骤,您需要:
- 一个 Ubuntu 14.04 服务器
- 安装 Redis。 您可以按照 this Redis setup tutorial 中的 master 设置(尽管它可以与主从集群一样工作)
- 确保您的 Redis 服务器正在运行
- 如果设置了 Redis 密码(强烈推荐),请随身携带。 密码在Redis配置文件中——
/etc/redis/redis.conf
第 1 步 — 定位 Redis 数据目录
Redis 将其数据存储在您服务器上的一个目录中,这就是我们要备份的内容。 首先我们需要知道它在哪里。
在 Ubuntu 和其他 Linux 发行版中,Redis 数据库目录为 /var/lib/redis
。 但是,如果您正在管理您继承的服务器并且 Redis 数据位置已更改,则可以通过键入以下内容来定位它:
sudo locate *rdb
或者,您也可以从 redis-cli
提示符中找到它。 为此,请键入:
redis-cli
如果 Redis 服务器没有运行,响应将是:
输出
Could not connect to Redis at 127.0.0.1:6379: Connection refused not connected>
在这种情况下,启动 Redis 并使用以下命令重新连接:
sudo service redis-server start redis-cli
shell 提示符现在应更改为:
127.0.0.1:6379>
在连接到 Redis 时,接下来的两个命令将对其进行身份验证并获取数据目录:
auth insert-redis-password-here config get dir
最后一条命令的输出应该是您的 Redis 数据目录:
输出
1) "dir" 2) "/var/lib/redis"
记下您的 Redis 目录。 如果它与显示的目录不同,请确保在整个教程中使用此目录。
您现在可以退出数据库命令行界面:
exit
检查这是正确的目录:
ls /var/lib/redis
您应该会看到一个 dump.rdb
文件。 这就是 Redis 数据。 如果还启用了 appendonly
,您还将看到一个 appendonly.aof
或另一个 .aof
文件,其中包含服务器接收到的所有写操作的日志。
有关这两个文件之间差异的讨论,请参阅 this post about Redis persistence。 基本上,.rdb
文件是当前快照,而 .aof
文件保留了您的 Redis 历史记录。 两者都值得支持。
我们将从 .rdb
文件开始,并以两个文件的自动备份结束。
(可选)第 2 步 - 添加示例数据
在本节中,您可以创建一些示例数据以存储在您的 Redis 数据库中。 如果您的服务器上已有数据,则只需备份现有内容即可。
登录数据库命令行界面:
redis-cli
认证:
auth insert-redis-password-here
让我们添加一些示例数据。 您应该在每一步之后得到 OK
的响应。
SET shapes:triangles "3 sides" SET shapes:squares "4 sides"
确认数据已添加。
GET shapes:triangles GET shapes:squares
输出包括在下面:
输出
"3 sides" "4 sides"
要将这些更改提交到 /var/lib/redis/dump.rdb
文件,请保存它们:
save
您可以退出:
exit
如果您愿意,现在可以检查转储文件的内容。 它应该有你的数据,尽管是机器友好的形式:
sudo cat /var/lib/redis/dump.rdb
/var/lib/redis/dump.rdb
REDIS0006?shapes:squares4 sidesshapes:triangles3 sides??o????C
第 3 步 — 备份 Redis 数据
现在您知道了 Redis 数据的位置,是时候进行备份了。 来自 Redis 官方网站 的引用如下:
Redis 对数据备份非常友好,因为您可以在数据库运行时复制 RDB 文件:RDB 一旦生成就永远不会修改,并且在生成时它使用临时名称并仅使用 rename(2) 以原子方式重命名为最终目标当新快照完成时。
因此,您可以在 Redis 服务器运行时备份或复制数据库文件。 假设您将其备份到主文件夹下的目录,执行该备份就像键入以下内容一样简单:
sudo cp /var/lib/redis/dump.rdb /home/sammy/redis-backup-001
Redis 会定期在此处保存内容,这意味着如果您只运行上述命令,则无法保证您获得最新的备份。 您需要先保存数据。
但是,如果可以接受可能存在少量数据丢失,则只需备份这个文件即可。
保存数据库状态
要获取 Redis 数据的更新版本,更好的方法是访问 Redis 命令行 redis-cli
。
按照步骤 1 中的说明进行身份验证。
然后,像这样发出 save
命令:
save
输出应该与此类似:
输出
OK (1.08s)
退出数据库。
现在您可以运行上面给出的 cp
命令,确信您的备份完全是最新的。
虽然 cp
命令将提供数据库的一次性备份,但最好的解决方案是设置一个可以自动执行该过程的 cron 作业,并使用可以执行增量更新的工具,如果需要,恢复数据。
第 4 步 — 使用 rdiff-backup 和 Cron 配置自动更新
在本节中,我们将配置一个自动备份来备份您的整个 Redis 数据目录,包括两个数据文件。
有几种可用的自动备份工具。 在本教程中,我们将使用一个更新的、用户友好的工具,称为 rdiff-backup
。
rdiff-backup
一个命令行备份工具。 您的服务器上可能没有安装 rdiff-backup
,因此您首先必须安装它:
sudo apt-get install -y rdiff-backup
现在它已安装,您可以通过将 Redis 数据备份到主目录中的文件夹来测试它。 在此示例中,我们假设您的主目录是 /home/sammy
:
请注意,如果目标目录不存在,它将由脚本创建。 换句话说,您不必自己创建它。
使用 –preserve-numerical-ids,源文件夹和目标文件夹的所有权将相同。
sudo rdiff-backup --preserve-numerical-ids /var/lib/redis /home/sammy/redis
与前面的 cp
命令一样,这是一次备份。 改变的是我们现在备份整个 /var/lib/redis
目录,并使用 rdiff-backup
。
现在我们将使用 cron 自动执行备份,以便在设定的时间进行备份。 为此,请打开系统 crontab:
sudo crontab -e
(如果您之前没有在此服务器上使用过 crontab,请在提示符处选择您喜欢的文本编辑器。)
在 filek 的底部附加如下所示的条目。
crontab
0 0 * * * rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis
此 Cron 条目将在每天午夜执行 Redis 备份。 –no-file-statistics 开关将禁止写入 rdiff-backup-data
目录下的 file_statistics
文件,这将使 rdiff-backup
运行更快,使用占用更少的磁盘空间。
或者,您可以使用此条目进行每日备份:
@daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis
有关 Cron 的更多信息,请阅读这篇关于 Cron 的 文章。
就目前而言,备份将每天进行一次,因此您明天可以回来进行最终测试。 或者,您可以暂时增加备份频率以确保其正常工作。
由于这些文件归 redis 系统用户所有,因此您可以使用此命令验证它们是否就位。 (确保等到备份实际触发):
ls -l /home/sammy/redis
您的输出应与此类似:
输出
total 20 -rw-rw---- 1 redis redis 70 Sep 14 13:13 dump.rdb drwx------ 3 root root 12288 Sep 14 13:49 rdiff-backup-data -rw-r----- 1 redis redis 119 Sep 14 13:09 redis-staging-ao.aof
现在,您将拥有 Redis 数据的每日备份,这些备份存储在同一服务器上的主目录中。
第 5 步 — 从备份中恢复 Redis 数据库
现在您已经了解了如何备份 Redis 数据库,这一步将向您展示如何从 dump.rdb
备份文件恢复数据库。
恢复备份需要您将活动 Redis 数据库文件替换为恢复文件。 由于这具有潜在的破坏性,我们建议尽可能恢复到新的 Redis 服务器。
您不希望用更成问题的恢复来覆盖您的实时数据库。 但是,即使还原到同一服务器,重命名而不是删除当前文件也可以最大限度地降低风险,这是本教程展示的策略。
检查恢复文件内容
首先,检查您的 dump.rdb
文件的内容。 确保它有你想要的数据。
您可以直接检查转储文件的内容,但请记住它使用 Redis 友好而不是人类友好的格式:
sudo cat /home/gilly/redis/dump.rdb
这是针对小型数据库的; 你的输出应该看起来像这样:
输出
REDIS0006?shapes:triangles3 sidesshapes:squares4 sides??!^?\?,?
如果您最近的备份没有数据,则不应继续还原。 如果内容在那里,请继续。
可选:模拟数据丢失
让我们模拟数据丢失,这将是从备份中恢复的原因。
登录 Redis:
redis-cli
在这一系列命令中,我们将使用 Redis 进行授权并删除 shapes:triangles
条目:
auth insert-redis-password-here DEL shapes:triangles
现在让我们确保该条目已被删除:
GET shapes:triangles
输出应该是:
输出
(nil)
保存并退出:
save exit
可选:设置新的 Redis 服务器
现在,如果您计划恢复到新的 Redis 服务器,请确保新的 Redis 服务器已启动并正在运行。
出于本教程的目的,我们将仅遵循本 Redis 集群教程 的 Step 1,但如果您想要更复杂的设置,可以遵循整篇文章。
如果您按照 步骤 2 添加密码并启用 AOF,请确保在恢复过程中考虑到这一点。
通过运行 redis-benchmark -q -n 1000 -c 10 -P 5
验证 Redis 已在新服务器上启动后,您可以继续。
停止 Redis
在我们可以替换 Redis 转储文件之前,我们需要停止当前运行的 Redis 实例。 一旦你停止 Redis,你的数据库就会离线。
sudo service redis-server stop
输出应该是:
输出
Stopping redis-server: redis-server
检查它是否真的停止了:
sudo service redis-server status
输出
redis-server is not running
接下来我们将重命名当前数据库文件。
重命名当前 dump.rdb
Redis 从 dump.rdb
文件中读取其内容。 让我们重命名当前文件,为我们的恢复文件让路。
sudo mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.old
请注意,如果您认为当前版本比您的备份文件更好,您可以恢复 dump.rdb.old
。
如果启用了 AOF,请将其关闭
AOF 跟踪对 Redis 数据库的每个写入操作。 但是,由于我们尝试从时间点备份恢复,我们不希望 Redis 重新创建存储在其 AOF 文件中的操作。
如果您按照 Redis 集群教程 中的说明设置 Redis 服务器,则启用 AOF。
您还可以列出 /var/lib/redis/
目录的内容。 如果您在那里看到 .aof
文件,则说明您启用了 AOF。
让我们重命名 .aof
文件以暂时摆脱它。 这会重命名每个以 .aof
结尾的文件,因此如果您有多个 AOF 文件,您应该单独重命名文件,而不是运行以下命令:
sudo mv /var/lib/redis/*.aof /var/lib/redis/appendonly.aof.old
编辑您的 Redis 配置文件以暂时关闭 AOF:
sudo nano /etc/redis/redis.conf
在 AOF
部分中,查找 appendonly
指令并将其从 yes
更改为 no
。 禁用它:
/etc/redis/redis.conf
appendonly no
恢复 dump.rdb 文件
现在我们将使用我们的恢复文件,如果您按照本教程中的前面步骤操作,该文件应保存在 /home/sammy/redis/dump.rdb
。
如果您要恢复到新服务器,现在是时候将文件从备份服务器上传到新服务器了:
scp /home/sammy/redis/dump.rdb sammy@your_new_redis_server_ip:/home/sammy/dump.rdb
现在,在恢复服务器上的,可以是原来的Redis服务器也可以是新的,你可以使用cp
将文件复制到/var/lib/redis
文件夹:
sudo cp -p /home/sammy/redis/dump.rdb /var/lib/redis
(如果您将文件上传到 /home/sammy/dump.rdb
,请改用命令 sudo cp -p /home/sammy/dump.rdb /var/lib/redis
来复制文件。)
或者,如果要使用 rdiff-backup
,请运行如下所示的命令。 请注意,这仅在您从最初使用 rdiff-backup
设置的文件夹中恢复时才有效。 使用 rdiff-backup
,您必须指定目标文件夹中的文件名:
sudo rdiff-backup -r now /home/sammy/redis/dump.rdb /var/lib/redis/dump.rdb
有关 -r
选项的详细信息,请参阅本文末尾提供的项目网站。
为 dump.rdb 文件设置权限
如果您要恢复到进行备份的同一台服务器,您可能已经拥有正确的权限。
如果您将备份文件复制到新服务器,您可能需要更新文件权限。
我们来查看/var/lib/redis/
目录下dump.rdb
文件的权限。
ls -la /var/lib/redis/
如果你看到这样的东西:
输出
-rw-r----- 1 sammy sammy 70 Feb 25 15:38 dump.rdb -rw-rw---- 1 redis redis 4137 Feb 25 15:36 dump.rdb.old
您需要更新权限,使文件归 redis 用户和组所有:
sudo chown redis:redis /var/lib/redis/dump.rdb
将文件更新为可由组写入:
sudo chmod 660 /var/lib/redis/dump.rdb
现在再次列出 /var/lib/redis/
目录的内容:
ls -la /var/lib/redis/
现在您恢复的 dump.rdb
文件具有正确的权限:
输出
-rw-rw---- 1 redis redis 70 Feb 25 15:38 dump.rdb -rw-rw---- 1 redis redis 4137 Feb 25 15:36 dump.rdb.old
如果您的 Redis 服务器守护程序在您恢复文件之前正在运行,现在无法启动 - 它会显示类似 Could not connect to Redis at 127.0.0.1:6379: Connection refused
的消息 - 检查 Redis 的日志。
如果您在日志中看到类似 Fatal error loading the DB: Permission denied. Exiting.
的行,则需要检查 dump.rdb
文件的权限,如本步骤所述。
启动 Redis
现在我们需要再次启动 Redis 服务器。
sudo service redis-server start
检查数据库内容
让我们看看恢复是否有效。
登录 Redis:
redis-cli
检查 shapes:triangles
条目:
GET shapes:triangles
输出应该是:
输出
"3 sides"
伟大的! 我们的修复奏效了。
出口:
exit
如果你不使用 AOF,你就完成了! 您恢复的 Redis 实例应该会恢复正常。
(可选)启用 AOF
如果您想恢复或开始使用 AOF 来跟踪对数据库的所有写入,请按照这些说明进行操作。 必须从 Redis 命令行重新创建 AOF 文件。
登录 Redis:
redis-cli
开启 AOF:
BGREWRITEAOF
你应该得到输出:
输出
Background append only file rewriting started
运行 info
命令。 这将产生相当多的输出:
info
滚动到 Persistence 部分,并检查 aof 条目是否与此处显示的内容匹配。 如果 aof_rewrite_in_progress 为 0,则 AOF 文件的重新创建已完成。
输出
# Persistence . . . aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:0 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok
如果确认 AOF 文件的重新创建已完成,您现在可以退出 Redis 命令行:
exit
您可以再次列出/var/lib/redis
中的文件:
ls /var/lib/redis
您应该会再次看到实时的 .aof
文件,例如 appendonly.aof
或 redis-staging-ao.aof
,以及 dump.rdb
文件和其他备份文件。
确认后,停止 Redis 服务器:
sudo service redis-server stop
现在,在 redis.conf
文件中再次开启 AOF:
sudo nano /etc/redis/redis.conf
然后通过将 appendonly
的值更改为 yes
来重新启用 AOF:
/etc/redis/redis.conf
appendonly yes
启动 Redis:
sudo service redis-server start
如果您想再次验证数据库的内容,只需再次运行 Checking Database Contents 部分。
就是这样! 您恢复的 Redis 实例应该会恢复正常。
结论
当您不介意将数据备份到同一服务器上的目录时,以本文中给出的方式备份您的 Redis 数据非常有用。
当然,最安全的方法是备份到另一台机器。 您可以通过阅读这篇关于备份的文章来探索更多备份选项:
您可以对 /var/lib/redis
目录中的相同文件使用其中的许多备份方法。
请留意我们未来关于 Redis 迁移和恢复的文章。 您可能还想参考 rdiff-backup
文档的示例,了解如何有效地使用 rdiff-backup
: