Redis HA高可用性测试方案

Redis HA高可用性测试方案

第一次在CSDN写blog,重要的事情写一遍。

  • 什么是Redis
  • 测试环境搭建
  • 常用操作汇总
  • 测试场景设计

什么是Redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

测试环境搭建

本次测试用到3台服务器,用到的redis版本为3.0.5。
下载请点击这里:redis-3.0.5.tar.gz

分别上传压缩包到3台服务器上,采用编译安装的方式
将当前压缩包复制到/usr/local下:cp redis-3.0.5.tar.gz /usr/local
解压:tar -zxvf redis-3.0.5.tar.gz
切换目录:cd redis-3.0.5/
编译安装:make&&make install

需要注意的是/usr/local/redis-3.0.5/这个路径下有个大写的INSTALL,编译安装时如果输入的是make&&make INSTALL也能成功走完安装流程,但会安装失败!重新make&&make install即可。

安装成功后进行主从配置。

master机器配置如下:

vi /usr/local/redis-3.0.5/redis.conf
将默认的daemonize no改为daemonize yes使其可以在后台运行。
日志配置:logfile /usr/local/redis-3.0.5/logs/redis_6379/redis_6379.log
日志级别:warning
确认redis端口为port 6379。
保存退出。

slave机器配置如下:

vi /usr/local/redis-3.0.5/redis.conf
添加:slaveof 192.168.9.18 6379(192.168.9.18 为master地址,6379为master端口号)
将默认的daemonize no改为daemonize yes使其可以在后台运行。
日志配置:logfile /usr/local/redis-3.0.5/logs/redis_6379/redis_6379.log
日志级别:warning
确认redis端口为port 6379。
保存退出。

启动主从服务器

带配置文件启动:redis-server ./redis.conf
redis默认会将指令与路径配置到环境变量中,直接执行redis-server redis.conf即可。

Sentinel进程配置

本次测试在3台服务器各启动1个哨兵进程,配置流程如下:
vi /usr/local/redis-3.0.5/sentinel.conf
将默认的sentinel monitor mymaster 127.0.0.1 6379 2改为:
sentinel monitor mymaster 192.168.9.18 6379 1
其中192.168.9.18为master地址,6379为master端口号,最后的1为切换master最少所需的投票数。
后台启动sentinel:nohup ./src/redis-sentinel ./sentinel.conf > ./log/redis-sentinel.log 2>&1 &

查看是否搭建成功

在Sentinel服务器上进入redis-3.0.5/src目录下
./redis-cli -h 172.30.35.6 -p 26379 info Sentinel
显示如下即可(环境IP可能不同)
#Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=172.27.18.151:6379,slaves=2,sentinels=1

常用操作汇总

执行redis-cli,进入命令行模式

指令 作用
info 显示当前redis的主从信息以及哨兵数量,key的数量等
shutdown 关闭当前服务器的redis,进程结束
set 向数据库中插入key,如set aaa bbb插入的key名为aaa,其value为bbb
get 根据key名取value。如上例中get aaa返回结果为bbb
dbsize 返回当前数据库中所有key的数量
keys * 取出当前所有的key
del name 删除key name
flushdb 删除当前选择数据库中的所有key
flushall 删除所有数据库中的数据库

测试场景设计

此时开启批量写入redis的程序,制造一定压力,也便于观察数据库中是否在实时写入数据。

Redis服务器软件故障:

实现方式 预期表现 实际表现
停止redis主服务器进程 模拟redis主服务器故障,实现自动切换到(哨兵模式)新Redis主Server的能力 停止redis主服务器(58)进程后,自动切换到(哨兵模式)新Redis主Server(60),对被测系统处理数据无影响,各数据处理正常。
启动redis前主服务器进程 模拟前redis主服务器恢复,对Redis主服务器无影响 启动前redis主服务器进程后,对redis主数据库无影响,各数据处理正常。
停止redis从服务器进程 模拟redis从服务器故障,对redis主服务器和其他redis从服务器无影响 停止redis从服务器进程后,对redis主服务器和其他redis从服务器无影响,对被测系统处理数据无影响,各数据处理正常。
启动redis从主服务器进程 模拟redis从服务器恢复,恢复同步redis主服务器数据 启动redis从服务器进程后,同步redis主服务器数据,对被测系统处理数据无影响,各数据处理正常。
停止redis一主服务器和一从服务器进程 模拟redis一主服务器和一从服务器同时发生故障,实现自动切换到(哨兵模式)剩余一从服务器为新Redis主Server的能力 同时停止redis一主服务器和一从服务器进程后,自动切换到剩余一从服务器为新Redis主Server,对被测系统处理数据无影响,各数据处理正常。
启动redis其中一台服务器进程 模拟恢复其中一台服务器,对Redis主服务器无影响 启动其中一台服务器进程后,对redis主数据库无影响,同步redis主服务器数据,对被测系统处理数据无影响,各数据处理正常。
继续启动redis剩余一台服务器进程 模拟继续恢复其中一台服务器,对Redis主服务器和从服务器无影响 启动剩余一台服务器进程后,对redis主数据库和从服务器无影响,同步redis主服务器数据,对被测系统处理数据无影响,各数据处理正常。

需要注意,当3台机器都shutdown后,此时启动1个原来的slave机器,即使哨兵进程还在,仍然不会主动切换。从日志中可看到该slave机器一直在尝试与原来的master进行连接。

Redis服务器网络故障

实现方式 预期表现 实际表现
模拟主服务器网络故障 系统检测到主节点故障,自动从从节点中选出新的主节点,业务处理不受影响,剩下的2台服务器主从间数据同步正常 自动选出新的主节点,业务处理不受影响,剩下的2台服务器主从间数据同步正常
模拟从服务器网络恢复 恢复后的服务器自动成为从节点,业务处理不受影响,服务器主从间数据同步正常 恢复后的服务器自动成为从节点,业务处理不受影响,服务器主从间数据同步正常

哨兵进程故障

实现方式 预期表现 实际表现
停止一台服务器哨兵进程 模拟一台服务器哨兵进程故障,对被测系统和数据库处理数据无影响 停止一台服务器哨兵进程后,对被测系统处理数据无影响,各数据处理正常。
停止两台服务器哨兵进程 模拟两台服务器哨兵进程故障,对被测系统和数据库处理数据无影响 停止两台服务器哨兵进程后,对被测系统处理数据无影响,各数据处理正常。
停止redis主数据库进程 模拟redis主服务器进程故障(此时只有一个哨兵进程),redis数据库没有自动切换,无法选出新的redis主节点,数据写入redis数据库失败 停止redis主数据库进程后,系统后台日志报redis数据库连接错误,redis数据库没有自动切换,数据写入redis数据库失败。
启动redis主数据库进程 模拟redis主服务器恢复,恢复后的主服务器继续运行,数据恢复写入redis数据库 启动redis主数据库进程后,系统连接redis数据库正常,日志无redis数据库连接错误,数据恢复写入redis数据库。
启动故障哨兵进程 模拟故障哨兵进程恢复,对被测系统和数据库处理数据无影响 启动故障哨兵进程后,对被测系统处理数据无影响,各数据处理正常。

需要注意,当只有1个哨兵进程运行时,投票切换master也是需要其他哨兵同意的。所以即使配置了最少1个哨兵投票可切换master,此时也不会触发切换。

RDB数据(dump.rdb文件)载入测试

实现方式 预期表现 实际表现
对redis数据库进行kill redis进程操作,之后再启动redis进程,查看rdb文件载入情况 dump.rdb文件:270M;key值:409418;usedMemory:515.36M 停止redis数据库进程,再重新启动,rdb文件载入成功。主redis进程加载rdb:4.169 seconds;主从同步:13.938 seconds

你可能感兴趣的:(测试)