文章目录
主从复制
设置主从服务器
使用 slaveof ip port 命令,将本服务器设置为参数对应服务器的从服务器。
步骤如下:
- 设置主服务器的地址和端口,首先将主服务器的IP和端口保存到服务器状态的masterhost和masterport
- 建立套接字连接
- 发送ping命令
- 身份验证
- 发送端口信息
- 同步
- 命令传播
旧版复制功能的实现
同步的步骤如下。旧版中,如果从服务器断线,重连时,也会进行完整的同步操作,效率很低。
新版复制功能的实现
从 Redis2.8 开始,使用 psync 命令代替 sync 命令进行同步。
psync 命令具有完整重同步和部分重同步。以下情况使用完整重同步:
- 第一次执行复制
- 服务器运行id(runid) 不同。说明服务器断线之前复制的主服务器并不是当前链接的这个主服务器,需要完整重同步。
- offset 偏移量之后的数据,已经不存在于复制积压缓冲区中。复制积压缓冲区中会保存着一部分最近的命令,如果没有对应的指令数据,就需要进行完整重同步。
心跳检测
在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令:
replconf ack <replication_offset>
有三个作用
- 检测主从服务器的网络链接状态。
- 辅助实现 min-slaves 选项。
- 检测命令丢失。replication_offset 为从服务器的复制偏移量,如果有指令丢失,就会及时发现,从复制积压缓冲区里面拿出相应的指令,将命令传播给从服务器。
重点回顾
哨兵(Sentinel)
哨兵是 Redis 的高可用性解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及主服务器下属的从服务器。当主服务器下线后,会自动在从服务器中找一台作为主服务器。
启动并初始化 Sentinel
启动一个 Sentinel 可以使用命令:
$ redis-sentinel /path/to/your/sentinel.conf
命令执行时,包括下面几个步骤
- 初始化服务器。Sentinel 本质上是一个运行在特殊模式的 Redis 服务器,所以需要初始化一个 Redis 服务器。不同的是,不需要载入 RDB 或者 AOF 文件。同时,不使用键值修改、事务和脚本等命令。
- 将普通 Redis 服务器使用的代码替换成 Sentinel 专用代码。比如端口常量、指令表等。Sentinel 只能执行下面七个命令:
- 初始化 Sentinel 状态。
- 根据给定的配置文件,初始化 Sentinel 的监视主服务器列表。
- 创建连向主服务器的连接。有两个链接:
5.1) 命令链接。向主服务器发送命令,并接受命令回复
5.2) 订阅链接。专门用来订阅主服务器的 sentinel:hello 频道。避免向 Sentinel 发送信息时,Sentinel 没收到。
获取主服务器信息
Sentinel 默认每十秒向被监视的主服务器发送 info 命令,并通过分析回复,来获取主服务器的当前信息。
- 主服务器背身的信息,包括 run_id(服务器运行 ID)以及 role(服务器角色)
- 主服务器下属的所有从服务器信息。一 slave 字符串开头,包括 ip、port、state、offset、lag等信息。
获取从服务器信息
Sentinel 和从服务器也会简历命令连接和订阅连接。
向主服务器和从服务器发送信息
接收来自主服务器和从服务器的频道信息
当 Sentinel 通过频道信息发现一个新的 Sentinel 时,不仅会修改自己的结构,还会创建一个连向新 Sentinel 的命令连接。
Sentinel 之间不会创建订阅连接
下线处理
检测下线状态
主观下线
默认情况下,每个 Sentinel 都会以每秒一次的频率向所有与他建立了命令连接的实例(包括主服务器、从服务器、其他 Sentinel 在内)发送 PING 命令,并通过命令回复是否来判断实例是否在线。
- 有效回复:实例返回 +PONG、-LOADING、-MASTERDOWN 三种回复的一种
- 无效回复:实例返回 +PONG、-LOADING、-MASTERDOWN 三种回复之外的其他回复,或者没有回复
当连续收到无效回复 down-after-milliseconds 毫秒后,Sentinel 就会认为这个实例主观下线。down-after-milliseconds 可以配置:
sentinel monitor master 127.0.0.1 6379 2
sentinel down-after-milliseconds master 50000 // 50000毫秒是本 Sentinel 认定其他所有实例主观下线的时间
多个 Sentinel 设置的主观下线时长可能不同。
客观下线
当 Sentinel 认为一个主服务器主观下线后,为了确认这个主服务器是否真的下线了,会向同样监视这一主服务器的其他 Sentinel 进行询问,看他们是否也认为主服务器处于下线状态(主观下线或客观下线)。当 Sentinel 从其他 Sentinel 处接收到足够数量的已下线判断后,就会将主服务器判定为客观下线,开始进行故障转移。
sentinel monitor master 127.0.0.1 6379 2 // 表示只要有两台 Sentinel(包括自己)认为主服务器下线,本 Sentinel 就认为是客观下线
不同 Sentinel 判断客观下线的条件可能不同。
选举领头 Sentinel
选出新的主服务器
修改从服务器的复制目标
新的主服务器出现后,领头 Sentinel 会让已下线主服务器下属的从服务器去复制新的主服务器,可通过向从服务器发送命令 slaveof 实现。
将旧的主服务器变为从服务器
在 Sentinel 中将旧的主服务器设置为从服务器,当它重新上线时,让他成为新主服务器的从服务器。