redis 集群之sentinel与主从复制

redis集群有很多种,狭义上集群就是指sharding集群,sharding集群中每一个节点都是一套主从复制,这类技术主要有最新的redis3.0之后官方出品的rediscluster(基于hash slot),还有jedis(redis java api),自己实现的一套JedisSharding(基于一致性hash)。

而广义上,单纯的主从也可以叫集群,主要用来解决容灾问题。

项目一开始考虑使用rediscluster方案,但是配置完成后发现,rediscluster不支持多键操作,例如两个set之间做集合运算,所以直接放弃了,我会在另一篇文章中详细讲解rediscluster配置,以及如何突破cluster节点必须大于3的限制。

而JedisSharding方案涉及到的代码改动有些大,而且不支持re-sharding(呃。。。),所以我们在衡量了各种利弊后,放弃了sharding方案,先只使用主从复制的方案,等精力允许了,再去折腾sharding方案。

本篇文章主要讲解redis主从复制,以及使用redis-sentinel进行failover的监控和自动切换。

服务器资源A和B,centos7系统,redis版本3.0.3

第一步:rpm安装redis3.0.3

 

第二步:打开主从的aof持久化

这里要特别说明一下,很多架构设计建议主关闭持久化,从开启持久化,这样主的效率可以提高,这样的说法有一定道理,但是当采用sentinel的时候,一旦主从发生切换,则无法保证原主变成从后的数据容灾能力,所以,此处,主从的持久化配置应该尽量保持一致。而且在redis2.6版本后,aof持久化操作已经使用子进程操作了,不影响主进程的服务。当然,磁盘IO的频繁读写还是会对整个系统有些影响的,那么这些影响就要在后期的调优中,对各种rewrite啦,buffer啦的参数进行调整了,以达到系统容灾和性能的一个平衡。aof具体原理和调优方案可参考 《Redis核心解读–AOF与REWRITE机制》《redis设计与实现》的aof章节。

Master上

  • maxmemory,设置为可用内存的一半.
  • logfile stdout -> /var/log/redis/redis.log ,指定日志文件
  • dir ./ -> /var/lib/redis,指定持久化文件及临时文件目录.
  • (可选)daemonize no -> yes ,启动daemonize模式,注意如果用daemon工具启动redis-server时设回false。
  • appendonly no->yes,打开AOF文件.
  • auto-aof-rewrite-percentage 100, 综合考虑硬盘大小,可接受重启加载延时等尽量的大,减少AOF rewrite频率.
  • auto-aof-rewrite-min-size 64mb,同上,起码设为5G. *(可选)注释掉RDB的所有触发规则,在Master不保存RDB文件。
  • client-output-buffer-limit slave 256mb 64mb 60. 考虑Traffic及Slave同步是RDB加载所需时间,正确设置避免buffer撑爆client被关掉后又要重新进行全同步。
  • 安全配置,可选。
  • save “” 即可关闭RDB持久化策略

Slave上

  • 设置RDB保存频率,因为RDB只作为Backup工具,设置为30分钟保存一次就够了save 1800 1。
  • repl-timeout 60, 适当加大比如120,避免master实际还没倒掉就认为master倒了。
  • slaveof 设置master地址。

开启A和B上的redis服务,可以查看主从复制的情况

第三步:配置redis-sentinel

修改以下参数

注:mymaster是主库的名字,随便起;后面跟上主库的ip和端口号;最后一个参数是

quorum,意思是当几个sentinel认为主机挂掉的时候,主机就真的挂掉了,由于我在两台机器上都配置了sentinel双保险,所以此处设为2

其他的参数随意改一改

最后启动redis-sentinel,完成配置

查看sentinel状态

 

可以看到mymaster的主,有一个从

随后可以使用redis-shutdown命令关掉主来进行failover测试,在redis-sentinel的日志文件中可以很清楚的看到从变成主的过程。

当主再次启动时,它就变成从服务器了。

 

Jedis的sentinel

 

开源java redis api——jedis实现了sentinelpool功能,具体用法如下:

 

最后

推荐一篇关于redis的细节问题的文档。是开源项目springside的一篇wiki

 

声明:如未作说明,则本文为 渣滓洞【解旻的博客】 原创。转载务必注明出处
注意:转载须保留全文,如需修改请联系作者

本文永久地址:http://xieminis.me/?p=347