全自动无损主备切换演练需数据库、中间件、监控与编排四层协同,确保零数据丢失、连接不中断、无人工干预;各层分别承担状态校验、流量重路由、闭环执行及多重护栏机制。

全自动无损的主备切换演练,核心是“零数据丢失 + 业务连接不中断 + 无需人工干预关键步骤”。它不是单纯靠数据库一条命令完成的,而是由数据库层、中间件层、监控层和编排层协同驱动的一体化流程。
数据库层:确保切换前提绝对可靠
这是全自动的基础。若主备延迟大、状态不一致或日志未确认接收,任何自动化都会导致数据丢失或失败。
- Oracle:主库SWITCHOVER_STATUS必须为
TO STANDBY或SESSIONS ACTIVE,备库必须为TO PRIMARY;启用SYNC传输模式,且v$archive_dest_status中STATUS=VALID、ERROR为空 - MySQL:建议开启
semisync replication,并配置rpl_semi_sync_master_wait_for_slave_count=1,确保至少一个备库确认接收才提交 - PostgreSQL:设置
synchronous_commit = remote_apply,同时用pg_stat_replication持续校验sync_state='sync'与replay_lsn追平 - 达梦:依赖
dmwatcher守护进程实时检测ARCHIVE_DEST同步状态,确保SEND与APPLY均无积压
中间件层:隐藏后端变化,实现连接无感
客户端永远只连一个入口,主备切换时这个入口自动指向新主库,应用完全无感知。
- 用ProxySQL或HAProxy做四层代理,配置健康检查(如检测
read_only=OFF、响应SELECT 1、复制延迟) - 代理后端节点按角色标签分组(如
role=primary),切换脚本仅需更新标签,代理自动重路由 - DNS层面配合短TTL(如30秒)+服务发现(Consul/etcd),避免客户端缓存旧IP
编排与执行层:脚本驱动,闭环验证
全自动≠一键点到底,而是每步可检查、可回退、有反馈。典型流程如下:
- 触发:由监控系统(如Zabbix/Prometheus)检测到预设条件(如主库不可达+备库延迟≤0),自动调用切换API或脚本
- 停写:通过代理临时拦截写请求,或向应用下发只读信号(如Redis发布
db:readonly:true) - 校验:脚本自动查主备GTID/LSN是否一致、Redo是否全部应用、备库
database_role已就绪 - 执行:调用数据库命令(如
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY),并捕获返回码与错误信息 - 生效:更新代理后端配置、刷新DNS缓存、通知应用层解除只读
- 自检:1分钟内自动执行一致性校验(如比对关键表checksum)、插入测试记录并查询回显
可观测与护栏机制:防止误切、越权切、重复切
全自动必须带“刹车”,否则一次误判可能引发雪崩。
- 前置护栏:检查当前是否在维护窗口、是否有长事务未提交、是否有备份任务正在运行
- 执行中护栏:切换命令超时(如Oracle 60秒未返回则中止)、新主库启动后5秒内未响应则回滚
- 后置护栏:切换后10分钟内禁止二次切换;若检测到双主(如两个节点
read_only=OFF),立即告警并冻结所有写入 - 所有操作日志、SQL语句、返回值、耗时统一接入ELK或Loki,支持回溯审计










