主从复制

实现读写分离,负载均衡,高可用、数据冗余等

主从复制的三个阶段

  • 建立连接:slave向master发起连接
  • 数据同步:master向slave同步数据
  • 命令传播:master后面收到的数据,也同步给slave, 这是一个反复过程。

建立连接

slave向master发起连接,master响应
slave保存master ip port, 并创建socket
master响应 -> 验证授权 -> 保存slave端口号

数据同步

  1. slave发送psync2指令发起同步
  2. master 执行bgsave,第一个slave连接时,会创建命令缓冲区
  3. master生成rdb文件后,通过socket发给salve
  4. slave接受RDB文件,清空数据,执行RDB文件恢复过程
  5. master发送缓冲区信息
  6. slave 执行bgrewriteaof, 恢复数据,

全量复制+多次增量复制

命令传播阶段

master状态被修改时,导致的主从数据不一致,需要主从状态同步到一致。

  • 复制缓冲区 + 偏移量offset

哨兵模式

redis-sentinel :对集群进行监控,出现故障时, 通过投票选举新的master将所有的slave连接到新的master

哨兵的工作原理

  • 监控

    • 获取各个Sentinel的状态,是否在线
    • 获取master的状态和属性
    • 获取所有slave的状态和属性
    • 各个sentinel之间形成一个小网络,互相发送消息
  • 通知

    sentinel获取到某个阶段的状态信息都会通知其他的sentinel

  • 故障转移

    1. sentinel向master发送指令,master没有响应,多次尝试未果,标记master为SRI_S_DOWN,主观下线
    2. 告诉其他sentinel, 其他sentinel也向这个master发送指令
    3. 一半以上的sentinel认为master挂了,标记SRI_O_DOWN,客观下线
    4. sentinel投票,选出一个新的master, 考虑因素包括在线的、响应快的、优先级等;
    5. 向新的master发送指令slaveof no one, 向其他slave发送slave 新master-ip 新master-port