292024.04

包拯断案 | 数据库连接突然中断?别慌@还故障一个真相

2024.04.29

提问:作为DBA运维的你,是否有过这些烦恼

1、项目开发时,突然发现数据库高可用集群无法连接?
2、虽然数据库整体服务正常,但是应用连接的节点不可用,导致服务中断,不知是什么原因?


心中有章,遇事不慌

作为DBA的你,遇到问题无从下手,除了在问题面前徘徊,还能如何选择?如果你一次或多次遇到该问题还是无法解决,又很懊恼,该如何排忧呢?关注公众号,关注《包拯断案》专栏,让小编为你排忧解难


#包拯秘籍#

秘籍不能少,一整套故障排错及应对策略送给你,让你像包拯一样断案如神:

#首先

遇到此类问题后,我们要做到心中有章(章程),遇事不慌。一定要冷静,仔细了解故障现象(与研发/用户仔细沟通其反馈的问题,了解故障现象、操作流程、数据库架构等信息)

#其次

我们要根据故障现象进行初步分析。心中要想:是什么情况导致数据库连接突然中断?例如:是节点连接出现错误,还是高可用集群有了故障?

#然后

针对上述思考,我们需要逐步验证并排除,确定问题排查方向。

#接着

确定了问题方向,进行具体分析。通过现象得出部分结论,通过部分结论继续排查并论证。

#最后

针对问题有了具体分析后,再进行线下复现,最终梳理故障报告。


真刀实战,我们能赢

说了这么多理论,想必实战更让你心动。那我们就拿一个真实项目案例进行分析---某运营商客户业务系统测试环境下,项目开发人员某日早上发现GreatDB数据库高可用集群无法连接,该如何快速分析处理:


1、故障发生场景

在项目现场兢兢业业进行项目开发的你,正在为某个客户部署安全数据库GreatDB数据库集群,却在应用测试阶段,发现GreatDB高可用集群无法连接,对现场情况和原因不太清楚。


2、故障排查

通过SSH工具远程登录shell,查看数据库集群所有服务状态,如下:

序号

主机IP

进程

端口

状态

备注

 

1

 

192.*.*.1

zookeeper

13317

正常


GreatDBRouter

3307

异常

进程不在,端口无法访问

GreatDB

3306

正常


 

2

 

192.*.*.2

zookeeper

13317

正常


GreatDBRouter

3307

正常


GreatDB

3306

正常


 

3

 

192.*.*.3

zookeeper

13317

正常


GreatDBRouter

3307

正常


GreatDB

3306

正常



项目开发人员连接192.*.*.1节点3307端口,该端口对应的router进程异常,导致该IP无法提供数据库服务。虽然数据库整体服务正常,但是应用连接的节点不可用,导致服务中断


3、故障分析0

1)获取错误日志

从主机192.*.*.1的/greatdb/routerdata/logs获取router日志

2)分析错误日志

查看错误日志,发现router服务每5分钟重启一次

1.png


3)查询router服务重启原因

主机192.*.*.1节点的dbscale_daemon.py程序,调用GreatDB命令检测router状态,代码如下:

2.png


查看dbscale_daemon.py脚本内容

3.png


脚本中直接调用GreatDB命令,而GreatDB命令不在PATH环境变量中,无法直接执行

4.png


由于GreatDB命令无法直接执行,192.*.*.1节点的dbscale_daemon.py程序返回状态错误,误认为router不在线,因此自动执行重启router。

5.png


4)查看其他两个节点的router状态

6.png

由于192.*.*.1节点与其他节点启动router的方式不一样,导致进程也不一致。


4、故障处理

遇到这类故障,小编给大家提供2种解决思路:一种是遇到故障后的紧急处理方案,可以让节点实现快速连接,解决当下燃眉之急。但从长远看,大家更需要常规处理方案,从根源上解决故障问题发生。


1)紧急处理方案

操作:使用dbscale-service.sh脚本重启router进程,优先恢复router服务。

问题分析:在诊断192.*.*.1节点router进程异常的情况下,我们发现问题的根源在于节点的启动方法不统一。其中一个是由【dbscale_daemon.py】启动的,而其他节点则使用【dbscale-service.sh】启动。

在这种情况下,由于缺乏对GreatDB客户端的正确安装,导致了dbscale_daemon.py每5分钟执行一次的GreatDB命令失败,从而误判了router进程的状态。结果是,router服务一直在不断重启。


方法总结:


1) 首先,我们需要在生产环境中,在部署数据库集群之前,进行系统环境和参数设置的检查。只有当所有的检查项都符合要求时,才能继续进行集群的部署。这个故障的发生属于手动部署操作失误的范畴。

2) 其次,为了避免类似问题的再次发生,在生产环境中,我们建议使用数据库运维管理平台GreatADM来部署数据库集群。通过使用GreatADM进行集群部署,我们可以遵循正式的流程,并在部署后进行必要的检查和验证,确保集群的正常运行。


2)常规处理方案及改进措施

常规处理方案:

1、192.*.*.1节点使用dbscale-service.sh脚本启动router服务

su - greatdb
cd /greatdb/routerdata/
./dbscale-service.sh start

2、安装GreatDB数据库客户端

3、添加主机PATH环境变量等


改进措施:


1、使用GreatADM数据库运维管理平台部署集群过程中,有依赖关系组件或其他功能模块的,务必检查上一步骤是否成功,确认成功后方可进行下一步操作;
2、数据库部署完成后,需经过可用性检查,再暴露数据库服务端口给应用开发商;
3、故障修复后,应及时记录故障原因并更新相关文档。




复盘总


遇到这种数据库连接中断的线上故障,紧急处理方案可以帮助大家暂时解决问题,只有常规处理方案才能从根源上解决故障问题发生。


紧急处理方案

更换启动router服务方式,采取通用dbscale-service.sh启动。

常规处理方案

1、安装GreatDB数据库客户端;

2、添加主机PATH环境变量;

3、建议使用数据库运维管理工具GreatADM进行数据库集群部署管理,避免手动操作的失误隐患。