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

Redis是一个内存,键值缓存和存储(数据库,即),该还可以持续(永久保存)到磁盘。在这篇文章中,你会读到如何备份一个数据库Redis的一个Ubuntu 14.04服务器上。 Redis的数据,默认情况下,在一个`.rdb`文件,这是您的Redis的数据点即时快照保存到磁盘。快照是在指定的时间间隔做,所以是最适合您的备份。

介绍

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
/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的底部附加如下所示的条目。

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的目录,这将使得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指令,并从改变yesno 它禁用它:

/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文件的权限

如果要还原到进行备份的同一服务器,则可能已具有正确的权限。

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

让我们查看的权限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_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

现在,在重新打开AOF redis.conf文件:

sudo nano /etc/redis/redis.conf

通过的值更改然后重新启用AOF appendonlyyes

/etc/redis/redis.conf
appendonly yes

启动Redis:

sudo service redis-server start

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

而已! 您恢复的Redis实例应恢复正常。

结论

以本文中给出的方式备份Redis数据对于当您不介意将数据备份到同一服务器上的目录时很有用。

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

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

请关注我们将来关于Redis迁移和修复的文章。 您可能还需要引用rdiff-backup的文件对如何使用示例rdiff-backup有效: