Halo Tech

备库崩了主库坐牢?——HaloDB哨兵:您的流复制专属“守护神”,让主库永远血脉偾张!

一、序幕

(电话接通,背景音略显嘈杂)

    张总:辉仔!你们系统怎么回事?从下午三点开始订单提交就转圈,欧洲客户那边现在正是工作时间,投诉电话都打到我这里了!

    辉仔:张总您好,非常抱歉给您添麻烦了。我们刚刚定位到问题,是数据库集群中一个备库实例发生磁盘故障,导致同步链路中断。

    张总:备库坏了怎么会影响到主库?这架构设计不合理啊!

    辉仔:您说得对。我们当前采用的一主二备同步复制架构,要求主库写入必须同步到所有备库才能提交。一旦某个备库故障,主库写操作就会因为无法完成同步而阻塞,这会直接影响业务系统的可用性和写入性能。

    张总:那现在数据是不是出问题了?后续恢复要多久?

    辉仔:由于同步中断,故障期间确实可能出现数据不一致的情况。我们正在紧急处理,预计需要2小时修复故障并重新同步数据,这确实增加了系统的恢复复杂度。

    张总:这个问题必须彻底解决,不能每次都这样手动处理!

    辉仔:是的张总,我们正在深刻反思。为了解决这个问题,我们想申请启用HaloDB的新功能——流复制自保护(哨兵)。这个哨兵功能可以实时监控备库状态,在备库故障时自动介入,既能保证主库继续服务,又能在备库恢复后自动完成数据同步。

    张总:这个方案能彻底解决问题吗?需要多久上线?

    辉仔:流复制自保护(哨兵)功能可以自动处理这类故障,实现故障自动转移和数据最终一致性。如果获得批准,我们可以在本周内完成部署和测试。

    张总:好,明天上午我要看到详细实施方案和影响评估报告。这次一定要彻底解决!

    辉仔:明白!我们今晚就准备方案,明天一早向您汇报。再次为这次故障表示歉意。

(电话挂断,辉仔立即开始准备方案文档)

二、正章-介绍 

(辉仔写完了方案文档,张总看完文档后,开始了和辉仔聊起了新功能的特点)

    张总:辉仔啊,这个流复制自保护(哨兵)功能有哪些优点啊?

    辉仔:说起HaloDB的流复制自保护(哨兵)功能,可真解决了我们运维人员的难处,它有以下优点:

    1、自动故障隔离:同步备库异常时,自动隔离故障备库,保障集群可以正常对外提供服务,业务应用正常。

    2、故障隔离无延时:实时监测备库状态,备库故障时实时介入。

    3、资源占用率低:仅需一个进程即可支持所有备库,功能开启后,占用系统资源极低的消耗。

    4、多场景灵活部署:支持分组复制(MGR)、Clustermgr等复杂架构,适应多节点高可用部署。

    5、运维简单便捷:仅需要参数文件配置即可,功能易于维护。

  6、同时也解决了备库宕机后,数据不一致的问题。

    张总:这个功能这么好用,那我们就部署起来体验下吧!

  (辉仔和张总一起准备部署了)

三、正章-部署

    (在张总的监督下,辉仔开始了部署的过程)

   辉仔:张总,这个功能只需要在配置文件里新增参数enable_synchronous_guardian开启。然后重新加载下,参数就生效了,来看下主库进程就出现了哨兵保护进程和哨兵工作进程,您看。

Image

sentinel launcher是哨兵守护进程,sentinel w000是哨兵工作进程,我们现在连接到数据库内查看下参数吧!

Image

我们再来看看备库进程

Image

    张总:咦,这哨兵进程只显示在主库上。

    辉仔:是的,哨兵进程实时监控备库状态,备库出现故障会实时介入成为备库角色,保障主库能正常对外服务。到此整个部署完成。

    张总:部署就这么简单!那我们准备验证下这个功能吧。

四、正章-验证

序号

主机

作用
1

192.168.231.161

主库
2

192.168.231.162

备库1
3

192.168.231.163

备库2

(验证开始了,辉仔和张总在一主二备场景的验证模拟备库故障)

    辉仔:张总,我们来检查下主库的状态,它有这些进程。
Image

    辉仔:然后连接主库,主库里面的同步参数都配置正确的。

Image
Image

    辉仔:检查流复制状态,在pg_stat_replication中是否存在sentinel worker信息,检查完毕,没有问题。

Image

    辉仔:张总,我使用pgbench开始对主库进行混合业务测试,来模拟整个业务测试。在测试过程中,如果某一备库发生故障,主库的写操作将因无法完成同步而阻塞,导致事务无法正常提交,直接影响业务系统的可用性与写入性能。

    张总:好的,我很期待这个功能给我的惊喜。

Image

    辉仔:张总,我要关闭备库nac02模拟数据库备库故障。

    张总:好的,那我们继续。

    辉仔:这时候主库的流复制从之前三个变成了两个,nac02备库的流复制信息消失了,哨兵进程的状态从之前的potential变成了sync,接管了之前nac02库的角色。您看屏幕上的情况。

Image

    张总:真的,pgbench还在对主库做压测,集群还是健康运行状态。我们再手工验证下。

    辉仔:可以的,我手工插入一条记录,再查询pg_stat_replication中状态信息。

Image

    辉仔:张总,插入成功了,这时候pg_stat_replication里面是没有nac02备库的流复制的,pgbench压测还没有结束。

    张总:这个验证下来,在哨兵(Sentinel)功能启用后,即使系统要求RPO(恢复点目标)=0,当某单个备库发生故障时,数据库集群仍能持续对外提供正常的读写服务,保障业务的连续性和高可用性。哨兵系统能够自动进行故障检测与切换为故障节点的角色,从而避免单点故障对服务造成影响。

 五、终结

    辉仔:张总,您这个结论非常正确。这个功能实在太给力了。

    张总:Image