Redis是一个键值缓存的数据库,它可以持久保存(永久保存)到磁盘存储(即数据库)中。在本文中,您将了解如何在Ubuntu 14.04服务器上备份Redis数据库。
一般情况下,默认将Redis数据保存到磁盘中.rdb
文件里,该文件是Redis数据集的时间点快照。快照是按指定的时间间隔生成的,因此非常适合备份。
要完成本教程中的步骤,您需要:
/etc/redis/redis.conf
中。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
文件,其中包含服务器收到的所有写入操作的日志。
基本上,该.rdb
文件是当前快照,该.aof
文件保存您的Redis历史记录。两者都值得备份。
我们将从.rdb
文件开始,最后以两个文件的自动备份结束。
在本节中,您可以创建一些样本数据以存储在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
现在您已知道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命令行)。
按步骤一的说明进行身份验证。
然后,发出save
命令:
save
输出应该类似于:
OK
(1.08s)
退出数据库。
现在您可以按照上面给出的命令运行cp
,确保您的备份是最新的。
虽然该cp
命令将提供数据库的一次性备份,但最佳解决方案是设置一个cron作业,该作业将自动执行该过程,并使用可执行的增量更新工具,并在需要时还原数据。
在本节中,我们将配置一个自动备份,用于备份整个Redis数据目录,包括两个数据文件。
有几种自动备份工具可用。在本教程中,我们将使用一个更新的,用户友好的工具rdiff-backup
。
rdiff-backup
是命令行备份工具。您可能没有在服务器上安装rdiff-backup
,因此您首先必须安装它:
sudo apt-get install -y rdiff-backup
现在它已经安装,您可以通过将Redis数据备份到主目录中的文件夹来测试它。在此示例中,我们假设您的主目录是:/home/sammy
请注意,如果脚本不存在,脚本将自动创建目标目录,即您不必自己创建它。
使用--preserve-numeric-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文件统计切换将禁止写入到rdiff-backup-data
目录中的file_statistics
文件里,这将使得rdiff-backup
运行速度更快,而且占用更少的磁盘空间。
或者,您可以使用此条目进行每日备份:
@daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis
目前,备份将每天进行一次,因此您明天可以回来进行最终测试。或者,您可以暂时提高备份频率以确保其正常工作。
由于这些文件归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数据,这些数据存储在同一服务器上的主目录中。
现在您已经了解了如何备份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这一步,但如果您想要更复杂的设置,则可以按照整篇文章进行操作。
通过运行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
接下来,我们将重命名当前数据库文件。
Redis从dump.rdb
文件中读取其内容。我们重命名当前的一个,为我们的恢复文件让路。
sudo mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.old
请注意,如果您确定当前版本优于备份文件,则可以还原dump.rdb.old
。
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
现在我们将使用我们的恢复文件,如果您按照本教程中的前面步骤操作,则应保存该文件/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
, 请使用命令/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
选项的详细信息可在本文末尾给出的项目网站上找到。
如果要还原到进行备份的同一服务器,则可能已具有正确的权限。
如果将备份文件复制到新服务器,则可能必须更新文件权限。
让我们查看/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服务器。
sudo service redis-server start
让我们看看修复是否有效。
登录Redis:
redis-cli
检查shapes:triangles
条目:
GET shapes:triangles
输出应该是:
"3 sides"
这样的结果表示我们的修复工作生效了。
exit
如果你没有使用AOF,你就完成了!您恢复的Redis实例应该恢复正常。
如果要恢复或开始使用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 :
appendonly yes
启动Redis:
sudo service redis-server start
如果您想再次验证数据库的内容,只需再次运行“ 检查数据库内容”部分。
就是这样,Redis实例应该恢复正常。
当您不介意将数据备份到同一服务器上的目录时,以本文中给出的方式备份Redis数据非常有用。
当然,最安全的方法是备份到不同的机器。您可以用/var/lib/redis
目录下的同一个文件使用多种备份方法。
想要了解更多关于备份和还原的开源信息教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Back Up and Restore Your Redis Data on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。