Redis 集群
Redis 集群
什么是 Redis 集群
Redis 集群是 Redis 处理大数据而提供的分布式数据库方案,集群通过分片(sharding)的方式来保存数据库中的键值对。
Redis 集群中的节点分为主节点(Master)和从节点(Slave),其中主节点用于处理槽,而从节点则用于复制主节点,并在主节点故障宕机下线时,切换为主节点继续处理请求命令。
集群节点(node)
一个 Redis 集群通常由多个节点(node)组成,每个节点都是相互独立的,要组建一个真正可工作的集群,需要将节点连接起来,构成一个包含多个节点(node)的集群。
-
查看节点
命令:CLUSTER NODES
-
连接节点
命令:CLUSTER MEET
集群槽(slot)指派
集群中的整个数据库被分为16384个槽(slot),数据库中的每个键都属于其中一个,集群中的每个节点(node)可以处理 0 个或 16384 个。
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽。redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念,使用哈希槽的好处就在于可以方便的添加或移除节点。
-
查看槽
命令:CLUSTER INFO
-
指派槽命令
命令:CLUSTER ADDSLOTS
127.0.0.1:6379> CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000
故障检测
- 集群中每个节点都会定期地向集群中的其他节点进行心跳检测,如果未收到响应则认为该节点疑似下线
- 集群中每个节点会通过相互发送消息的方式来交换集群中各个节点的状态信息
- 如果在一个集群中,半数以上负责处理槽位的主节点都将某个主节点认为疑似下线,那么这个主节点将被最终标记已下线(FAIL),并且会向集群广播,所有收到消息的其他主节点都会立刻将该主节点也标记为已下线
故障转移
当一个从节点发现自己正在复制的主节点进入已下线状态,从节点将开始对下线主节点进行故障转移
- 从下线主节点的所有从节点里面,选中一个从节点
- 被选中的从节点会执行 SLAVEOF no one 命令,成为新的主节点
- 新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽全部指派给自己
- 新的主节点向集群广播一条消息,告诉其他主节点自己已经升级为主节点,接管了已下线的主节点负责处理的槽
- 新的主节点开始接收和自己负责处理的槽相关的命令请求
选择新主节点
新的主节点是通过选举产生的
- 当从节点发现自己正在复制的主节点进入已下线状态时,从节点会向集群广播一条消息,要求所有收到这条消息、并且具有投票权的主节点向自己投票
- 如果一个主节点具有投票权,并且这个主节点尚未投票给其他从节点,那么主节点将向要求投票的从节点投票
- 每个参与选举的从节点都会接收到其他主节点的投票,从而获得一定的票数
- 当从节点票数超过半数时,这个从节点就会当选为新的主节点
- 如果所有从节点没有一个获得半数以上的投票,那么将再次进行投票,直到选出新的主节点为止
注:这个选举新主节点的方法其实和哨兵机制中选择领导者哨兵非常相似