redis常见模式

109 阅读5分钟

redis常见模式

1.主从复制

目的:

主服务器做读写操作, 从服务器只做读操作.缓解单个服务器的压力. 即使主服务器挂了, redis服务也能继续工作.一主多从或者级联结构

同步类型:

分为全量同步和部分同步

同步过程:

从服务器连接主服务器,发送sync命令, 主服务器收到sync命令后,使用bgsave生成rdb快照文件, 在生成期间将产生的写操作记录到缓冲区, 先将rdb文件发送到所有的从服务器,并在发送期间记录写命令, 从服务器收到快照文件后,删除旧数据,载入快照数据,主服务器快照文件发送完毕后, 会将缓冲区的写命令也发送到从服务器.从服务器将快照数据载入完成后, 开始接收执行缓冲区存储的命令.

主从同步特点:

一主多从, 从服务器也能作为其他从服务器的主服务器.从服务器复制期间不阻塞主服务器的读写操作,也不能阻塞自己的查询操作,使用的是旧数据. 复制完成后删除旧数据加载新数据,这期间会停止对外服务.从服务器是为了进行横向扩容,做读写分离,提高读操作的吞吐率

优点:

解决数据备份,读写分离,提高服务器性能.

缺点:

  • 每个客户端连接redis实例时通过ip和端口进行连接, 如果服务器因故下线, 没有手段可以通知到客户端, 需要人工介入手动更改客户端配置重新连接
  • 主从模式下,主服务器故障下线后, 主从同步停止,需要人工进行故障转移工作.
  • 无法动态扩容

2.哨兵模式

哨兵模式是一个分布式系统, 可以运行多个哨兵进程, 这些进程使用流言协议来接收关于主服务器是否下线的消息, 并用投票协议来决定是否执行自动故障转移,以及选择从服务器作为新的主服务器.

哨兵是一个独立的进程, 实际上是一个运行在特殊模式下的一个redis服务器,独立运行. 哨兵与服务器之间会创建两个连接, 命令连接和订阅连接.哨兵和哨兵之间只会创建命令连接.哨兵向服务器发送命令等待redis服务器响应,从而监控运行中的redis服务器

  • 监控:通过发送命令,不间断的监控redis服务器的状态
  • 提醒:当被监控的服务器出现问题, 哨兵可以通过api向管理员或者其他应用程序发送通知
  • 故障转移:哨兵监控到主服务器宕机,会从该主服务器从属的从服务器中选择一个作为新的主服务器, 然后通过发布订阅模式通知其他从服务器, 修改配置, 切换主机

故障转移主流程:

  • 每个哨兵以1s一次频率向所有的服务器发送ping命令, 做心跳检测, 判断服务器是否可用, 标记为主观下线
  • 当主观下线的服务器是主服务器时, 会通过sentinel is-master-down-by-addr 命令向其他哨兵询问该服务器是否下线, 同时要求将自己设置为领导者.
  • 如果超过半数的哨兵都反馈该服务器已主观下线, 标记该服务器为客观下线
  • redis使用raft算法实现领导哨兵的选举.接收到is-master-down-by-addr命令时, 如果未同意过其他哨兵的投票,则同意该哨兵, 否则就拒绝掉,
  • 如果该哨兵发现自己的得票超过半数的哨兵, 则该哨兵被选为新的领导者. 如果此过程没有选出领导者, 那么则等待下一轮.
  • 过滤掉不健康的从节点, 主观下线,短线, 5s内未回复过哨兵的节点, 与主节点失联超过down-after-milliseconds*10秒。选择优先级最高的节点, 优先级相同的情况下选择复制偏移量最大的从节点, 如果偏移量相同, 选择runid最小的从节点
  • 哨兵领导者会从选择的从节点中让其成为主节点, 通知其他从服务器让他们成为新的主节点的从节点,将原主节点更新会从节点, 待其恢复后命令其复制新的主节点.

三个定时任务:

  1. 哨兵通过10秒一次的频率向监控的主服务器发送info命令.获取master信息, 发现从服务器和确定主从关系
  2. 以1秒一次的频率左右redis服务器(包含其他哨兵),发送ping命令.判断服务器是否在线.
  3. 以2秒一次的频率向master节点的channel交换信息

优点:

拥有主从的所有优点, 而且主从自动切换,健壮性更高, 可用性更高 服务器出现故障可以及时通知管理员或者其他应用程序

缺点:

redis较难支持在线扩容,对于集群, 容量达到上限时,在线扩容会变得比较复杂.

集群模式

高可用, 可扩展性, 容错, 分布式

hash slot的算法, 将16384个槽平均分配到每个master上.