Redis--Redis集群介绍
Redis 集群介绍
Redis3.0 版本之后支持 Cluster。集群要求集群节点中必须要支持主备模式,也就说集中的主节点(Master)至少要有一个从节点(Slave).
每一个蓝色的圈都代表着一个 redis 集群中的主节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作.
Redis-Cluster 架构图
Redis-Cluster 选举: 容错
Redis 之间通过互相的 ping-pong 判断是否节点可以连接上。如果有一半以上的节点去ping 一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的从节点。如果某个节点和所有从节点全部挂掉,我们集群就进入 fail 状态。还有就是如果有一半以上的主节点宕机,那么我们集群同样进入 fail 了状态。这就是我们的 redis 的投票机制,具体原理如下图所示:
投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前 master 节点挂掉.
什么时候整个集群不可用(cluster_state:fail)?
- 如果集群任意 master 挂掉,且当前 master 没有 slave。此时集群进入 fail 状态,也可以理解成集群的 slot 映射[0-16383]不完整时进入 fail 状态。
- 如果集群超过半数以上 master 挂掉,无论是否有 slave,集群进入 fail 状态.
Redis-Cluster 数据存储
当我们的存取的 key 到达的时候,redis 会根据 crc16 的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
在 Node1 执行 set name kevin
- 使用 CRC16 算法对 key 进行计算,得到一个数字,然后对数字进行取余。
CRC16 : name = 26384
26384%16384 = 10000 - 查找到包含 10000 插槽的节点,比如是 node2,自动跳转到 node2
- 在 node2 上执行 set name kevin 命令完成数据的插入
- 如果在 node1 上执行 get name,先使用 CRC16 算法对 key 进行计算,在使用16384 取余,得到插槽的下标,然后跳到拥有该插槽的 node2中执行 get name 命令,并返回结果。