公司测试环境,使用两台服务器部署了mysql cluster。因为公司机房经常会断电,导致每次服务器重启后,都要手动重启一遍各种服务器,否则无法进行测试,非常麻烦。所以结合之前在网上看到了监控脚本,整理了一个自动启动方案。目前测试还算正常。
mysql cluster的启动需要按照固定的顺序进行:管理节点->数据节点->sql节点,如果不按此顺序启动,可能会导致服务不正常。目前采用下面的方法实现各节点的自动启动:
服务器部署情况说明:
1. 202服务器部署管理节点、数据节点、SQL节点。
2. 204服务器部署数据节点、SQL节点。
自动启动方案:
#管理节点和SQL节点的启动放到rc.local中执行
#在/etc/rc.local中增加如下代码
/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
/usr/local/mysql/bin/mysqld_safe &
数据节点的启动需要等待管理节点启动后,才能进行。所以使用了监控脚本来控制数据节点的启动,管理节点监听1186端口,使用nc检测1186端口的状态,来判断管理节点是否已经启动成功。
监控脚本的代码如下所示:
#!/bin/bash
while :
do
#检测管理节点是否已经启动
nc -w 10 -z 192.168.1.202 1186 > /dev/null 2>&1
ndb_mgmd=`echo $?`
if [ $ndb_mgmd -eq 0 ];then
#管理节点启动的情况下,检测数据节点和sql节点。
#如果数据节点未启动,启动数据节点,并重启mysqld。否则不做任何操作。
ndbd_num=`ps -C ndbd --no-header | wc -l`
if [ $ndbd_num -eq 0 ];then
/usr/local/mysql/bin/ndbd
#sleep 20
service mysqld restart
fi
else
#管理节点未启动或管理节点挂掉的时候,关闭数据节点
ndbd_num=`ps -C ndbd --no-header | wc -l`
if [ $ndbd_num != 0 ];then
killall -s SIGKILL ndbd
fi
fi
sleep 5
done
将监控脚本的代码保存到/root/ndbd_mysql_check.sh中,同时在rc.local中添加代码,自动启动此脚本的执行。
在/etc/rc.local中加入下面代码,开机启动监控脚本
nohup sh /root/ndbd_mysql_check.sh &
PS:
测试中发现的问题:
1. 在数据节点刚刚启动时,可以连接数据库,但是进行查询操作时会报错:
ERROR 1296 (HY000): Got error 157 'Unknown error code' from NDBCLUSTER
等待几分钟之后,再次进行查询操作时,恢复正常。猜测可能是某些节点尚未完全启动导致。
2. 在进行多表联合查询时,还报了另一错误:
SQLSTATE[HY000]: General error: 1297 Got temporary error 20016 'Query aborted due to node failure' from NDBCLUSTER
重启了204的数据节点和SQL节点后,恢复正常。
之前测试时一直只启动了204的NDB和SQL,而没有启动202的NDB和SQL,怀疑是不是两台服务器数据不同步导致。没有深入跟踪。
目前先记录到这里,以后遇到问题,再回来更新。