Redis高可用
哨兵(Sentinel)机制
Redis提供了哨兵(Sentinel)机制来解决主服务器挂了的问题。如果主服务器挂了,可以将从服务器升级为主服务器,等到旧的主服务器重连上来,会将它变成从服务器。这个过程叫做主备切换(故障转移)。
一、哨兵(Sentinel)机制功能
- Monitoring:Sentinel不停地监控Redis主从服务器是否正常工作
- Notification:如果某个Redis实例有故障,Sentinel负责发送消息通知管理员
- Automatic failover:如果主服务器挂掉了,会自动将从服务器提升为主服务器
- Configuration provider:Sentinel可以作为配置中心,能够提供当前主服务器的信息
二、启动和初始化Sentinel
Sentinel本质上只是一个运行在特殊模式下的Redis服务器。Sentinel在初始化的时候并不会载入AOF/RDB文件。
Sentinel会创建两个连向主服务器的网络连接:
- 命令连接(发送和接收命令)
- 订阅连接(订阅主服务器的_sentinel_:hello频道)
三、获取和更新信息
Sentinel通过主服务器发送INFO命令来获得主服务器属下所有从服务器的地址信息。
在Sentinel运行的过程中,通过命令连接会以每两秒一次的频率向监视的主从服务器的_sentinel_:hello频道发送命令。
四、判断主服务器是否下线
主观下线
Sentinel以每秒一次的频率向实例发送PING命令,如果一个主服务器在down-after-milliseconds毫秒内连续向Sentinel发送无效回复,那么当前Sentinel就会主观认为该主服务器已经下线了。
客观下线
当Sentinel将一个主服务器判断为主观下线以后,会向同样监视该主服务器的Sentinel询问,如果足够多的Sentinel认为该主服务器是下线的,那么就判定该主服务为客观下线,并对主服务器执行故障转移操作。
五、选举领头Sentinel和故障转移
当一个主服务器认为为客观下线以后,监视这个下线的主服务器的各种Sentinel会进行协商,选举出一个领头的Sentinel,领头的Sentinel会对下线的主服务器执行故障转移操作。
故障转移包括三个步骤:
- 在已下线主服务器属下的从服务器中,挑选一个转换为主服务器
- 让已下线主服务器属下的所有从服务器改为复制新的主服务器
- 已下线的主服务器重新连接时,让他成为新的主服务器的从服务器
挑选从服务器作为主服务器的策略:
- 跟master断开连接的时长
- slave优先级
- 复制offset
- run id
六、数据丢失
Redis主从+哨兵架构可能会丢失数据的情况:
- 异步复制导致的数据丢失:有部分数据还没复制到从服务器,主服务器就宕机了
- 脑裂导致的数据丢失:主服务器脱离正常网络,跟其他从服务器不能连接,哨兵将某个从服务器切换成了主服务器,但旧主服务器还运行着
可以通过以下配置尽量减少数据丢失:
min-slaves-to-write 1
min-slaves-max-lag 10