如果我们决定要将Redis用作应用程序唯一的数据存储手段的话,那么就必须确保Redis不会丢失任何数据。跟提供了ACID(原子性atomicity,一致性consistency,隔离性isolation,耐久性durability,如果一个数据库想要实现可靠的数据事务,那么它就必须保证 ACID 性质)保证的传统关系数据库不同,在使用Redis为后端构建应用程序的时候,我们需要多做一些工作才能保证数据的一致性。
验证快照文件和 AOF 文件
无论时快照持久化还是AOF持久化,都提供了在遇到系统故障时进行数据回复的工具。Redis提供了两个命令行程序 redis-check-aof 和 redis-check-rdb(redis-check-dump was renamed to redis-check-rdb in redis version 3.2) ,它们可以在系统故障发生之后,检查AOF文件和快照文件的状态,并在有需要的情况下对文件进行修复。
在不给定任何参数的情况下运行这两个程序,就可以看见它们的基本使用方法:
$ redis-check-rdb
Usage: redis-check-rdb < rdb-file-name>
$ redis-check-dump
Usage: redis-check-dump < dump.rdb>
如果运行 redis-check-aof 程序时给了 --fix 参数,那么会对AOF文件进行修复。修复方法非常简单:扫描给定的 AOF 文件,寻找不正确或不完整的命令,当发现第一个出错命令的时候,程序会删除出错的命令以及位于出错命令之后的所有命令。在大多数情况下,被删除的都是 AOF 文件末尾的不完整的写命令。
遗憾的是,目前没有办法修复出错的快照文件。尽管发现快照文件首个出现错误的地方是有可能的,但因为快照文件本身经过了压缩,而出现在快照文件中间的错误有可能会导致快照文件的剩余部分无法读取。因此,最好为重要的快照文件保留多个备份,并在进行数据恢复时,通过计算快照文件的
SHA1 散列值和 SHA256 散列值来对内容进行验证。
更换故障主服务器
我们来看一下在拥有一个主服务器和一个从服务器的情况下,更换主服务器的具体步骤。假设A、B两台机器都运行着 Redis ,机器A为 master ,机器B为 slave 。机器A因为暂时无法修复的故障而断开了连接,因此决定将同样安装了 Redis 的机器 C 用作新的主服务器。
更换服务器的计划非常简单:首先向机器B发送一个 SAVE 命令,让它创建一个新的快照文件,接着将这个快照文件发送给机器C,并在机器 C 上面启动 Redis 。最后,让B成为机器C的从服务器。由于环境有限,就在同一台机器上用不同的端口进行测试,下面进行演示:
-
先进入 Redis 安装位置,再安装两个 Redis 服务并分别修改配置文件 redis.conf 中的 port 为6380和6381
$ cd /usr/local $ sudo cp -r redis redis6380 Password: $ sudo chmod -R 777 redis6380 $ vim redis6380/redis.conf $ sudo cp -r redis redis6381 $ sudo chmod -R 777 redis6381 $ vim redis6381/redis.conf -
启动机器A端口为6379,机器B端口为6380,并让B成为A的从服务器
# 启动A $ cd redis $ ./src/redis-server redis.conf # 启动B $ cd redis6380 $ ./src/redis-server redis.conf # 让B成为A的从服务器 $ $ redis-cli -h localhost -p 6380 localhost:6380> SLAVEOF localhost 6379 OK -
停止机器A的 Redis 服务,此时只剩 Redis 从服务器B在运行
-
向机器B发送 SAVE 命令
localhost:6380> SAVE OK -
将机器B的快照文件复制到机器C的对应目录,并启动 Redis 服务
$ cp -f /usr/local/redis6380/dump.rdb /usr/local/redis6381 $ cd /usr/local/redis6381 $ ./src/redis-server redis.conf -
让机器B成为机器C的从服务器
localhost:6380> SLAVEOF localhost 6381 OK -
测试机器B是否能从机器C同步数据
$ redis-cli -h localhost -p 6381 localhost:6381> set key new-master OK $ redis-cli -h localhost -p 6380 localhost:6380> get key 'new-master'
另一种创建新的主服务器的方法,就是将从服务器升级(turn)为主服务器,并为升级后的主服务器创建从服务器。
以上两种方法都可以让 Redis 回到之前的一个主服务器和一个从服务器的状态,而用户接下来需要做的就是更新客户端的配置,让它们去读写正确的服务器。除此之外,如果用户需要重启 Redis 的话,那么可能还需要对服务器的持久化配置进行更新。
Redis Sentinel可以监视指定的Redis主服务器及其下属的从服务器,并在主服务器下线时自动进行故障转移(failover)。