KingbaseES V8R6集群部署案例之---脚本部署节点环境检查故障
案例说明:
BMJ环境部署KingbaseES V8R6集群,环境检测失败,部署被中断,提示数据库服务端口被占用,但此节点并没有运行数据库服务,需要分析部署失败的原因。
适用版本:
KingbaseES V8R6
一、问题现象
在BMJ环境下,通过脚本部署KingbaseES V8R6集群,检测发现其中一个节点数据库服务端口被占用,检测失败,部署被终止,如下所示,在节点"192.168.1.202“,有"54321"端口被占用,导致部署环境检测失败。
[kingbase@node202 r6_install]$ sh cluster_install.sh
[CONFIG_CHECK] will deploy the cluster of DG
[CONFIG_CHECK] file format is correct ... OK
[CONFIG_CHECK] the number of license_num matches the length of all_ip or the number of license_num is 1 ... OK
[RUNNING] check if the host can be reached ...
[RUNNING] success connect to the target "192.168.1.202" ..... OK
[RUNNING] success connect to the target "192.168.1.201" ..... OK
[RUNNING] check the db is running or not...
[ERROR] the db on "192.168.1.202:54321" is running, please stop it first.
二、问题分析
集群在部署前会对集群节点系统环境进行检测,环境检测失败后,将中断部署;其中一个检测项,检测节点上是否存在数据库服务。如果已存在数据库服务,或者数据库服务端口被占用,则环境检测将失败。
1、检查失败节点数据库服务状态
如下所示,本节点是一台应用节点,只是连接数据库进行了业务访问,并没有运行数据库服务(无监听数据库端口54321的数据库服务进程)。
[root@node202 ~]# netstat -apn 2> /dev/null |grep -w "54321" |wc -l
1
[root@node202 ~]# netstat -antlp |grep 54321
tcp 0 0 192.168.1.202:9034 192.168.1.201:54321 ESTABLISHED 1539/./ksql
......
检测是否启动数据库服务:
如下所示,未检测到数据库服务进程:
[kingbase@node202 r6_install]$ ps -ef |grep -w "kingbase -D" |grep -v grep|wc -l
0
2、查看脚本检测机制
如下所示:
1)脚本通过netstat检测数据库服务端口,是否有数据库服务启动。
2)如果命令执行失败或访问数据库服务端口的进程数是0,部署环境检测成功。
3)非0,如果是BMJ环境,执行sys_ctl关闭数据库服务。
4)如果执行sys_ctl关闭数据库服务失败,部署环境检测失败。
do
db_running=`execute_command ${super_user} $ip "netstat -apn 2>/dev/null|grep -w \"${db_port}\"|wc -l"`
if [ $? -ne 0 -o "${db_running}"x != "0"x ]
## 语句执行失败或端口被进程占用
then
if [ $on_bmj -eq 1 ]
## 进一步判断是否是BMJ环境
then
execute_command ${execute_user} $ip "${sys_bindir}/sys_ctl -D ${data_directory} stop 2>/dev/null"
## 执行sys_ctl关闭数据库服务
else
should_exit=1
## 执行失败,则退出,检测失败。
echo "[ERROR] the db on \"${ip}:${db_port}\" is running, please stop it first."
fi
else
echo "[RUNNING] the db is not running on \"${ip}:${db_port}\" ..... OK"
fi
3、执行检测语句
如下图所示,此节点访问数据库端口的进程数非0,并没有运行数据库服务(监听数据库端口);由于此系统为BMJ环境,执行sys_ctl关闭数据库将失败,因此部署环境检测结果失败。
检测端口状态:
[root@node202 ~]# netstat -apn 2> /dev/null |grep -w "54321" |wc -l
1
[root@node202 ~]# netstat -antlp |grep 54321
tcp 0 0 192.168.1.202:9034 192.168.1.201:54321 ESTABLISHED 1539/./ksql
......
无数据库服务进程:
[kingbase@node202 r6_install]$ ps -ef |grep -w "kingbase -D" |grep -v grep|wc -l
0
三、问题解决
1、通用机环境
如以下所示,此节点没有运行数据库服务,但是访问了数据库服务,通过netstat检测有两个进程访问数据库服务端口。在检测语句里增加‘grep -i listen'过滤后(监听数据库服务的进程),统计结果将为0,可以通过脚本检测。
[kingbase@node103 bin]$ ./ksql -h 192.168.1.102 -U system test
ksql (V8.0)
Type "help" for help.
test=#
[kingbase@node103 ~]$ netstat -apn 2>/dev/null|grep -w 54321
tcp 0 0 192.168.1.103:10483 192.168.1.102:54321 TIME_WAIT -
tcp 0 0 192.168.1.103:10484 192.168.1.102:54321 ESTABLISHED 3720/./ksql
[kingbase@node103 ~]$ netstat -apn 2>/dev/null|grep -w 54321|wc -l
2
# 检测语句增加‘grep -i listen’
[kingbase@node103 ~]$ netstat -apn 2>/dev/null|grep -w 54321|grep -i listen|wc -l
0
如下图所示,增加对数据库端口监听进程的过滤:(可以修改脚本检测语句通过检测)
如下所示,修改后的检测语句:(在netstat后增加了'grep -i listen')
do
db_running=`execute_command ${super_user} $ip "netstat -apn 2>/dev/null|grep -w \"${db_port}\"|grep -i listen|wc -l"`
if [ $? -ne 0 -o "${db_running}"x != "0"x ]
then
if [ $on_bmj -eq 1 ]
then
execute_command ${execute_user} $ip "${sys_bindir}/sys_ctl -D ${data_directory} stop 2>/dev/null"
else
should_exit=1
echo "[ERROR] the db on \"${ip}:${db_port}\" is running, please stop it first."
fi
else
echo "[RUNNING] the db is not running on \"${ip}:${db_port}\" ..... OK"
fi
2、BMJ环境
由于BMJ环境下,脚本不允许被修改(脚本文件已经被hash认证,修改破坏认证校验),对于此种情况只能在业务访问数据库服务结束后部署,或选择另外部署环境相对干净的节点再部署。
四、总结
对于生产环境,在部署集群时,尽量选择独立的节点作为数据库服务器,不要和应用服务器昏庸,否则将影响集群正常部署;并且部署后业务负载和数据库服务负载叠加,影响业务访问数据库服务的性能。