• Greenplum数据库故障分析——版本升级后gpstart -a为何返回失败


    案例背景

    现场项目进行Greenplum数据库小版本升级时,升级脚本报错,提示数据库启动失败。但是我们从跳板机进入数据库节点使用gpstart交互模式启动集群时,集群是能够启动的,standby master是不可用的。什么原因造成了使用gpstart -a启动失败,使用gpstart启动就能成功呢?作为团队入职两年的小开发一枚,秉承通过故障分析才能快速切入学习数据库路径的原则,接下了这个活,难免需要加个班处理一下。

    分析过程

    首先我们发现gpstart和gpstart -a除了交互外,会尝试对standby master进行启动,如果不能启动则跳过。我们的排除方向也应该是这边,首先复现场景后,使用gpstart -m只拉起master节点,utility模式登陆进master节点,执行select * from gp_segment_configuration where content = -1;查找master和standby master对应的记录。这里发现standby master在系统表中标记为正常,但是我们在standby master节点的gpseg-1目录下发现其数据文件并不是很全,比如就没有postgresql.conf。因此判定肯定是gpinitstandby脚本运行出错,查看日志如下所示:

    gpinitstandby:xxx:gpadmin-[ERROR]:-Error initializing standby master: Standby master not configured
    gpinitstandby:xxx:gpadmin-[ERROR]:-Request mode to remove warm master standby, but no standby located.
    gpinitstandby:xxx:gpadmin-[ERROR]:-Error removing standby master: no standby configured
    gpinitstandby:xxx:gpadmin-[INFO]:-Validating environment and parameters for standby initialization...
    gpinitstandby:xxx:gpadmin-[INFO]:-------------------------------------------
    gpinitstandby:xxx:gpadmin-[INFO]:Greenplum standby master initialization parameters
    gpinitstandby:xxx:gpadmin-[INFO]:-------------------------------------------
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum master hostname					= xxx
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum master data directory			= /home/gpadmin/data/master/default/gpseg-1
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum master port						= 5432
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum standby master hostname			= xxx
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum standby master port				= 5432
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum standby master data directory	= /home/gpadmin/data/master/default/gpseg-1
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum update system catalog			= On
    gpinitstandby:xxx:gpadmin-[INFO]:-Syncing Greenplum Database extensions to standby
    gpinitstandby:xxx:gpadmin-[INFO]:-The packages on xxx are consistent
    gpinitstandby:xxx:gpadmin-[INFO]:-Adding standby master to catalog...
    gpinitstandby:xxx:gpadmin-[INFO]:-Database catalog updated successfully.
    gpinitstandby:xxx:gpadmin-[INFO]:-Updating pg_hba.conf file...
    gpinitstandby:xxx:gpadmin-[INFO]:-pg_hba.conf files updated successfully.
    gpinitstandby:xxx:gpadmin-[ERROR]:-Failed to copy data directory from master to standby.
    gpinitstandby:xxx:gpadmin-[ERROR]:-Failed to create standby
    gpinitstandby:xxx:gpadmin-[WARNING]-Trying to rollback changes that have been made...
    gpinitstandby:xxx:gpadmin-[INFO]:-Rolling back catalog change...
    gpinitstandby:xxx:gpadmin-[ERROR]:-Failed to remove standby from master catalog.
    gpinitstandby:xxx:gpadmin-[INFO]:-Restoring pg_hba.conf file...
    gpinitstandby:xxx:gpadmin-[INFO]:-Cleaning up pg_hba.conf backup files...
    gpinitstandby:xxx:gpadmin-[INFO]:-Backup files of pg_hba.conf cleaned up successfully.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    从上面日志可以看出在升级前HA组件在修复standby master,gpinitstandby运行到从master数据目录拷贝数据到standby master时,升级脚本关闭了greenplum集群,导致的失败。由于greenplum集群关闭了,回滚gp_segment_configuration中的standby记录失败。因此使用gpstart -a启动时,脚本认为standby master是正常的,就尝试去启动,当然会失败啦。

    产生原因

    在升级前HA组件在修复standby master,gpinitstandby运行到从master数据目录拷贝数据到standby master时,升级脚本关闭了greenplum集群,导致的失败。由于greenplum集群关闭了,回滚gp_segment_configuration中的standby记录失败。

    解决方案

    考虑三种方案:

    1. gpstart -am启动master节点;执行PGOPTIONS="-c gp_session_role=utility" psql -d postgres -c "select gp_remove_master_standby()";执行gpstop -ar
    2. gpstart -am启动master节点;执行PGOPTIONS="-c gp_session_role=utility" psql -d postgres -c "set allow_system_table_modes=true; update gp_segment_configuration set status = 'd' where content = -1 an role = 'm'; ";执行gpstop -ar
    3. gpstart -aS。加上大写的S参数会直接跳过standby master启动
      采用第3中方案,升级后由HA来处理standby master的修复启动问题。
  • 相关阅读:
    【python】-- 面向初学者的程序设计练习题
    要点初见:切换老版本Rust并运行老版本cargo
    C++ 多线程学习12 线程池
    jdk对linux cgroup v2容器化环境识别情况
    后缀系列
    Android Service
    Python--- lstrip()--删除字符串两边的空白字符、rstrip()--删除字符串左边的空白字符、strip()--删除字符串右边的空白字符
    基于C++和QT开发的校园超市库存物资管理系统
    【Linux内核源码剖析】进程原理及系统调用
    吃透Chisel语言.21.Chisel时序电路(一)——Chisel寄存器(Register)详解
  • 原文地址:https://blog.csdn.net/asmartkiller/article/details/126072103