Replies: 1 comment
-
所以处在db_repl_state:(db0:Error)状态的从库,大约每一分钟都会重置状态,将ERR状态重置为PIKA_REPL_SHOULD_META_SYNC,开始进行trysync。 如下从库日志:
如下从库连续info replication变化:
所以在两分钟之内,确认db_repl_state:(db0:Error),那么sentinel就可以直接进行slaveof force。 slave 节点执行 为了简化运维工作,与 @baixin01 沟通讨论后,在 codis 中增加以下代码逻辑,以简化运维人员工作: |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Pika 3.5.2 版本 Codis Sentinel 工作原理
pika 同样采用 codis 实现了集群功能,但是 Pika Codis 在解决 Failover 问题采用了不同的方案。Pika Codis 将 Sentinel 能力集成到了 codis-dashboard 中,当 codis-dashboard 发现 pika 节点异常后,会自动发起选举新主,将旧主降级为从节点,并将变更的 Group 信息持久化到 etcd 中,然后通知 codis-proxy 更新 Group 信息。
接下来重点介绍一下 codis-dashboard 中的 sentinel 模块是如何工作的。
codis-dashboard 启动时,会有两个协程用于周期性查询所有 pika server 的状态。CheckMastersAndSlavesState 会每 5 秒执行一次 info replication 命令,用于检查所有 GroupServer(即 pika server,包含 Master 和 Slave)的状态。CheckMastersAndSlavesState 发现有节点异常,会将该节点对应的 GroupServer 中的 State 状态设置为预离线(GroupServerStateSubjectiveOffline)状态。 CheckPreOffineMastersState 会每 1 秒执行执行一次 info replication 命令,针对所有 Group 的 Master 节点,并且 Master 处于异常状态(State异常状态有 GroupServerStateSubjectiveOffline 或 GroupServerStateOffline,GroupServerStateNormal 为正常状态)的节点再进行存活检测,如果再次检测 5 次,仍为异常状态,则将 GroupServer 的状态置为离线(GroupServerStateOffline)状态 。
经过多次 info 检查,确认 Group 的 Master 离线后,将会发起自动主从切换。选取新主的策略为优先选择状态正常,pika server 中 repl_offset (Master 节点取 master_repl_offset,Slave 节点取 slave_repl_offset)最大的作为新的 Master 节点。Codis 是如何区分主从节点的?在 Codis Group 中有个 GroupServer 数组,默认将第 0 个位置的 GroupServer 作为 Master 节点。Codis 主从切换是将新主与第 0 个位置的 GroupServer 进行替换,从而实现主从切换。
完成主从切换后,会将最新的 Group 视图持久化存储到 etcd 中,最后再通知所有 codis-proxy 组件。
如何解决主从切换后,旧主重新恢复服务,并将流程自动化
目前存在的主要问题是 旧节点恢复服务后主从关系有可能仍停留在以前的旧配置,没有更新成最新的配置。现在的解决方法是 需要运维人员手工操作,运维复杂,操作复杂(多个操作步骤),因此,运维人员希望可以将恢复流程自动化。
下面介绍一下如何在 codis-dashboard 中将故障恢复流程自动化。
根据 codis-dashboard 现有逻辑,新增一个CheckOfflineMastersAndSlavesState 协程,由该协程周期性(每2秒执行1次)检查所有已经客观下线节点的状态信息,流程如上图,向已客观下线的节点发送 info replication 命令,探测服务是否恢复。如果命令执行成功,则认为服务恢复。服务恢复后,先检查节点最新的 info replication 命令中记录的,与 codis-dashboard 记录的主从复制关系是否一致。如果不一致,就需要对该 GroupServer 执行 slaveof 命令,建立新的主从关系。新的主从关系建立后,更新 GroupServer 的 state 和 role (有可能是旧的Master节点,需要将其改为 Slave) ,然后持久化新的 Group 信息,并重置 codis-dashboard 的 Group 缓存信息,最后通知所有 codis-proxy 更新信息。
Beta Was this translation helpful? Give feedback.
All reactions