redis cluster 数据分片 master slave hash slot redis cluster vs replication + sentinal hash slot 简化 节点新增或移除时的数据迁移 手工分配slot CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000 每个节点会记录哪些槽指派给了自己,哪些槽指派给了其他节点。 客户端向节点发送命令,节点要计算这个键属于哪个槽。 如果是自己负责的槽,那么直接执行命令,如果不是,向客户端返回MOVED,指引转向正确的节点。 slave 高可用 热备 主备切换 redis cluster默认不支持slave节点读写 redis cluster节点间采取gossip协议进行通信 元数据存储 集中式 vs 分布式 (gossip) 集中式 优点 元数据的更新和读取,时效性好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到 缺点 所有的元数据的跟新压力全部集中在一个地方,可能会导致元数据的存储有压力 gossip 优点 元数据分散,降低了压力; 缺点 元数据更新有延时,可能导致集群的一些操作会有一些滞后 每个节点都有一个专门用于节点间通信的端口,提供服务的端口号+10000 每隔一段时间都会往另外几个节点发送ping消息,其他节点收到ping之后返回pong 交换的信息 故障信息,节点的增加和移除,hash slot信息,等 gossip协议包含多种消息,包括ping,pong,meet,fail 等 meet: 某个节点发送meet给新加入的节点,让新节点加入集群中 redis-trib.rb add-node 每个节点发送ping给其他的节点, 交换数据,进行元数据的更新 某个节点判断另一个节点fail之后,就发送fail给其他节点 ping很频繁,并携带一些元数据,可能会加重网络负担 每个节点每秒会执行10次ping,每次会选择5个最久没有通信的其他节点 如果发现某个节点通信延时达到了cluster_node_timeout / 2,那么立即发送ping,避免数据交换延时过长 每次ping,带上自己的信息,还要带上1/10其他节点的信息 至少包含3个其他节点的信息,最多包含总节点-2个其他节点的信息 查看key对应的slot cluster keyslot mykey redis-cli -c参数 自动重定向 接收到moved之后,自动重定向到对应的节点执行命令 根据key计算CRC16 ,然后对16384取模 用hash tag 手动指定key对应的slot set mykey1:{100} set mykey2:{100} 重定向消耗网络IO smart jedis 本地维护一份hashslot -> node 映射表,缓存 ,避免 moved重定向 JedisCluster 初始化时随机选择一个node,初始化hashslot -> node映射表 为每个节点创建一个JedisPool连接池 本地计算key的hashslot,在本地映射表找到对应的节点 返回moved 时会更新本地 映射表 定位节点 重试超过5次 JedisClusterMaxRedirectionException 如果hash slot正在迁移,返回ask重定向给jedis 收到ask不会更新hashslot本地缓存 高可用性与主备切换 1 判断节点宕机 如果一个节点认为另外一个节点宕机,那么就是pfail,主观宕机 如果多个节点都认为另外一个节点宕机了,那么就是fail,客观宕机,跟哨兵类似,sdown,odown 在cluster-node-timeout内,某个节点一直没有返回pong,那么就被认为pfail 如果一个节点认为某个节点pfail了,那么会在gossip ping消息中,ping给其他节点,如果超过半数的节点都认为pfail了,那么就会变成fail 2 从节点过滤 对宕机的master node,slave node中,选择一个切换成master node 检查每个slave node与master node断开连接的时间,如果超过了cluster-node-timeout * cluster-slave-validity-factor,那么就没有资格切换成master 3 从节点选举 哨兵:对所有从节点进行排序,slave priority,offset,run id 每个从节点,都根据自己对master复制数据的offset,来设置一个选举时间,offset越大(复制数据越多)的从节点,选举时间越靠前,优先进行选举 所有的master node开始slave选举投票,给要进行选举的slave进行投票,如果大部分master node(N/2 + 1)都投票给了某个从节点,那么选举通过,从节点可以切换成master