Redis集群和高可用
2019-02-09 本文已影响61人
黄靠谱
概述
Redis集群方案历史上有3个版本:Sentinel版本、Sentinel+Proxy版本,Cluster版本
- Sentinel版本:一主N从,由Sentinel做监控和主从切换
- Sentinel+Proxy版本:N主M从,Proxy负责做分片计算
- Cluster的方案(Redis 3.0以后开始支持),Cluster比较牛逼,Proxy(key映射分片)和Sentinel(主从切换)的功能都自己做了
Sentinel模型

如图所示,有一个虚拟IP (VIP),Sentinel会指定一个Node为Master,并且让VIP指向该Node,从而实现主从切换
Sentinel的作用有三个:
- 监控:Sentinel 会不断的检查主服务器和从服务器是否正常运行。
- 通知:当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
- 自动故障转移:当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点,并且将其他的从节点指向新的主节点。
缺陷:
- 主从切换的过程中会丢数据(因为Master 和Slave的数据不能100%同步)
- Redis只能单点写,不能水平扩容,集群中只能有一个master
Cluster特性(Redis 3.0以上版本支持)
- 1个集群支持多Master(分片),每个Master支持多Slave,Cluster自己负责主从切换
- Cluster支持一定的容错性,只要过半Master工作,整个Redis集群就可用
- 根据公式HASH_SLOT=CRC16(key) mod 16384 计算出Slot,再计算出映射到哪个分片上,然后Redis会去相应的节点进行操作
- 可以通过hashTag,让某几个key保存在同一个slot上,因为做Slot分配的时候,只计算 {keyHead}KeyTail 括号里面的keyHead,比如 {foo}Lion ,{foo}dear,只有在一个Node上,才能确保事务
- 客户端与Redis节点直连,不需要中间Proxy层,直接连接任意一个Master节点
- Cluster支持热扩展,从集群中新增或者删除一个分片,不需要重启,会自动重新分配Slot到对应的分片上
集群的原理
- 任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。
- 它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。如果某个节点和所有从节点全部挂掉,我们集群就进入faill状态
弱一致性
- 不保证强一致性:默认主从复制是异步执行的
A结点写成功后直接返回客户端OK,再通知各个Slave一起同步,如果A确认了客户端的写操作,然后A挂了,那么A1结点成为Master,但是丢失了新的内容 - Cluster通过引入node timeout,来解决网络分区的不一致问题,如果一个集群感知一个Node timeout了,会从集群中剔除这个节点,那么这个节点就不会再分配到新的请求。另外,如果一个Node在timeout的时间无法与过半的Master通讯,自己也进入error状态,停止对正在当前的Client服务,拒绝写的请求
Cluster和Sentinel的区别
- Sentinel出现的比Cluster早,解决的是高可用的问题,Master节点挂了,通过Sentinel实现自动把slave节点升级为Master
- Cluster除了有HA的功能,还有分片的功能,而Sentinel没有这个功能
- Cluster的Master节点至少要3个,因为至少半数master可用整个系统才可用
参考文档
sentinel集群的配置
https://www.cnblogs.com/LiZhiW/p/4851631.html
官网的配置集群的文档说明
https://redis.io/topics/cluster-tutorial
中文版的集群配置说明
https://www.cnblogs.com/cjsblog/p/9048545.html
孤独烟大佬的博客讲集群的
https://mp.weixin.qq.com/s/8H-Hd169s5Hlwn5F2ec25A