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的兼容性。

posted @ 2023-09-18 16:13  KINGBASE研究院  阅读(115)  评论(0编辑  收藏  举报