如何在 Ubuntu 14.04 上备份和还原 Redis 数据

介绍

Redis是一个内存,关键值缓存和存储(数据库,即),也可以持续(永久保存)到磁盘上。

默认情况下,Redis数据被保存到磁盘中,这是一个.rdb文件,这是您的Redis数据集的时刻截图。

前提条件

要完成本教程中的步骤,您将需要:

  • 一個 Ubuntu 14.04 伺服器 * 安裝 Redis. 您可以從 這個 Redis 安裝教程(儘管它會與一個 master-slave 集群一起工作) * 確保您的 Redis 伺服器正在運行 * 如果設定了一個 Redis 密碼,這是非常建議的,讓它方便。 密碼在 Redis 配置檔案 - /etc/redis/redis.conf

步骤 1 - 查找 Redis 数据目录

Redis将其数据存储在您的服务器上的目录中,这是我们想要备份的。

在Ubuntu和其他Linux发行版中,Redis数据库目录是/var/lib/redis,但如果您正在管理您继承的服务器,并且Redis数据的位置被更改,您可以通过键入来找到它。

1sudo locate *rdb

或者,您也可以从redis-cli提示处找到它。

1redis-cli

如果 Redis 服务器不运行,响应将是:

1[label Output]
2Could not connect to Redis at 127.0.0.1:6379: Connection refused
3not connected>

在这种情况下,启动 Redis 并使用以下命令重新连接:

1sudo service redis-server start
2
3redis-cli

shell prompt 现在应该更改为:

1127.0.0.1:6379>

在连接到 Redis 时,下面的两个命令将对其进行身份验证,并获取数据目录:

1auth insert-redis-password-here
2
3config get dir

最后一个命令的输出应该是您的 Redis 数据目录:

1[label Output]
21) "dir"
32) "/var/lib/redis"

如果它不同于所示的目录,请确保您在整个教程中使用此目录。

您现在可以退出数据库命令行界面:

1exit

检查这是正确的目录:

1ls /var/lib/redis

如果appendonly也启用,你还会看到一个appendonly.aof或另一个.aof文件,其中包含服务器接收的所有写作操作的日志。

请参阅有关 Redis persistence 的此帖子(http://redis.io/topics/persistence)以了解这两个文件之间的差异。 基本上,.rdb 文件是一个当前的快照,.aof 文件保留了您的 Redis 历史。 两者都值得备份。

我们将从仅仅的.rdb 文件开始,并以自动备份两种文件结束。

(可选)步骤 2 — 添加样本数据

在本节中,您可以创建一些样本数据来存储在您的Redis数据库中. 如果您已经在您的服务器上有数据,您可以简单地备份您的现有内容。

登录到数据库命令行界面:

1redis-cli

真实的:

1auth insert-redis-password-here

让我们添加一些样本数据,你应该在每个步骤后得到一个OK的答案。

1SET shapes:triangles "3 sides"
2
3SET shapes:squares "4 sides"

确认数据已被添加。

1GET shapes:triangles
2
3GET shapes:squares

输出包括在下面:

1[label Output]
2"3 sides"
3
4"4 sides"

要对 /var/lib/redis/dump.rdb 文件进行这些更改,请保存它们:

1save

你可以离开:

1exit

如果你想,你可以现在检查垃圾文件的内容,它应该有你的数据,虽然在一个机器友好的形式:

1sudo cat /var/lib/redis/dump.rdb
1[label /var/lib/redis/dump.rdb]
2REDIS0006?shapes:squares4 sidesshapes:triangles3 sides??o????C

步骤3 - 备份 Redis 数据

现在你知道你的 Redis 数据位于哪里,是时候进行备份了. 从官方 Redis 网站 来这个引用:

Redis 是非常数据备份友好的,因为您可以在数据库运行时复制 RDB 文件:RDB 一旦生成,它永远不会被修改,而当它被生成时,它会使用临时名称,并在新 snapshot 完成时,仅以原子改名(2)更名为最终目的地。

因此,您可以在运行 Redis 服务器时备份或复制数据库文件,假设您将其备份到您的主文件夹下的目录中,执行此备份就像键入一样简单:

1sudo cp /var/lib/redis/dump.rdb /home/sammy/redis-backup-001

**Redis会定期保存此处的内容,这意味着如果上面的命令是您所执行的全部,您将不会得到最新的备份。

但是,如果潜在的数据丢失量很小是可以接受的,那么只需备份一个文件就会起作用。

保存数据库状态

要获得更新的Redis数据副本,一个更好的路径是访问redis-cli,即Redis命令行。

如在步骤 1 中解释的身份验证。

然后,发出保存命令如下:

1save

结果应该是这样的:

1[label Output]
2OK
3(1.08s)

离开数据库。

现在你可以运行上面给出的cp命令,相信你的备份是完全更新。

虽然cp命令将为数据库提供一次性备份,但最好的解决方案是设置一个 cron 任务,将过程自动化,并使用一个可以执行增量更新并在需要时恢复数据的工具。

步骤 4 — 使用 rdiff 备份和 Cron 配置自动更新

在本节中,我们将配置一个自动备份,以备份您的整个Redis数据目录,包括两个数据文件。

在本教程中,我们将使用一个更新的,易于使用的工具,称为rdiff-backup

「rdiff-backup」是一個命令行備份工具,很可能「rdiff-backup」並沒有安裝在您的伺服器上,因此您必須先安裝它:

1sudo apt-get install -y rdiff-backup

现在它已安装,您可以通过将您的 Redis 数据备份到您的主目录中的文件夹来测试它. 在本示例中,我们假定您的主目录是 /home/sammy:

请注意,目标目录将由脚本创建,如果它不存在,换句话说,您不必自己创建它。

使用 --保存数值-ID ,源和目的地文件夹的所有权将是相同的。

1sudo rdiff-backup --preserve-numerical-ids /var/lib/redis /home/sammy/redis

与之前的cp命令一样,这是一种一次性备份,改变的是,我们现在正在备份整个/var/lib/redis目录,并使用rdiff-backup

现在我们将使用Cron自动备份,以便备份发生在设定的时间。

1sudo crontab -e

(如果您尚未在此服务器上使用 crontab,请在提示中选择您最喜欢的文本编辑器。

在 filek 的底部附加下面的入口。

1[label crontab]
20 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运行更快,并使用更少的磁盘空间。

或者,您可以使用此条目来创建每日备份:

1@daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis

有关Cron的更多信息,请阅读本文(https://andsky.com/tech/tutorials/how-to-schedule-routine-tasks-with-cron-and-anacron-on-a-vps)。

正如它所说,备份将每天进行一次,所以你可以回到明天进行最后的测试,或者,你可以暂时增加备份频率,以确保它工作。

由于这些文件属于 redis 系统用户,您可以使用此命令验证它们是否存在(请确保等到备份实际启动):

1ls -l /home/sammy/redis

你的输出应该看起来像这样:

1[label Output]
2total 20
3-rw-rw---- 1 redis redis 70 Sep 14 13:13 dump.rdb
4drwx------ 3 root root 12288 Sep 14 13:49 rdiff-backup-data
5-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 友好的格式,而不是人类友好的格式:

1sudo cat /home/gilly/redis/dump.rdb

这是为一个小数据库;你的输出应该看起来有点像这个:

1[label Output]
2REDIS0006?shapes:triangles3 sidesshapes:squares4 sides??!^?\?,?

如果最新的备份没有数据,您不应该继续恢复,如果内容在那里,继续。

可选:模拟数据丢失

让我们模拟数据丢失,这将是从备份中恢复的理由。

点击查看 Redis:

1redis-cli

在此命令序列中,我们将使用 Redis 授权并删除shapes:triangles条目:

1auth insert-redis-password-here
2
3DEL shapes:triangles

现在让我们确保该条目被删除:

1GET shapes:triangles

产量应该是:

1[label Output]
2(nil)

保存和退出:

1save
2
3exit

可选:设置新 Redis 服务器

现在,如果您打算恢复到新的 Redis 服务器,请确保新的 Redis 服务器已启动并运行。

对于本教程的目的,我们只会遵循这个(https://andsky.com/tech/tutorials/how-to-configure-a-redis-cluster-on-ubuntu-14-04),虽然你可以遵循整个文章,如果你想要一个更复杂的设置。

如果您遵循 步骤 2 ,其中您添加了密码并启用了AOF,请确保您在恢复过程中考虑到这一点。

一旦您通过运行redis-benchmark -q -n 1000 -c 10 -P 5来验证 Redis 是否在新服务器上,您可以继续。

标签: 停止 Redis

在我们能够更换 Redis 丢弃文件之前,我们需要停止当前运行的 Redis 实例。

1sudo service redis-server stop

产量应该是:

1[label Output]
2Stopping redis-server: redis-server

看看它是否真的停止了:

1sudo service redis-server status
1[label Output]
2redis-server is not running

接下来,我们将更名当前的数据库文件。

重命名当前 dump.rdb

Redis从dump.rdb文件中读取其内容,让我们重新命名当前的文件,为我们的恢复文件铺平空间。

1sudo mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.old

请注意,如果您决定当前版本比您的备份文件更好,您可以恢复dump.rdb.old

如果 AOF 已启用,关闭它

AOF 跟踪每个写作操作到 Redis 数据库. 由于我们正在尝试从点时备份中恢复,但我们不希望 Redis 重新创建其 AOF 文件中存储的操作。

如果您从 [Redis Cluster 教程] 的指示下设置 Redis 服务器(https://andsky.com/tech/tutorials/how-to-configure-a-redis-cluster-on-ubuntu-14-04),则已启用 AOF。

您还可以列出 /var/lib/redis/ 目录的内容. 如果您在那里看到一个 .aof 文件,则已启用 AOF。

讓我們重新命名「.aof」檔案,讓它暫時走出路徑,這將重命名每個以「.aof」結束的檔案,所以如果您有一個以上的 AOF 檔案,您應該單獨重新命名檔案,而不要執行這個命令:

1sudo mv /var/lib/redis/*.aof /var/lib/redis/appendonly.aof.old

编辑您的 Redis 配置文件,暂时关闭 AOF:

1sudo nano /etc/redis/redis.conf

AOF部分中,寻找附件指令,并将其从更改为

1[label /etc/redis/redis.conf]
2appendonly no

恢复 dump.rdb 文件

现在我们将使用我们的恢复文件,如果您遵循本教程中之前的步骤,则应该保存到 `/home/sammy/redis/dump.rdb。

如果您正在恢复到新服务器,现在是时候将文件从备份服务器上传到新服务器了:

1scp /home/sammy/redis/dump.rdb sammy@your_new_redis_server_ip:/home/sammy/dump.rdb

现在,在恢复服务器上,它可以是原来的Redis服务器或新服务器,您可以使用cp将文件复制到/var/lib/redis文件夹:

1sudo 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设置的文件夹中恢复。

1sudo rdiff-backup -r now /home/sammy/redis/dump.rdb /var/lib/redis/dump.rdb

有关-r选项的详细信息可在本文末尾提供的项目网站上找到。

设置 dump.rdb 文件的权限

您可能已经拥有正确的权限,如果您正在恢复到您进行备份的相同服务器。

如果您将备份文件复制到新服务器,则可能需要更新文件权限。

让我们在 /var/lib/redis/ 目录中查看 dump.rdb 文件的权限。

1ls -la /var/lib/redis/

如果你看到这样的东西:

1[label Output]
2-rw-r-----  1 sammy sammy 70 Feb 25 15:38 dump.rdb
3-rw-rw----  1 redis redis 4137 Feb 25 15:36 dump.rdb.old

您将需要更新权限,以便该文件由 redis 用户和组拥有:

1sudo chown redis:redis /var/lib/redis/dump.rdb

更新文件,以便该组也可以编写:

1sudo chmod 660 /var/lib/redis/dump.rdb

现在再列出 /var/lib/redis/ 目录的内容:

1ls -la /var/lib/redis/

现在,您恢复的 dump.rdb 文件有正确的权限:

1[label Output]
2-rw-rw----  1 redis redis 70 Feb 25 15:38 dump.rdb
3-rw-rw----  1 redis redis 4137 Feb 25 15:36 dump.rdb.old

<$>[注] 如果您的 Redis 服务器戴蒙在您恢复文件之前运行,现在不会启动 - 它会显示一个消息,如无法在 127.0.0.1:6379 上连接到 Redis:连接被拒绝 - 检查 Redis 的日志。

如果您在日志中看到一行,例如`致命错误加载 DB:允许被拒绝。

开启 Redis

现在我们需要重新启动 Redis 服务器。

1sudo service redis-server start

检查数据库内容

让我们看看恢复是否奏效。

点击查看 Redis:

1redis-cli

查看形状:三角形的条目:

1GET shapes:triangles

产量应该是:

1[label Output]
2"3 sides"

很棒!我们的恢复工作。

出口:

1exit

如果您没有使用 AOF,您已经完成了! 您的恢复的 Redis 实例应该恢复正常。

(可选) 允许 AOF

如果您想要恢复或开始使用 AOF 来跟踪所有写入您的数据库,请遵循这些指示。

点击查看 Redis:

1redis-cli

转向AOF:

1BGREWRITEAOF

你应该得到输出:

1[label Output]
2Background append only file rewriting started

运行info命令,这将产生相当大的输出:

1info

滚动到 Persistence 部分,并检查** aof** 条目是否与这里所示相匹配. 如果** aof_rewrite_in_progress** 是** 0** ,则 AOF 文件的重现已经完成。

 1[label Output]
 2# Persistence
 3
 4. . .
 5
 6aof_enabled:0
 7aof_rewrite_in_progress:0
 8aof_rewrite_scheduled:0
 9aof_last_rewrite_time_sec:0
10aof_current_rewrite_time_sec:-1
11aof_last_bgrewrite_status:ok
12aof_last_write_status:ok

如果确认 AOF 文件的重现已经完成,您现在可以退出 Redis 命令行:

1exit

您可以再次在 /var/lib/redis 中列出文件:

1ls /var/lib/redis

您应该再次看到一个活的 .aof 文件,例如 appendonly.aofredis-staging-ao.aof,以及 dump.rdb 文件和其他备份文件。

一旦确认,停止 Redis 服务器:

1sudo service redis-server stop

现在,在redis.conf文件中再次启用 AOF:

1sudo nano /etc/redis/redis.conf

然后通过将附件值更改为来重新启用 AOF:

1[label /etc/redis/redis.conf]
2appendonly yes

重新开始:

1sudo service redis-server start

如果您想再次验证数据库的内容,只需再次运行检查数据库内容部分。

您恢复的 Redis 实例应该恢复正常。

结论

以本文中所述的方式备份您的 Redis 数据是好的,当您不介意将数据备份到同一服务器上的目录时。

当然,最安全的方法是备份到不同的机器,您可以通过阅读有关备份的这篇文章来探索更多备份选项:

您可以在 /var/lib/redis 目录中使用许多这些备份方法与相同的文件。

请关注我们未来关于 Redis 迁移和恢复的文章,您还可以参阅rdiff 备份文档的示例,以了解如何有效地使用rdiff 备份:

Published At
Categories with 技术
comments powered by Disqus