High Availability Redis Architecture
主从模式也即主从复制(Replication),是指将一台Redis服务器的数据复制到其他的Redis服务器,前者成为主节点(Master或者Primary),后者称为从节点(Slave或者Replica);每次当slave和master断开连接,slave都会自动重新连接master并且进行数据重同步。
Redis并不能保证数据的强一致性. 这意味这在实际中集群在特定的条件下可能会丢失写操作,原因是因为Redis的复制是异步,写操作过程:
Redis保证最终一致性,即使网络断开,主从节点出现不一致,但是一旦网络恢复,从节点会采取多种策略追赶主节点,尽力保持和主节点一致。
数据的复制是单向的,只能由主节点到从节点
一个master可以拥有多个slave,但是一个slave只能拥有一个master
slave可以接受其他slave的连接,像层叠装的结构(cascading-like structure)连接到其他slave,也即数据可以从一个从节点到另一个从节点(从从同步)
主从复制的开启,都是由从节点发起,不需要在主节点上做任何事情
有3种方式:
slaveof {masterip} {masterport}
--slaveof {masterip} {masterport}
slaveof {masterip} {masterport}
通过slaveof no one
断开复制连接,需要注意的是,从节点断开复制后,不会删除已有的数据,只是不再接受主节点新的数据变化,而且从节点自身会重新变成主节点。
如果在主节点中通过requirepass
设置了密码,那么需要在从节点中配置与主节点一致的密码,才能发起复制流程:
config set masterauth <password>
masterauth <password>
Redis哨兵(Redis Sentinel)在Redis2.8开始引入。核心功能是主节点的自动化故障转移。
它由两部分组成:
客户端连接时,会首先连接sentinel,通过sentinel获取主节点的地址,然后再连接主节点进行数据交互。当主节点故障时,客户端会重新向sentinel要地址,sentinel会将新选出来的主节点的地址告诉客户端,因此客户端无需重启就可以完成节点的切换
详情移步项目内docker-redis-sentinel目录,通过docker部署的redis-sentinel集群。
哨兵解决了redis数据节点的自动故障迁移的问题,但是还是无法解决主从复制遗留下来的两个问题
通过集群模式(Redis Cluster),Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案
Redis集群没有使用一致性hash, 而是引入了哈希槽(hash slot)的概念.
Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
0-5500
号哈希槽5501-11000
号哈希槽11001-16384
号哈希槽为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有1到多个从节点
例如,具有A,B,C三个节点的集群,在没有主从复制的情况下,如果主节点B故障了,那么整个集群就会因为缺少5501-11000这个范围的哈希槽而不可用
如果在集群创建的时候我们为每个主节点添加一个从节点A1,B1,C1,那么整个集群便有三个主节点和三个从节点组成,这样主节点B故障后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽缺失而不可用,不过当B和B1都故障,那么集群还是会不可用
详情移步项目内docker-redis-cluster目录,通过docker部署的redis-cluster集群。