目录
一、主从模式
即slave节点保存master数据副本,可以读写分离,从slave节点读,缓解了master的节点的读写压力
二、 哨兵
1. 基本过程:集群监控、消息通知,故障转移、配置中心
2. 具体过程: 多个sentinel节点监控master、slave节点,当一个sentinel节点发现master节点出现故障宕机时(主观下线),它就会去通知其他sentinel节点,当认为master节点故障的sentinel节点数大于quroum时(客观下线),sentinel发起领导者选举,选出一个sentinel节点进行去进行主从切换。
3. 优点:保证了一定的高可用性,当master宕机时,会有slave节点补上,选中的slave节点变成master节点,宕机的master节点变成slave节点
4. 问题:
- 主备切换的数据丢失问题:
min-slaves-to-write 1
min-slaves-max-lag 10
配置要求至少有一个slave节点,复制和同步master节点的数据延迟不超过10s。若所有slave,数据复制和同步超过10s, master节点就不会再接受任何请求。
- slave选择标准:
跟master断开连接的时长
slave优先级
复制offset
run id
三、集群(cluster)模式
集群主要基于分布式的思想了,维护多个master节点,一般在不同机器上,每个master节点保存一部分数据。
1. 一致性哈希->hash slot
CRC16(key)%16384,有16384个slot(槽),每个master节点会分配到一定数量的槽。
2. gossipe协议
meet:加入集群后,第一次与集群里的其他节点进行通讯,通知其它节点,该节点加入了集群。
ping:发送ping消息时,可以携带自身和其他节点的信息,会有一个cluster_node_timeout的时间,当超过cluster_node_timeout还没得到pong回应时,则会认为这个节点宕机,并且会通知其他节点。当半数以上的节点都认为其宕机,则该节点会客观下线。
pong:返回ping和meet,包含自己的状态和其他信息
fail:某个节点判断另一个节点fail后,就发送fail给其他节点,通知其他节点,指定的节点宕机啦!
3. ask、move重定向及smart client
当集群扩容或缩容的时候,就会有slot进行迁移。这时若有client进行请求,就会出现数据所在的slot不在当前访问节点上,因此要进行重定向。
ask:在slot迁移还未完成时
move:slot迁移已经完成
smart client:会在client本地缓存一个 hashslot->node映射表,当要查找某个数据时,通过CRC16(key)%16384得到slot位置,然后通过查询这个映射表,确定到去哪个node进行请求。当请求同时该节点有slot在迁移,若是正在迁移过程中,会返回ask,这时client不会更新映射表,而是再次到目标节点进行请求,直到迁移完成,节点返回move,此时更新映射表,并将到新的对应得node进行请求。