介绍
Redis是内存中的键值缓存和存储(即数据库),也可以永久保存(永久保存)到磁盘。 在本文中,您将阅读如何备份Ubuntu 14.04服务器上的Redis数据库。
Redis的数据,默认情况下,在一个保存到磁盘.rdb
文件,这是您的Redis的数据点即时快照。 快照按指定的间隔进行,因此非常适合您的备份。
先决条件
要完成本教程中的步骤,您需要:
- 一个Ubuntu 14.04服务器
- 安装Redis。 您可以从刚刚跟随主安装此Redis的设置教程 (尽管它会与一个主从集群中工作一样好)
- 确保您的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
文件,其中包含日志服务器接收到的所有的写操作。
请参阅这篇文章关于Redis的持久性对于这两个文件之间的差异进行了讨论。 基本上, .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
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-cli
,Redis的命令行。
按照第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目录是/home/ sammy
:
注意,如果目标目录不存在,将由脚本创建目标目录。 换句话说,你不必自己创建它。
与--preserve-数值的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的底部附加如下所示的条目。
0 0 * * * rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis
此Cron条目将在每天午夜执行Redis备份。 该--no文件统计开关将禁用写入file_statistics
在文件rdiff-backup-data
的目录,这将使得rdiff-backup
运行速度,而且使用起来有点更少的磁盘空间。
或者,您可以使用此条目进行每日备份:
@daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis
对于一般更多的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服务器已启动并正在运行。
对于本教程的目的,我们将遵循只是这步1 的Redis集群教程 ,虽然你可以按照整篇文章,如果你想有一个更复杂的设置。
如果你按照第2步 ,在其中添加一个密码,并启用AOF,请确保您考虑,在恢复过程中。
一旦你验证了Redis是了新的服务器上运行redis-benchmark -q -n 1000 -c 10 -P 5
,你可以继续进行。
停止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
。 它禁用它:
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文件的权限
如果要还原到进行备份的同一服务器,则可能已具有正确的权限。
如果您将备份文件复制到新服务器,则可能需要更新文件权限。
让我们查看的权限dump.rdb
在文件/var/lib/redis/
目录。
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.
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来跟踪对数据库的所有写入,请按照以下说明操作。 AOF文件必须从Redis命令行重新创建。
登录Redis:
redis-cli
打开AOF:
BGREWRITEAOF
你应该得到输出:
Background append only file rewriting started
运行info
的命令。 这将产生相当多的输出:
info
滚动到持久段,并检查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
现在,在重新打开AOF redis.conf
文件:
sudo nano /etc/redis/redis.conf
通过的值更改然后重新启用AOF appendonly
到yes
:
appendonly yes
启动Redis:
sudo service redis-server start
如果您想验证数据库一次的内容,只是通过检查数据库内容部分再次运行。
而已! 您恢复的Redis实例应恢复正常。
结论
以本文中给出的方式备份Redis数据对于当您不介意将数据备份到同一服务器上的目录时很有用。
最安全的方法当然是备份到不同的机器。 您可以通过阅读有关备份的文章来了解更多备份选项:
您可以使用许多与在同一个文件中的这些备份方法/var/lib/redis
目录。
请关注我们将来关于Redis迁移和修复的文章。 您可能还需要引用rdiff-backup
的文件对如何使用示例rdiff-backup
有效: