数据库集群故障转移的目的是在主机节点意外宕机后,自动提升一个备机节点作为主机,以达到继续对外提供服务的目的。
1、主机节点故障
常见的主机故障场景包括:
- 电源失效(掉电)
- 意外关机
- 系统意外重启
- 系统崩溃(kernel panic)
- 网络中断
- 服务进程故障
tips:
为了避免集群服务异常,主机需要考虑如何处理自身的故障,在遇到掉电、关机、重启、系统崩溃故障时,故障恢复后,一般不会自启动数据库服务,避免此时因备机升主导致集群出现脑裂;
主机节点遇到网络中断时,需要考虑网络中断时间,备机节点在指定时间内检测不到主机心跳,便会提升自己,作为新主机继续提供服务,若此时原主机网络恢复,则会出现双主(脑裂),因此,主机节点需要在备机节点升主前主动停掉数据库服务,在实现上,可通过配置信任网关,在信任网关检测超时后自动停止数据库服务,超时时间小于备机心跳超时时间实现;
2、备机节点升主
备机节点升主一般会经过如下步骤
- 心跳检测超时(retry*delay)
- 停掉同故障主机的流复制连接(若有)
- 选举出新主机(多个备机会触发选举,单个备机直接win)
- 提升自己为主机(包括standby promote,load vip等)
tips:
为避免备机节点在提升为主节点过程中原主机服务恢复而出现集群脑裂,备机会尝试连接原主机并停掉原主机数据库服务;
记录一个遇到的坑点:
集群运行过程中,业务语句导致主机backend进程崩溃,此时主机进入恢复模式:
此时备机healthcheck超时,进入故障转移,备机升级为主机,此时原主机恢复完成,集群出现脑裂。
我们知道,备机在升级为主机过程中,会尝试停止原主机数据库,那为什么原主机数据库没能停掉呢?
但行好事,莫问前程