专栏首页云计算教程系列如何在Ubuntu 14.04上备份和还原Redis数据
原创

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

介绍

Redis是一个键值缓存的数据库,它可以持久保存(永久保存)到磁盘存储(即数据库)中。在本文中,您将了解如何在Ubuntu 14.04服务器上备份Redis数据库。

一般情况下,默认将Redis数据保存到磁盘中.rdb文件里,该文件是Redis数据集的时间点快照。快照是按指定的时间间隔生成的,因此非常适合备份。

准备

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

  • 一个Ubuntu 14.04服务器,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 安装Redis。您可以从此Redis设置教程中仅遵循master设置(尽管它与master-slave集群一样可以正常工作)
  • 确保Redis服务器正在运行
  • 如果设置了Redis密码,强烈建议将其设为方便记住和使用的密码。密码位于Redis配置文件 /etc/redis/redis.conf 中。

第一步 - 找到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文件,其中包含服务器收到的所有写入操作的日志。

基本上,该.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官方网站的介绍如下:

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作业,该作业将自动执行该过程,并使用可执行的增量更新工具,并在需要时还原数据。

第四步 - 使用rdiff-backup和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数据库

现在您已经了解了如何备份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这一步,但如果您想要更复杂的设置,则可以按照整篇文章进行操作。

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

停止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文件中的操作。

您还可以列出目录/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, 请使用命令/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文件的权限

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

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

让我们查看/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

现在我们需要再次启动Redis服务器。

sudo service redis-server start

检查数据库内容

让我们看看修复是否有效。

登录Redis:

redis-cli

检查shapes:triangles条目:

GET shapes:triangles

输出应该是:

"3 sides"

这样的结果表示我们的修复工作生效了。

exit

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

(可选)启用AOF

如果要恢复或开始使用AOF跟踪对数据库的所有写入,请按照这些说明进行操作。必须从Redis命令行重新创建AOF文件。

登录Redis:

redis-cli

打开AOF:

BGREWRITEAOF

你应该得到输出:

Background append only file rewriting started

运行info命令。这将产生很多输出内容:

info

滚动到Persistence部分,检查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

现在,在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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在Ubuntu 18.04上安装Redis

    Redis是一个内存中的键值存储器,以其灵活性,性能和广泛的语言支持而闻名。它通常用作数据库,缓存和消息代理,并支持各种数据结构。

    吴凌云
  • 最全的CentOS MariaDB入门教程

    MariaDB是流行的跨平台MySQL数据库管理系统的分支,被认为是MySQL 的完全替代品。MariaDB是由Sun在Sun Microsystems合并期间...

    吴凌云
  • 如何在CentOS 7上设置生产Elasticsearch集群

    Elasticsearch是一种流行的开源搜索服务器,用于实时分布式搜索和数据分析。当用于开发以外的任何其他任务时,Elasticsearch应作为集群跨多个服...

    吴凌云
  • Redis 在PHP中的使用笔记

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT
  • LVS负载均衡的三种工作模式的解析

    NAT(Network Address Translation)即网络地址转换,原理是是通过修改数据报头,让内网IP地址可以访问外网,以及外部用用户可以访问位于...

    用户7459214
  • exp/imp 参数说明,中英对照

    在任意可用exp/imp(导出/导入)命令的主机上,都可以通过exp/imp help=y查看所有的参数说明.

    Alfred Zhao
  • 快速学习-centos6下的redis安装配置

    cwl_java
  • 『互联网架构』软件架构-Nosql之redis(47)

    1.内存容量有限(redis本身是存储在内存里面,硬件机器本身的内容容量是有限,往redis存储的量可能很大,就会出现内存容量的问题) 2.处理能力有限(一个人...

    IT故事会
  • 【leetcode刷题】20T31-加一

    https://leetcode-cn.com/problems/plus-one/

    木又AI帮
  • Envoy源码分析之Dispatcher

    在Envoy的代码中Dispatcher是随处可见的,可以说在Envoy中有着举足轻重的地位,一个Dispatcher就是一个EventLoop,其承担了任务队...

    黑光技术

扫码关注云+社区

领取腾讯云代金券