Redis 主从集群架构

单节点 redis 并发才能有上限,要进一步提高 redis 并发才能,就要建立主从集群,完成读写分离

Redis 主从、哨兵和分片集群

主从同步原理

Replicaition id:每台 master 机器都一个 repl_id,是数据集的表明,若 salve 的 repl_id 与 master 的一样,则表明它们属于同一个集群

offset:偏移量,表明 master 在 repl_backlong 的方位。而同步时 salve 也会保存一个 offset,若 master 的 offset 大于 salve 的 offset,则表明 salve 的数据落后于 master,需求进行更新

主从同步方式

全量同步

履行机遇

  1. salve 第一次衔接 master 时;
  2. slave 断开时刻太久,repl_backlog 中的 offset 已经被覆盖

履行进程

  1. salve 向 master 发送 offsetrepl_idmaster 判别该 repl_id 为空或与自己的不同,则进行全量同步
  2. master 调用 bgsave 指令异步生成 RDB 文件,一起把生成 RDB 文件进程中接收到指令写入 repl_baklog 缓冲区 中,
  3. master 生成完 RDB 文件后,把 RDB 文件和 repl_baklog 缓冲区中的指令同时发送给 salve;
  4. slave 根据指令和 RDB 文件进行数据同步即可;

Redis 主从、哨兵和分片集群

增量同步

履行机遇

  • salve 断开又康复,而且能在 repl_backlog 中找到 offset

履行进程

  1. salve 向 master 发送 offsetrepl_idmaster 判别该 repl_id 与自己的相同,则进行增量同步
  2. master 根据 salve 发送过来的 offset,读取 repl_backlog 坐落 offset 后的指令,发送给 salve;
  3. salve 根据接收的指令进行同步即可;

Redis 主从、哨兵和分片集群

差异

全量同步: master 履行 bgsave 指令,生成 RDB 文件发送给 slave,并将后续的指令存储在 repl_backlog 中,持续发送给 slave

增量同步: master 获取 slave 发送的 offset,将 repl_backlog 中 offset 之后的数据发送给 slave 进行同步

优化

  1. 运用无磁盘仿制,将数据流直接读入网络 IO 中;
  2. 恰当操控 Redis 内存的运用量,防止生成的 RDB 文件过大;
  3. 当 slave 宕机时,要尽快进行康复,防止进行全量仿制
  4. 能够运用 主-从-从 的链式形式,削减 master 的压力;

Redis 主从、哨兵和分片集群

Redis 岗兵

岗兵的三种效果

服务状况监控:sentinel 不断监控 Redis 集群中 master 和 salve 的状况;

主动毛病搬运:当 master 宕机后,sentinel 会在一切的 slave 中推举出一个 master,当宕机后的机器康复后,也以新挑选的 master 为主

告诉:sentinel 充任 Redis 的客户端服务发现来历,当集群发送毛病时,会把最新的消息发送到客户端

Redis 主从、哨兵和分片集群

服务状况监控

sentinel 基于心跳的机制来判别 master 或者 slave 是否正常工作,每隔1秒向集群中的每个实例发送 ping 指令

  • 若该实例没有在规则的时刻范围内得到 pong 呼应,则以为该机器 主观下线
  • 若超越指定数量(quorum)台 sentinel 没有在规则的时刻范围内得到该实例 pong 呼应,则以为该机器 客观下线,quorum 的值最好超越 sentinel 机器数的一半

主动毛病搬运

推举原则

  1. 判别 salve 和 master 断开时刻的长短,若超越 10 * down-after-milliseconds ,则该 slave 不会被推举为 master
  2. 判别 salve-priority 的巨细,最小则优先级越高,但该值为 0 却不会被选到;
  3. 判别 offset 的巨细,offset 值越大表明数据越新;
  4. 判别 salve 的 id 巨细,id 越小,节点的优先级越高;

推举进程

  1. 向某个推举为 master 的 salve 机器发送 salve of one
  2. 向一切的机器发送 salve of 新 master
  3. 最后更改宕机的 master 装备,添加 slave of 新master

Redis 主从、哨兵和分片集群

Redis 分片集群

主从和岗兵处理了高并发高可用的问题,但是有两个问题没有处理:

  1. 海量数据存储;
  2. 高并发写入;

分片集群的特征

  1. 具有多个 master,每个 master 能够存储不同的信息;
  2. 每个 master 具有多个 salve
  3. master 之间通过心跳来监控健康状况;
  4. 客户端能够访问任意节点,但最后都会被路由到正确的节点;

散列插槽

Redis 分片集群把每个 master 映射到不同的散列插槽中

会根据 key 的有用部分来核算插槽的方位,所以 key 不是跟节点绑定,而是跟插槽绑定

  1. 将 16384 个插槽分配到不同的实例上;
  2. 根据 key 的有用部分取 hash 值,对 16384 取余即可;
  3. 余数作为插槽,寻找查找对应的实例即可;
  4. 若有用部分的余数相同,则能够完成把同类的信息放到同一个 master 节点上;

Redis 主从、哨兵和分片集群