KingbaseES 集群部署系列 02 -- openEuler系统脚本部署故障
案例说明:
在openEuler系统下通过脚本方式部署KingbaseES V8R6集群,脚本执行过程中,加载vip失败。本次故障问题,主要是因为openEuler系统shell和部署脚本的兼容性引起。
适用版本:
KingbaseES V8R6
系统环境:
openEuler-22.03-LTS
一、问题现象
通过脚本方式部署KingbaseES V8R6集群,脚本执行过程,提示“ vip无法加载”,如下图所示:
二、问题分析
1、查看install.conf配置(vip相关配置)
[kingbase@node101 ~]$ cat install.conf |grep -v ^#|grep -v ^$
[install]
on_bmj=0
all_ip=(172.31.*.27 172.31.*.28 172.31.*.29)
.....
virtual_ip="172.31.*.121/24"
net_device=(ens33 ens33 ens33)
net_device_ip=(172.31.*.27 172.31.*.28 172.31.*.29)
ipaddr_path="/usr/sbin"
arping_path="/home/kingbase/cluster/kingbase/bin"
ping_path="/usr/bin"
.......
如上所示,和vip相关的配置正确。
2、查看故障日志
如下图所示,脚本执行过程中,在测试vip地址是否已被占用(ping)测试,返回的变量值为null。
[kingbase@localhost R6_cluster]$ sh -x cluster_install.sh
3、分析部署脚本引起'vip Cannot use'的原因
如下所示,脚本通过如下语句,判断vip地址是否被占用,当ping返回的结果非0,而且vip已经被加载,将提示 'vip Cannot use'错误。
if [ "$function_name"x == "install"x ]
then
vip_ping=`${ping_path}/ping $vip -c 3 2>/dev/null |grep -w "received" |awk '{print $4}'`
vip_exist=`${ipaddr_path}/ip addr |grep -w "$vip"|wc -l`
if [ "$vip_ping"x != "0"x -a "$vip_exist"x = "0"x ]
then
echo "$(date +"%Y-%m-%d %T") [ERROR] [Virtual IP] $virtual_ip Cannot use"
exit 1
else
echo "$(date +"%Y-%m-%d %T") [INFO] [Virtual IP] $virtual_ip OK"
fi
fi
fi
else
4、执行ping测试
1)CentOS系统测试
如下所示,对ip地址执行ping测试,已被占用并可ping通ip返回结果非0,未被使用的ip,无法ping通返回0。
根据脚本语句执行测试:
[kingbase@node201 ~]$ ping 192.168.1.202 -c 3 2>/dev/null |grep -w "received"|awk '{print $4}'
3
[kingbase@node201 ~]$ ping 192.168.1.203 -c 3 2>/dev/null |grep -w "received"|awk '{print $4}'
0
2)openEuler系统测试
如下所示,在openEuler相同的语句测试,ping不通的ip返回null。
[kingbase@localhost R6_cluster]$ ping 172.31.254.121 -c 3 2>/dev/null |grep -w "received"|awk '{print $4}'
[kingbase@localhost R6_cluster]$
如下所示,openEuler系统执行ping测试后返回的提示为中文“已接收”,而脚本是通过英文“received”过滤,因此返回null。
[kingbase@localhost R6_cluster]$ ping 172.31.254.121 -c 3
PING 172.31.254.121 (172.31.254.121) 56(84) bytes of data.
--- 172.31.254.121 ping 统计 ---
发送3个包,已接收0个包, 100% packet loss, time 2000ms
经过多次测试,需要将ping语句改为如下:(返回0)
[kingbase@localhost R6_cluster]$ ping 172.31.254.121 -c 3 |grep "接收" |awk '{print $5}'
0
三、问题解决
1、修改部署脚本判断vip是否被占用ping语句,如下所示:
if [ "$function_name"x == "install"x ]
then
# 根据系统测试修改ping语句如下:
vip_ping=`${ping_path}/ping $vip -c 3 |grep "接收" |awk '{print $5}'`
vip_exist=`${ipaddr_path}/ip addr |grep -w "$vip"|wc -l`
if [ "$vip_ping"x != "0"x -a "$vip_exist"x = "0"x ]
then
echo "$(date +"%Y-%m-%d %T") [ERROR] [Virtual IP] $virtual_ip Cannot use"
exit 1
else
echo "$(date +"%Y-%m-%d %T") [INFO] [Virtual IP] $virtual_ip OK"
fi
fi
fi
else
2、执行部署脚本,部署成功。
四、问题总结
此次部署问题,是由openEuler系统shell和脚本部分语句不兼容引起:
1、ping测试语句,系统提示为中文“已接收”,脚本语句通过英文单词'received'执行过滤,过滤失败。
2、grep中‘-w’参数,中文支持问题。-w,按照单词过滤,在系统提示‘已接收’,用-w ‘接收’无法过滤。
3、2>/dev/null,对于语句执行错误的提示写入到/dev/null,对于CentOS系统,能返回ping结果,但是openEuler将不再返回ping结果。
在一些比较特殊的操作系统,通过脚本部署时,要注意检查系统shell的兼容性。