redis有三种集群方式: 主从复制
, 哨兵模式
和 集群
。
一、主从复制
主从复制模式中包含一个主数据库实例(master)与一个或多个从数据库实例(slave)
原理(工作机制)
slave启动后,向master发送
sync
命令master接收到
sync
命令后通过bgsave
保存快照(RDB持久化)并使用缓冲区记录保存快照这段时间内执行的写命令master将保存的快照文件发送给slave,并继续记录执行的写命令
slave接收到快照文件后,加载快照文件,载入数据
master快照发送完后开始向slave发送缓冲区的写命令,slave接收命令并执行,完成复制初始化
此后master每次执行一个写命令都会同步发送给slave,保持master与slave之间数据的一致性
优点
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成
Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据
缺点
Redis不具备自动容错和恢复功能,主从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
二、哨兵模式
哨兵模式基于主从复制模式,只是引入了哨兵来监控与自动处理故障。Redis Sentinel 的节点数量要满足 2n+1(n>=1)
的奇数个。
功能包括两个
1)监控主从服务器是否正常运行。
2)主服务器出现故障时自动将从服务器转换为主服务器。
原理
每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master、Slave服务器以及其他Sentinel(哨兵)进程发送 ping 命令。
如果一个实例instance距离最后一次有效回复 ping 命令时间超过 down-after-milliseconds 选项所指定的值,则这个实例会被哨兵进程标记为主观下线
正在监视这个Master的所有 Sentinel(哨兵)进程要以每秒一次的频率确认Master的确进入了主观下线状态
当有足够数量的 Sentinel(哨兵)进程在指定的时间范围内确认Master进入了主观下线状态(SDOWN) 则Master会被标记为客观下线(ODOWN)
一般情况下每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master、Slave服务器发送 info 命令。
当Master标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master的所有 Slave发送 info 命令的频率会从 10 秒一次改为每秒一次。
若没有足够数量的 Sentinel(哨兵)进程同意 Master下线, Master客观下线状态就会被移除。
若 Master重新向 Sentinel(哨兵)进程发送 ping 命令返回有效回复,Master主观下线状态就会被移除。
优点
哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
主从可以自动切换,系统更健壮,可用性更高。
缺点
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
三、Cluster集群模式
Cluster模式实现了Redis的分布式存储,即每台节点存储不同的内容,来解决在线扩容的问题。
Redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说redis每台节点上存储不同的内容。
Redis-Cluster采用无中心结构,
特点
所有的redis节点彼此互联(ping-pong机制),内部使用二进制协议优化传输速度和带宽。
节点的fail是通过集群中超过半数的节点检测失效时才生效。
客户端与redis节点直连,不需要中间代理层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
原理
在Redis的每个节点上都有一个插槽(slot)取值范围为0-16383(2的14次方)
当存取key的时候,Redis会根据CRC16的算法得出结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,通过这个值去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
为了保证高可用,Cluster模式也引入主从复制模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点
当其它主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。
如果主节点A和它的从节点都宕机了,那么该集群就无法再提供服务了
优点
无中心架构,数据按照slot分布在多个节点。
集群中的每个节点都是平等的关系,都各自保存数据和整个集群的状态。我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
可线性扩展到1000多个节点,节点可动态添加或删除
能够实现自动故障转移,节点之间通过gossip协议交换状态信息,用投票机制完成slave到master的角色转换
缺点
不支持多数据库空间,单机redis可以支持16个db,集群模式下只能使用一个。
此模式不建议用
mset
、mget
、sunion
等操作支持不友好操作。数据通过异步复制,不保证数据的强一致性
slave充当“冷备”,不能缓解读压力
key事务支持有限,只支持多key在同一节点的事务操作,多key分布不同节点时无法使用事务功能
Cluster模式集群节点最小配置6个节点(3主3从,因为需要半数以上),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。
未经允许请勿转载:程序喵 » Redis 集群的三种方式