Redis的复制和哨兵

在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis 同理,提供了复制功能,实现了相同数据的多个 Redis 副本,复制功能是高可用 Redis 的基础

1. 配置

1.1 建立复制

参与复制的 Redis 实例划分为主节点(master)和从节点(slave),复制的数据流是单向的,只能由主节点复制到从节点。一般 master 以写为主,slave 以读为主。配置方式有以下三种(slaveof 配置都是在从节点发起的):

  • 在配置文件中添加 slaveof masterHost masterPort
  • redis-server 启动命令后面加上 --slaveof masterHost masterPort
  • 直接使用命令 slaveof masterHost masterPort

每个节点都能使用 info replication 命令查看复制的相关状态。

1.2 断开复制

slaveof no one	# 断开复制

slave 断开复制后不会删除原有数据,只是无法再获取原来 master 上的数据变化

slaveof newMasterHost newMasterPort	# 切换master

slave 切换 master 后,会删除原有数据

2. 拓扑结构

  • 一主一从
  • 一主多从
  • 树状主从结构

3. 原理

3.1 复制过程

  • 保存 master 信息

    执行 slaveof 后 slave 只保存 master 的地址信息便直接返回

  • 主从建立 socket 连接

    slave 内部通过每秒运行的定时任务维护复制相关逻辑,定时任务发现新的 master 后,会尝试与 master 建立网络连接

  • 发送 ping 命令

    连接建立成功后 slave 发送 ping 请求进行首次通信,以确保主从之间网络套接字是否可用及 master 当前是否可接受处理命令

  • 权限验证

    若 master 设置了 requirepass 参数,则需要密码验证,slave 必须配置 masterauth 参数保证与 master 相同的密码才能通过验证

  • 同步数据集

    Redis 2.8 版本之后,同步划分为两种情况:全量同步和部分同步

  • 命令持续复制

    master 把当前数据同步给 slave 后就完成了复制的建立流程,接下来 master 会持续地把写命令发送给 slave,保证主从数据一致性

3.2 数据同步

3.2.1 全量复制

一般用于初次复制场景,会把 master 全部数据一次性发送给 slave,数据量较大时会对主从节点和网络造成很大的开销

3.2.2 部分复制

用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当 slave 再次连上 master 后,若条件允许,master 会补发丢失数据给 slave

4. 哨兵

4.1 哨兵的引入

Redis 的主从复制模式中 slave 有两个作用:

  • 备份 master,以便在 master 出现故障时作为备用保证数据不丢失
  • 扩展 master 的读能力,以便支撑大并发量的读操作

但主从复制也存在以下问题:

  • 一旦 master 出现问题,需要手动将一个 slave 晋升为 master(包括修改应用方的 master 地址,命令其他 slave 复制新的 master)
  • master 的写能力受到单机的限制
  • master 的存储能力收到单机的限制

针对第一个问题,Redis 引入了哨兵(Sentinel)模式,哨兵模式能够后台监控 master 是否故障,若故障了根据投票数自动将 slave 转换为 master,至于第二、三个问题,属于 Redis 的分布式问题,由集群来解决,此处不赘述。

4.2 原理

哨兵模式包含若干个 Sentinel 节点和 Redis 数据节点(即 master 和 slave 节点),每个 Sentinel 会对数据节点和其余 Sentinel 进行监控,当它发现节点不可达时,会对节点做下线标识。若被标识的是 master,它会和其他 Sentinel 进行协商,大多数 Sentinel 都认为 master 不可达时,它们会选举出一个 Sentinel 完成自动故障转移的工作,同时将这个变化实时通知给 Redis 应用方

4.3 使用

为了便于说明,我们使用3个 Sentinel,1个 master,2个slave组成一个哨兵模式进行讲解

4.3.1 部署数据节点

这一步的操作跟主从复制操作一致,启动一个 master 和两个 slave

4.3.2 部署Sentinel节点

  1. sentinel.conf配置文件
port 26379
dir 工作路径

# 监控127.0.0.1:6379主节点(mymaster是别名),2表示判断主节点失败至少需要2个Sentinel节点同意
sentinel monitor mymaster 127.0.0.1 6379 2

# 30000为超时时间,超过这个时间表示不可达
sentinel down-after-milliseconds mymaster 30000

# 一次故障转移之后,每次向新的master发起复制操作的slave个数为1
sentinel parallel-syncs mymaster 1

# 故障转移的超时时间为18000
sentinel failover-timeout mymaster 18000

# 设置master和slaves验证密码
sentinel auth-pass mymaster 123456
  1. 启动Sentinel节点
redis-sentinel  /配置文件所在目录/sentinel.conf
posted @ 2021-10-19 21:42  落单  阅读(55)  评论(0编辑  收藏  举报