如何在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_progress0,则 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.aofredis-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