• Redis高可用原理 主从哨兵集群



    Redis支持手动版的主从复制,使用哨兵模式监控Redis集群,master宕机自动进行主从切换,哨兵sentinel是独立的进程,为了高可用,哨兵也是采用集群方式,最新的redis-cluster是多个主从的无中心化集群,支持水平扩展,包含前两种方式的自动切换和主从复制功能,配置也更加简单。

    一、主从复制

    工作原理

    Slave启动成功连接到master后会发送一个sync命令
    
    Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
    
    全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
    
    增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
    
    但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    配置: slaveof host port

    二、哨兵

    https://blog.csdn.net/zhanghuiqi205/article/details/112169486

    配置

    sentinel monitor mymaster 192.168.14.101 6379 2 # 投票master宕机的数量
    
    • 1

    工作原理

    一、三个定时任务

    1、每个sentinel对master和slave执行info命令,第一个是用来发现slave节点,第二个是确定主从关系
    2、每个sentinel通过master的channel发布订阅交换节点信息和自身信息,判断主管下线还是客观下线
    3、每个sentinel对其他sentinel和redis执行ping命令,用于心跳检测,作为存活的依据
    
    • 1
    • 2
    • 3

    二、主管下线和客观下线

    主观下线:当前sentinel实例认为master服务不可用
    客观下线:多个sentinel实例认为master服务不可用,此时master变为主观下线状态
    
    • 1
    • 2

    三、故障转移

    故障转移是由 sentinel 领导者节点来完成的(只需要一个sentinel节点),关于 sentinel 领导者节点的选取也是每个 sentinel 向其他 sentinel 节点发送我要成为领导者的命令,超过半数sentinel 节点同意,并且也大于quorum ,那么他将成为领导者,如果有多个sentinel都成为了领导者,则会过段时间在进行选举

    故障转移步骤

    1、从slave结点选出合适的结点作为master节点
    	slave-priority越小优先级越高
    	复制偏移量offset越大优先级越高(数据越完整)
    	runId最小的slave结点(启动越早)
    2、对上面选出来的执行slaveof of no one
    3、像剩余结点发送命令,让他们成为新master的slave结点
    4、更新原来的master节点配置为slave节点,重新恢复去复制新master的节点信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    优缺点

    优点:主从复制的加强版,自动主从切换
    缺点:在线扩容比较麻烦;只有主节点提供服务,不太支持高并发
    
    • 1
    • 2

    总结

    sentinel集群是独立的线程,能够监控redis集群,发现master宕机后自动切换。
    
    • 1

    三、集群

    https://blog.csdn.net/xueguchen/article/details/109847085

    原理

    将所有数据分为16384个槽位slots,每个节点负责一部分槽位。槽位的信息存储于每个节点中。
    
    使用crc16算法进行hash并对16384取模得到具体槽位,客户端发送请求后可以缓存槽位信息。
    
    当节点发现槽位信息不归自己管理时,会发送跳转指令携带目标操作的节点地址,客户端跳转到正确的节点进行操作,并更新本地的槽位映射表。
    
    集群节点采用gossip协议进行通信
    goosip协议包含多种消息,包括ping,pong,meet,fail等
    优点在于元数据的更新比较分散,不是集中在一个地方,陆陆续续打到所有节点上,减少网络负担。(每次选择最久没通信的节点,携带少量的其他信息,因此有一定的交互延迟)
    meet:发送meet给新加入的节点,让新节点加入集群
    ping:互相ping交换自己的状态和维护的集群状态
    pong:对ping和meet消息的返回,包含自己的状态和信息,也可用于广播和更新
    fail:某节点发现其他节点宕机后,发送fail通知其他节点
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    JedisCluster客户端

    初始化的时候,随机选择一个node,初始化hashslot映射表,同时为每个节点创建一个JedisPolol连接池。每次基于JedisCluster操作,现在本地计算key的hashSlot并找到对应的节点。

  • 相关阅读:
    Python树莓派开发
    TypeScript - 枚举类型 -字符型枚举
    【JVM】为什么静态内部类实现单例模式是线程安全?
    Opentracing 代码Demo
    Spring之BeanFactory与ApplicationContext区别、实例化Bean的三种⽅式、延迟加载(lazy-Init )
    数字化管理门店| 甜品店管理系统
    看完这6款浏览器的对比,你还使用国产浏览器吗
    flink学习
    ZZNUOJ_用Java编写程序实现1585:super prime(附源码)
    雪花算法生成主键ID
  • 原文地址:https://blog.csdn.net/weixin_45950398/article/details/125899746