案例说明:
KingbaseES V8R6集群,备库作为repo-path节点,建立类型为‘cluster’模式的备份,在执行sys_backup.sh init时,出现“can not find primary node”故障。故障如下图所示:
适用版本:
KingbaseES V8R6
一、集群及备份配置
1、集群节点状态
[kingbase@node101 bin]$ ./repmgr cluster show
ID | Name | Role | Status | Upstream | Location | Priority | Timeline | LSN_Lag | Connection string
----+-------+---------+-----------+----------+----------+----------+----------+---------+---------------------------------------------------------------------------------------------------------------------------------------------------
1 | node1 | primary | * running | | default | 100 | 8 | | host=192.168.1.101 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=10 keepalives_interval=1 keepalives_count=3
2 | node2 | standby | running | node1 | default | 100 | 8 | 0 bytes | host=192.168.1.102 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=10 keepalives_interval=1 keepalives_count=3
2、备份配置文件
[kingbase@node102 bin]$ cat sys_backup.conf |grep -v ^#|grep -v ^$
_target_db_style="cluster"
_one_db_ip="192.168.1.101"
_repo_ip="192.168.1.102"
_stanza_name="kingbase"
_os_user_name="kingbase"
_repo_path="/home/kingbase/kbbr7_repo"
_repo_retention_full_count=5
_crond_full_days=7
_crond_diff_days=0
_crond_incr_days=1
_crond_full_hour=2
_crond_diff_hour=3
_crond_incr_hour=4
_band_width=0
_os_ip_cmd="/sbin/ip"
_os_rm_cmd="/bin/rm"
_os_sed_cmd="/bin/sed"
_os_grep_cmd="/bin/grep"
_single_data_dir="/data/kingbase/hac7/data"
_single_bin_dir="/home/kingbase/cluster/R6HA/ha7/kingbase/kingbase/bin"
_single_db_user="system"
_single_db_port="54321"
_use_scmd=off
_start_fast=y
_compress_type=none
_non_archived_space=1024
如下图所示:
二、问题分析
1、执行sys_backup.sh init故障
[kingbase@node102 bin]$ ./sys_backup.sh start
This bin_dir is :
# pre-condition: check the non-archived WAL files
ERROR: can not find primary node.
2、查看脚本调用过程(sh -x sys_backup.sh start)
如下图所示,在‘repmgr命令前的bin的目录为空,导致repmgr执行错误:
3、查看脚本调用bin目录变量赋值语句
如下图所示,在备份类型“${_target_db_style}”是’cluster‘时,bin目录路径的赋值是通过读取repmgr.conf配置文件的sys_bindir参数配置获取到。
4、查看脚本启动过程中'_bin_dir'变量赋值
Tips:
脚本'_bin_dir'变量值应该为集群节点bin目录,即sys_backup.sh脚本所在目录。
如下图所示,变量'_bin_dir'的变量值为空,导致可执行文件无法找到对应bin目录。
三、问题解决
1、查看主库repmgr.conf配置文件
如下图所示,主库repmgr.conf文件配置文件中sys_bindir的配置正确,只是'data_directory'多了一行,是在做data目录变更时,保留了原data目录的配置。
2、清理repmgr.conf多余的配置
如下图所示,尝试清理repmgr.conf中多余的’data_directory‘的配置信息。
3、查看脚本执行时变量值的获取
如下图所示,变量’_bin_dir',已经获取到正确的变量值。
4、执行sys_backup.sh init成功。
四、总结
本次备份出现的故障,是因为对集群的配置文件repmgr.conf手动修改后造成,在对配置文件修改之前可以通过cp实现文件的备份,修改参数配置后,尽量不要出现冗余的配置,以免脚本读取配置文件变量时出现误导。