bboyjing's blog

Redis学习笔记九【处理系统故障】

如果决定要将Redis用作应用程序唯一的数据存储手段的话,那么就必须确保Redis不会丢失任何数据。根提供了ACID保证的传统关系数据库不同,在使用Redis为后端构建应用程序的时候,我们需要多做一些工作才能保证数据的一致性。

验证快照文件和AOF文件

无论时快照持久化还是AOF持久化,都提供了在遇到系统故障时进行数据回复的工具。Redis提供了两个命令行程序redis-check-aof和redis-check-dump(redis-check-rdb),它们可以在系统故障发生之后,检查AOF文件和快照文件的状态,并在有需要的情况下对文件进行修复。下面是使用方法:

1
2
3
4
5
cd /opt/redis-3.2.4
redis-3.2.4 src/redis-check-aof
Usage: src/redis-check-aof [--fix] <file.aof>
redis-3.2.4 src/redis-check-rdb
Usage: src/redis-check-rdb <rdb-file-name>

如果运行redis-check-aof程序时给了–fix参数,那么会对AOF文件进行修复。修复方法非常简单:扫描AOF文件,寻找不正确或不完整的命令,当发现第一个出错命令的时候,程序会删除出错的命令以及位于出错命令之后的所有命令。在大多数情况下,被删除的都是AOF文件末尾的不完整写命令。
遗憾的是,目前没有办法修复出错的快照文件。尽管发现快照文件收个出现错误的地方是有可能的,但因为快照文件本身经过了压缩,而出现在快照文件中间的错误有可能会导致快照文件的剩余部分无法读取。因此,最好为重要的快照文件保留多个备份。

更换故障主服务器

我们来看一下在拥有一个主服务器和一个从服务器的情况下,更换主服务器的具体步骤。假设A、B两台机器都运行着Redis,机器A为master,机器B为slave。机器A因为暂时无法修复的故障而断开了连接,因此决定将同样安装了Redis的机器C用作新的主服务器。
更换服务器的计划非常简单:首先像机器B发送一个SAVE命令,让它创建一个新的快照文件,接着将这个快照文件发送给机器C,并在机器C上面启动Redis。最后让B成为机器C的从从服务器。由于环境有限,就在同一台机器上起不同的端口测试,本机已经安装了两个Redis服务,下面演示下步骤:

  1. 再安装一个Redis服务并修改port配置,改为6381

    1
    2
    3
    4
    cd /opt
    sudo cp -r redis-3.2.4 redis-new-master
    sudo chmod -R 777 redis-new-master
    vim redis-new-master/redis.conf
  2. 启动机器A、B,让环境正常运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //启动机器A
    cd /opt/redis-3.2.4
    ./src/redis-server redis.conf
    //添加一个key
    ./src/redis-cli
    127.0.0.1:6379> set key4 haha
    OK
    //启动机器B
    cd /opt/redis-replication
    ./src/redis-server redis.conf
  3. kill掉机器A的Redis服务,此时只剩Redis从服务在运行

  4. 向机器B发送SAVE命令

    1
    2
    3
    4
    cd /opt/redis-replication
    ./src/redis-cli -h localhost -p 6380
    localhost:6380> SAVE
    OK
  5. 将机器B的快照文件复制到机器C的对应目录,并启动Redis服务

    1
    2
    3
    cp -f /opt/redis-replication/dump.rdb /opt/redis-new-master
    cd /opt/redis-new-master
    src/redis-server redis.conf
  6. 让机器B成为机器C的从服务器

    1
    2
    localhost:6380> SLAVEOF localhost 6381
    OK

    从机器B的日志已经可以看出成功连接上了6381的新主服务

  7. 测试机器B是否能从机器C同步数据
    1
    2
    3
    4
    5
    6
    7
    8
    //连接新master并新增key
    cd /opt/redis-new-master
    ./src/redis-cli -h localhost -p 6381
    localhost:6381> set key5 new_master
    OK
    //查看B机器的key,成功
    localhost:6380> get key5
    "new_master"

Redis Sentinel可以监视指定的Redis主服务器及其下属的从服务器,并在主服务器下线时自动进行故障转移(failover),后面再学习这个功能。