KingbaseES 集群启停系列 01 -- sys_monitor.sh start启动动态库加载故障
案例说明:
生产环境,在KingbaseES V8R6集群部署了postgis后,执行‘sys_monitor.sh start’启动集群时,出现动态库加载错误,如下所示:
[kingbase@ecs-98no-0001 bin]$ ./sys_monitor.sh restart
awk: symbol lookup error: /home/kingbase/cluster/kingbase/lib/libreadline.so.7: undefined symbol: up
适用版本:
KingbaseES V8R6
操作系统:
Kylin V10 Server
问题解决思路:
- 手工启动集群节点数据库服务,判断集群管理及数据库服务是否正常。
- 执行'sh -x sys_monitor.sh start',检查集群启动过程,定位问题具体位置。
- 根据脚本定位位置后,具体分析对应的错误。
- 可以通过对比正常环境和异常环境的展现,进一步分析和定位问题。
- 根据具体的故障现象,采取对应的处理方案。
一、问题分析
1、手工启动主备节点数据库服务
通过手工执行sys_ctl启动主备节点数据库服务,数据库启动正常,集群状态正常。
2、分析sys_monitor.sh启动过程
集群通过sys_monitor.sh脚本直接启动集群管理及数据库服务,在通过sys_ctl分别启动主备节点数据库服务,集群启动正常,说明问题出现在sys_monitor.sh的脚本启动过程中。
执行'sh -x sys_monitor.sh start'查看脚本启动过程,如下所示,脚本启动过程中,出现awk加载动态库失败,导致集群启动退出:
.......
+ '[' 0x '!=' x ']'
+ '[' 0 -gt 0 ']'
+ Rocky_OS=0
++ dirname /etc/cron.d/KINGBASECRON
+ '[' '!' -d /etc/cron.d ']'
+ check_and_get_user
+ local file_name=sys_monitor.sh
+ file_name=sys_monitor.sh
+ local file_path=/home/kingbase/cluster/R6C8/HAC8/kingbase/bin/sys_monitor.sh
++ id -un
+ local current_user=kingbase
++ ls -l /home/kingbase/cluster/R6C8/HAC8/kingbase/bin/sys_monitor.sh
++ awk '{print $3}'
awk: symbol lookup error: /home/kingbase/cluster/kingbase/lib/libreadline.so.7: undefined symbol: up
+ local file_owner=kingbase
+ '[' kingbasex '!=' x ']'
......
+ exit 1
---如上所示,在启动脚本时,awk工具出现动态库加载错误。
3、查看系统awk的动态库加载
如下所示,系统正常的awk的动态库加载:
[kingbase@kysrv bin]$ ldd awk
linux-vdso.so.1 (0x00007ffe83db5000)
libsigsegv.so.2 => /usr/lib64/libsigsegv.so.2 (0x00007fc029019000)
libreadline.so.7 => /usr/lib64/libreadline.so.7 (0x00007fc028fca000)
libmpfr.so.4 => /usr/lib64/libmpfr.so.4 (0x00007fc028f65000)
libgmp.so.10 => /usr/lib64/libgmp.so.10 (0x00007fc028ee6000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007fc028ee1000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007fc028d5e000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007fc028ba4000)
libtinfo.so.6 => /usr/lib64/libtinfo.so.6 (0x00007fc028b74000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc0290ee000)
4、对比故障主机awk动态库加载(kingbase用户查看)
如下所示,和系统正常的awk动态库加载,libreadline.so.2加载了数据库软件所带的动态库文件,正常的动态库加载文件应该在/usr/lib64目录下。
[kingbase@ecs-98no-0001 bin]$ ldd awk
linux-vdso.so.1 (0x00007ffe83db5000)
libsigsegv.so.2 => /usr/lib64/libsigsegv.so.2 (0x00007fc029019000)
libreadline.so.7 => /home/kingbase/cluster/kingbase/lib/libreadline.so.7 (0x0000fffe55fd0000)
libmpfr.so.4 => /usr/lib64/libmpfr.so.4 (0x00007fc028f65000)
libgmp.so.10 => /usr/lib64/libgmp.so.10 (0x00007fc028ee6000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007fc028ee1000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007fc028d5e000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007fc028ba4000)
libtinfo.so.6 => /usr/lib64/libtinfo.so.6 (0x00007fc028b74000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc0290ee000)
5、检查系统kingbase用户LD_LIBRARY_PATH变量配置
如下所示,动态库文件加载路径,缺失'/usr/lib64'的路径,优先从数据库软件目录下访问库文件,导致awk调用了错误的动态库:
[kingbase@ecs-98no-0001 bin]$ cat ~/.bashrc
export LD_LIBRARY_PATH=/home/kingbase/cluster/kingbase/lib:/lib:/usr/lib:$LD_LIBRARY_PATH
二、问题解决
1、编辑kingbase用户LD_LIBRARY_PATH变量
export LD_LIBRARY_PATH=/usr/lib64:/home/kingbase/cluster/kingbase/lib:$LD_LIBRARY_PATH
Tips:
如果有LD_LIBRARY变量,需要在.bashrc或.bash_profile文件中将其注释。
2、应用变量配置
[kingbase@ecs-98no-0001 bin]$ source ~/.bashrc
3、重启集群
切换到kingbase用户后,重新执行sys_monitor.sh start启动集群,启动正常。
三、总结
对于集群或数据库启动,当出现动态库加载故障时,大多和用户 LD_LIBRARY_PATH变量的配置有关,在分析问题时,可以优先从 LD_LIBRARY_PATH配置来处理和解决问题。