GaussDB主备切换时间长问题分析

举报
GaussDB 数据库 发表于 2025/12/09 08:59:23 2025/12/09
【摘要】 问题描述客户反馈DN主备切换时间长,需要分析原因分析思路主备切换时间长,通常是因为各个别DN日志回放未完成导致,可根据日志实际进行分析。分析过程1.  查看cm_server主日志,确认cm_server下发升主命令的时间以及下发升主的DN。cd $GAUSSLOG/cm/cm_servervim cm_server-yyyy-mm-dd_******-current.log− 2025-0...
  • 问题描述

客户反馈DN主备切换时间长,需要分析原因

  • 分析思路

主备切换时间长,通常是因为各个别DN日志回放未完成导致,可根据日志实际进行分析。

  • 分析过程

1.  查看cm_server主日志,确认cm_server下发升主命令的时间以及下发升主的DN

cd $GAUSSLOG/cm/cm_server

vim cm_server-yyyy-mm-dd_******-current.log

 2025-06-20 09:31:13.416(cm_server日志时间差8小时)cm_server主收到上报的dn_6001(原主DN)状态异常,可搜索“ERROR”并根据时间点过滤。

5310.png

 2025-06-20 09:31:13.475(cm_server日志时间差8小时)cm_server主分别下发Lock1锁命令,对dn_6004,dn_6003,dn_6002进行加锁,可搜索“Lock1 message has sent to instance”关键词。

5311.png

2.查看dn_6002,dn_6003,dn_6004所在节点的cm_agent日志,确认是否收到cm_server下发的加锁命令。

cd $GAUSSLOG/cm/cm_agent

vim cm_agent-yyyy-mm-dd_******-current.log

− 2025-06-20 09:31:13.478 (cm_agent日志时间差8小时)cm_agentdn_6004加锁,但加锁失败,可搜索“set Lock1 to instance”关键词。

5321.png

 期间对dn_6003dn_6002也在加锁,也是加锁失败,可搜索“set Lock1 to instance”关键词。

5322.png

5323.png

3. cm_agent加锁失败,进一步查看DN日志,确认DN在执行什么操作。

cd $GAUSSLOG/gs_log/dn_6004

vim gaussdb-yyyy-mm-dd_******.log

查看dn_6004日志,2025-06-20 17:31:13.477 dn_6004未完成回放,可根据时间点搜索。

5331.png

dn_6002dn_6003在同一时间点也是未完成回放,此处省略截图。

4. 继续查看DN运行日志,确认dn_6002,dn_6003,dn_6004在什么时间完成回放。

cd $GAUSSLOG/gs_log/dn_6004

vim gaussdb-yyyy-mm-dd_******.log

2025-06-20 17:32:31.517dn_6004优先回放日志完成,可搜索“redo_done flag is:[true]”关键词。

5341.png

dn_6002dn_6003在同一时间点未完成回放,此处省略截图。

5. dn_6004优先完成回放,进一步查看cm_server主日志,确认是否下发升主命令以及下发时间。

cd $GAUSSLOG/cm/cm_server

vim cm_server-yyyy-mm-dd_******-current.log

2025-06-20 09:32:32.492(cm_server日志时间差8小时)cm_server主下发dn_6004升主命令,可搜索“Failover message has sent to instance”关键词。

5351.png

6. 查看dn_6004节点的cm_agent日志,确认是否收到dn_6004升主命令以及接收时间。

cd $GAUSSLOG/cm/cm_agent

vim cm_agent-yyyy-mm-dd_******-current.log

2025-06-20 09:32:32.492 (cm_agent日志时间差8小时)cm_agent接受cm_server下发的命令,对dn_6004执行升主操作,可搜索“failover msg from cm_server”关键词。

5361.png

7.查看dn_6004运行日志,确认是否开始升主以及时间点。

cd $GAUSSLOG/gs_log/dn_6004

vim gaussdb-yyyy-mm-dd_******.log

2025-06-20 17:32:32.529dn_6004开始升主,可搜索“Instance to do failover”关键词。

5371.png

8. 继续查看dn_6004运行日志,确认升主完成时间点。

cd $GAUSSLOG/gs_log/dn_6004

vim gaussdb-yyyy-mm-dd_******.log

2025-06-20 09:32:36.808dn_6004开始接受新的连接,可搜索“database system is ready to accept connections”关键词。

5381.png

9. 查看dn_6004所在节点的cm_agent日志,确认dn_6004解锁时间。

cd $GAUSSLOG/cm/cm_agent

vim cm_agent-yyyy-mm-dd_******-current.log

2025-06-20 09:32:39.510 (cm_agent日志时间差8小时)cm_agent解锁dn_6004成功,可搜索“process_unlock_no_primary_command succeed”关键词。

5391.png

  • 根本原因

综上分析,得出主备切换时间长的原因为:

dn_6001故障以后,dn_6002,dn_6003,dn_6004日志均与主机存在差距,cm_server分别给dn_6002,dn_6003,dn_6004发下锁DN命令,由于DN回放未完成因此支持锁DN失败,直到2025-06-20 17:32:31.517dn_6004优先回放完成,因此选择dn_6004升主。

dn_6004回放耗时:2025-06-20 09:31:13.478--2025-06-20 17:32:31.517,持续78s

dn_6004升主耗时:2025-06-20 09:32:32.492--2025-06-20 17:32:39.655,持续7s

因此,主备切换耗时长主要在于回放时间长,回放时间长是由于未开启流控,DN主备之间的RTO高。在升主时先要完成回放再执行升主操作。

  • 解决方案

开启流控:gs_guc reload -Z datanode -N all -I all -c "recovery_time_target=60"

  • 补充说明

流控原理说明:

在备机回放日志的能力跟不上主机时,通过在walsender线程中进行一定时间的sleep来降低日志发送速度,让备机来得及回放已接收的日志。也就是当备机接收日志或者回放日志的能力跟不上主机时,通过强制降低主机的业务性能,来保证主备机的日志差异在一定目标范围。

因此,开启流控,在主机业务压力过大时,会限制主机业务。

5392.png

流控为主机业务压力与RTO两者之间的综合选择,需要根据实际业务特点慎重配置。

GaussDB关键日志目录介绍:

l   GaussDB日志路径为$GAUSSLOG目录

l   CNDN运行日志路径:$GAUSSLOG/gs_log

l   cm_server运行日志:$GAUSSLOG/cm/cm_server

l   cm_agent运行日志:$GAUSSLOG/cm/cm_agent

l   升级、安装日志:$GAUSSLOG/om

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。