介绍
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.aof
或 redis-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 备份
: