SpringBoot + Redis Sentinel 实现HA

先看完这个,然后很简单的弄一个master和一个slave。然后按顺序启动。
https://redis.io/topics/replication
其实就是配置slaveof,然后分别配置requirepass和master-auth。

再看完这个,
https://redis.io/topics/sentinel
然后启动(最佳实践是3或者更多的奇数个)哨兵服务,可能用到的配置文件如下。

Sentinel 配置

bind 0.0.0.0
port 5000    #Sentinel 服务的端口
daemonize yes
logfile "/var/log/redis/sentinel.log"
sentinel monitor mymaster 127.0.0.1 6379 1  # Quorum取比总数/2大的最小整数即可,这里是1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel auth-pass mymaster toor  # Redis服务的密码

然后通过tailf /var/log/redis/sentinel.log来观察服务的主备切换和各种状态之类的。

应用方面,SpringBoot 的配置如下。

spring.redis.database=0
spring.redis.password=toor
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=127.0.0.1:5000  # 把需要连接的Sentinel全列在这里即可

然后就正常的用RedisTemplate来操作就行了。

当Redis_6379(主服务)挂掉的时候,sentinel会将Redis_6380作为Master启动,这个可以从sentinel的日志中观察到。然后SpringBoot方面,会看到类似于Created JedisPool to master之类的信息重新连到新的Master上面,然后一次failover的切换就完成了。

后续

通过CLI登录到6380服务上,把slaveof的指令取消(毕竟这时候已经是master了嘛),然后将6379作为slave重新启动即可,这样子下次6380挂了的话,6379就会继续作为Master来提供服务了。

推荐阅读更多精彩内容