TxSQL部署于cpbd-ustr-core-nn01-200、cpbd-ustr-core-nn01-201、cpbd-ustr-core-nn01-202三台机器上且IP地址分别为 192.170.26.200, 192.170.26.201, 192.170.26.202。出现故障的节点为cpbd-ustr-core-nn01-200,我们要修复这个节点。以下描述中,我们同时用机器名来命名对应的机器上TxSQL pod的名称。
1、操作前检查cpbd-ustr-core-nn01-201、cpbd-ustr-core-nn01-202上的TxSQL处于启动状态且健康(多数派存活)。若未启动,请启动它们。若无法正常提供服务(manager界面显示它们不健康),则停止操作。
2、检查master信息和成员信息。进入TxSQL pod cpbd-ustr-core-nn01-201(或者cpbd-ustr-core-nn01-202)。cd /usr/bin/txsql/tools ,执行 ./txsql.sh list,你应该看到类似于以下的输出
[root@cpbd-ustr-core-nn01-201 ~]# cd /usr/bin/txsql/tools/
[root@cpbd-ustr-core-nn01-201 tools]# ./txsql.sh list
get master 192.170.26.202 expire time 1664173648 Mon Sep 26 14:27:28 2022
ip 192.170.26.201 port 17000
ip 192.170.26.202 port 17000
ip 192.170.26.200 port 17000
3、移除故障节点。执行 ./txsql.sh rm 192.170.26.200 从集群中移除 cpbd-ustr-core-nn01-200。这一步无论cpbd-ustr-core-nn01-200是否启动都可以执行。删除成功后请 list (第2步)加以确认。
[root@cpbd-ustr-core-nn01-201 tools] ./txsql.sh rm 192.170.26.200
get master 192.170.26.202 expire time XXXXXXXXXXXXX
Remove Member 192.170.26.200 done
[root@cpbd-ustr-core-nn01-201 tools] ./txsql.sh list
get master 192.170.26.202 expire time XXXXXXXXXXXXX
ip 192.170.26.201 port 17000
ip 192.170.26.202 port 17000
4、强制故障节点重新初始化
进入故障节点cpbd-ustr-core-nn01-200的pod,cd /usr/bin/txsql/etc/,编辑 install_conf.sh,确保cpbd-ustr-core-nn01-200的IP(即192.170.26.200)在 TxSQLNodes数组中不是第一个 (非常重要!)。如果是,可以把它与第二个交换位置。
TDH环境修改方式:
直接进故障节点的pod修改顺序
TDC环境修改方式:
kubectl -n ${namspace} get cm | grep txsql-confd-cnf 得到cmA
kubectl -n ${namspace} edit cm ${cmA},修改变量
install_conf.sh 的DATA_DIR变量记录了TxSQL数据目录的路径,需要手动删除该目录下的全部内容(但要保留这个目录),之后使用manager重新启动该pod,这会强制这个pod重新初始化。
5、备份数据。
进入192.170.26.200新启动的pod(!注意,必须在pod内部操作,以保证dump数据的兼容性,否则后期数据很可能无法导入),等待数据目录下(5.2.2之前的版本默认为 /vdir/hadoop/txsql/)出现 init_done.flag 文件(该文件的出现标志着初始化完成)。
使用下面的命令从一个健康的节点(比如192.170.26.202)备份数据。端口(-P13306)和密码(-p"123456")请根据具体情况修改,root密码存储在 /usr/bin/txsql/etc/db.properties中(5.6.47版本密码隐藏,命令行执行echo $TXSQL_DB_PASSWORD ,即可获得密码)
[root@cpbd-ustr-core-nn01-202 ~] cd /usr/bin/txsql/tools
[root@cpbd-ustr-core-nn01-202 tools] /usr/bin/txsql/percona.src/bin/mysqldump -h192.170.26.202 -P13306 -uroot -p"123456" --single-transaction --all-databases --triggers --routines --events >mydata.sql
5.1、待192.170.26.200的数据目录下出现init_done.flag后,编辑文件 /usr/bin/txsql/tools/txsql.sh,在函数restart_role的第一行添加 return 0,目的是禁止新pod自动重启服务。
以下是用vim编辑后的结果(行号可能与此不同)。
vim /usr/bin/txsql/tools/txsql.sh
# Helper for act_start
restart_role()
{
# 必须在本函数的一开始增加如下一行,其他的代码可能与此示例有差异,不用管
return 0
if [ $# -ne 1 ]; then
return 1
fi
if [ $OPT_FORCE = "N" ]; then
phx_is_role_running_by_name "$1"
[ $? -eq 0 ] && return 0
fi
# zqdai: change directory to tools to ensure the python scripts work as expected
local lPwd=$(pwd)
if [ -x "$PHX_HOME/tools" ]; then
cd "$PHX_HOME/tools"
python restart.py -p "$1"
cd "$lPwd"
else
return 1
fi
return 0
}
6、kill 192.170.26.200 pod上的phxbinlogsvr进程
在192.170.26.200 pod的目录 /usr/bin/txsql/tools 下执行 ./txsql.sh kill phxbinlogsvr 。请用 ps -ef 验证改进程已经被杀死。
[root@cpbd-ustr-core-nn01-200 /usr/bin/txsql/tools] ./txsql.sh kill phxbinlogsvr
7、把192.170.26.200添加回TxSQL的Paxos Group中。
回到192.170.26.202的pod,在 /usr/bin/txsql/tools 下执行 ./txsql.sh add 192.170.26.200把192.170.26.200添加到txsql的paxos group中。请务必./txsql.sh list确认该操作已经成功完成。要等待20秒验证,确认它没有自动重启。
[root@cpbd-ustr-core-nn01-202 /usr/bin/txsql/tools] ./txsql.sh add 192.170.26.200
get master 192.170.26.202 expire time XXXXXXXXXXXXX
Add Member 192.170.26.200 done
[root@cpbd-ustr-core-nn01-202 /usr/bin/txsql/tools] ./txsql.sh list
get master 192.170.26.202 expire time XXXXXXXXXXXXX
ip192.170.26.201 port 17000
ip 192.170.26.202 port 17000
ip 192.170.26.200 port 17000
8、向192.170.26.200中导入数据。
确认phxbinlogsvr已经自杀。
[root@cpbd-ustr-core-nn01-200 /usr/bin/txsql/tools] ps -ef | grep phxbinlogsvr
<不应该看到phxbinlogsvr进程>
导入数据,命令如下。注意mydata.sql是第5步dump出来的文件,该文件应放置在你执行"mysql -S XXXX"命令的当前目录下,示例中是在/usr/bin/txsql/tools下。
注意以下命令会导入数据两次,这是有必要的。实际上,第一次导入很可能会因为缺少用户而导致一些问题,因此需要导入两次。flush privileges 必须要先set sql_log_bin=0,否则会引起严重的错误。
[root@cpbd-ustr-core-nn01-200 /usr/bin/txsql/tools]
ps -ef|grep mysqld,根据进程信息找到--socket=xxxx/percona.sock
mysql -S xxxx/percona.sock
mysql> set global super_read_only=off;
mysql> set global read_only=off;
mysql> source mydata.sql;
mysql> set sql_log_bin=0;
mysql> flush privileges;
mysql> source mydata.sql;
mysql> reset slave;
如果操作出现任何问题或者错误,则必须到192.170.26.202的pod里上,从第3步重新开始整个修复过程。
9、重启phxbinlogsvr
恢复192.170.26.200上文件 /usr/bin/txsql/tools/txsql.sh的原有内容。即删除restart_role函数里新添加的第一行 return 0 语句即可。最多等待20s中后,phxbinlogsvr进程自动重启(一般会重启两次)。请用 ps -ef 验证。
特殊注意事项:在6.0之前的版本,phxbinlogsvr在负载较低的集群中此时可能会出现反复重启的情况,tools目录下每隔20s会产生一个core文件。这种情况下,需要到一个健康的pod上,向txsql中插入超过10MB的数据来解决。例如在本例中,可以在192.170.26.202上编写如下脚本:
load.sh
#!/bin/bash
# 这个脚本会插入10MB的数据,每次插入256字节,连续插入4w次,插入后删除。这是为了解决6.0之前一个bug导致phxbinlogsvr在低负载情况下反复重启的问题
#注意修改以下变量为与现场情况相符的值
master_ip='192.170.26.202 '
master_port='3316'
password='123456'
mysql -h$master_ip -P$master_port -uroot -p"$password" -e "create database if not exists d1"
mysql -h$master_ip -P$master_port -uroot -p"$password" -D d1 -e "create table if not exists t1(c1 text)"
i=0
while [ $i -lt 2 ]
do
mysql -h$master_ip -P$master_port -uroot -p"$password" -D d1 -e "insert into t1 values('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')"
i=$((i+1))
done
mysql -h$master_ip -P$master_port -uroot -p"$password" -D d1 -e "drop database d1"
执行这个脚本(bash load.sh),插入足够数据后,新的phxbinlogsvr会停止自动重启。
10、检查mysql的流水是否正常
在192.170.26.200 pod的目录 /usr/bin/txsql/tools 下执行 ./txsql.sh localshell ,然后执行 show slave status\G,检查流水状态是否正常(流水监控的方法),特别是Slave_IO_Running、Slave_SQL_Running必须处于Yes状态。
11、操作完成。检查新节点状态。manager中此时应显示3个节点均为健康状态。