Gbase 8a 86版本节点替换
一. 节点替换适用场景
- 当某些服务器出现不可恢复的故障时,比如磁盘损坏,文件系统故障,且长时间不可修复时。
- 当某些服务器磁盘使用达到瓶颈,且无法通过加盘在线扩容,需要重新规划raid,重装系统时。
- 当某些服务器过于老旧,需要淘汰换新时。
二. 节点替换前信息收集
2.1 数据库版本信息
配置项 | 详细信息 | 查询命令 |
gbase集群版本 |
|
select @@version; |
安装包版本 |
|
|
2.2 节点服务器信息
| 主机名 | 节点IP | coor | data | OS |
节点1 | node101(需替换节点) | 172.16.9.101 | √ | √ | redhat 6.3 |
节点2 | node102 | 172.16.9.102 | √ | √ | redhat 6.3 |
节点3 | node103 | 172.16.9.103 | √ | √ | redhat 6.3 |
三.节点替换计划列表
序号 | 操作内容 | 预计耗时 |
一 | 前期准备工作 |
|
《1》 | 检查用户密码变更情况 |
|
《2》 | 检查被替换节点元数据信息 |
|
《3》 | 检查ssh参数 |
|
《4》 | 备份gc节点和gn节点参数信息 |
|
《5》 | 备份定时任务 |
|
二 | 节点替换过程 |
|
《1》 | 将节点设置为unavailable状态 |
|
《2》 | 更换磁盘,重新安装操作系统 |
|
《3》 | 服务器硬件性能测试 |
|
《4》 | 节点替换 |
|
《5》 | 数据同步过程 |
|
三 | 替换后集群状态检查 |
|
《1》 | 对比参数是否一致 |
|
《2》 | 检查集群状态(gcadmin,ddlevent,dmlevent,dmlstorageevent) |
|
四 | 节点替换异常记录 |
|
《1》 | 执行替换命令后长时间无响应 |
|
《2》 | Function gbase.tablenamefilename does not exist |
|
《3》 | 替换节点仍有gbase和gcware等残留服务运行时 |
|
四. 节点替换前环境检查
4.1 检查用户密码变更情况(所有节点都检查执行)
# 检查gbase用户密码是否过期和修改过,如修改过重置为初次安装时
change -l gbase
# 查看gbase用户的安装初始密码
su - gbase
cat /home/gbase/.gbase_profile | grep SSH_GBASE_PASSWD
python
import base64
base64.b16decode('63646F6D732E32303230');
exit();
4.2 检查是否有GsSYS引擎的日志表,清理所有节点日志,避免耗时过长(所有节点都检查执行,如果不大可以保留)
su - gbase
# 根据表的行数和元数据文件大小来判断是否需要删除
gccli -uroot
select TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS from information_schema.tables where engine='GsSYS' order by table_rows desc ;
du -sh /opt/gcluster/userdata/gcluster/gbase/
du -sh /opt/gnode/userdata/gbase/gbase/
# 如果有过大的表删除即可
truncate self table gbase.audit_log
truncate self table gbase.general_log

4.3 检查ssh参数(所有节点都检查执行)
# sshd的超时参数要确认足够长。避免ClientAliveInterval 参数太小
cat /etc/ssh/sshd_config | grep ClientAliveInterval
# sshd的默认连接数要足够。默认的10个太少了,建议修改100个以上
cat /etc/ssh/sshd_config | grep MaxSessions
4.4 备份gc节点和gn节点参数信息(替换节点执行,本文档介绍替换101节点)
su - gbase
mkdir -p /home/gbase/101
mkdir -p /home/gbase/101/gcluster
mkdir -p /home/gbase/101/gnode
gccli -uroot -e "show variables" > /home/gbase/101/gc_variables.log
gncli -uroot -e "show variables" > /home/gbase/101/gn_variables.log
cp -r /db/gcluster/config /home/gbase/101/gcluster
cp -r /db/gnode/config /home/gbase/101/gnode
cp -r /db/gcware/config /home/gbase/101/gcware/config #有的话执行下
scp -rp /home/gbase/101 gbase@172.16.9.102:/home/gbase #备份当前节点参数信息放置172.16.9.102节点4.5 备份定时任务(替换节点执行)
su - gbase
crontab -l >/home/gbase/101/root_coontab.log
su - root
crontab -l >/home/gbase/101/root_coontab.log
scp -rp /home/gbase/101/root_* gbase@172.16.9.102:/home/gbase #备份当前节点参数信息放置172.16.9.102节点五. 节点替换
5.1 将节点设置为unavailable状态
su - gbase
gcadmin setnodestate 172.16.9.101 unavailable
# 执行完成后,查看集群状态,确认101节点是否处于unavailable状态
gcadmin 
5.2 更换磁盘,重新安装操作系统
保证操作系统版本不变,IP不变,路由不变,root、gbase用户密码不变,安装目录/opt 所属者和权限不变。
5.3 服务器硬件性能测试(保证被替换后的服务器性能与其他各个节点保持一致)
网路测试
# 101节点执行
su - root
cd /opt/netperf
./netserver
# 其他各个节点执行(所有值都相差不大即可)
su - root
cd /opt/netperf
./netperf -H 172.16.9.101 -f M -l 10 
dd磁盘测试
su - root
mkdir -p /tmp/dd
dd oflag=direct if=/dev/zero of=/db/1.dat bs=256K count=5120 &>/tmp/dd/dd_w_256.log;
dd iflag=direct if=/db/1.dat of=/dev/null bs=256K count=5120 &>/tmp/dd/dd_r_256.log;
dd iflag=direct oflag=direct if=/db/1.dat of=/db/2.dat bs=256K count=5120 &>/tmp/dd/dd_rw_256.log;
dd oflag=direct if=/dev/zero of=/db/1.dat bs=512K count=5120 &>/tmp/dd/dd_w_512.log;
dd iflag=direct if=/db/1.dat of=/dev/null bs=512K count=5120 &>/tmp/dd/dd_r_512.log;
dd iflag=direct oflag=dir ect if=/db/1.dat of=/db/2.dat bs=512K count=5120 &>/tmp/dd/dd_rw_512.log;
dd oflag=direct if=/dev/zero of=/db/1.dat bs=1M count=5120 &>/tmp/dd/dd_w_1024.log;
dd iflag=direct if=/db/1.dat of=/dev/null bs=1M count=5120 &>/tmp/dd/dd_r_1024.log;
dd iflag=direct oflag=direct if=/db/1.dat of=/db/2.dat bs=1M count=5120 &>/tmp/dd/dd_rw_1024.log;
dd oflag=direct if=/dev/zero of=/db/1.dat bs=2M count=5120 &>/tmp/dd/dd_w_2048.log;
dd iflag=direct if=/db/1.dat of=/dev/null bs=2M count=5120 &>/tmp/dd/dd_r_2048.log;
dd iflag=direct oflag=direct if=/db/1.dat of=/db/2.dat bs=2M count=5120 &>/tmp/dd/dd_rw_2048.log;fio磁盘测试
su - root
mkdir -p /tmp/fio
fio -filename=/db/test_randread -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytes &>/tmp/fio/fio_random_read.log;
fio -filename=/db/test_randread -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest &>/tmp/fio/fio_sort_read.log;
fio -filename=/db/test_randread -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest &>/tmp/fio/fio_random_write.log;
fio -filename=/db/test_randread -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest &>/tmp/fio/fio_sort_write.log;5.4 执行节点替换命令
节点替换期间,节点状态会从unavailable ==> replace ==> open,在replace期间,此时正在同步元数据,只允许进行查询操作,不允许任何 dml、ddl 以及加载操作,整个集群都处理readonly状态,不可以允许有event存在和写锁存在,如果有,则会使替换操作卡住。所以需要调整业务窗口,阻断业务的写操作,节点替换前需要进行是否有event检查和写锁检查。
# 被替换节点不允许有未处理event存在
su - gbase
gcadmin showddlevent
gcadmin showdmlevent
gcadmin showdmlstorageevent
# 注:如果替换节点即101节点有event,执行以下命令清楚掉
su - gbase
python
>>> import gcware
>>> dir(gcware)
>>> gcware.clearddlfevent('.*')
>>> gcware.cleardmlfevent('.*')
>>> gcware.cleardmlstoragefevent('.*')# 被替换节点不允许有写锁存在
su - gbase
gcadmin showlock
# 注:如果替换节点即101节点有写锁,执行以下命令清楚掉
su - gbase
gcadmin showlock # 查看到对应锁所在的节点IP和会话id
gccli -uroot -e " show processlist " | grep -v Sleep # 在上述查询到的节点上执行
gccli -uroot -e " kill 108 "
gcadmin showlock # 多次执行验证一直处于没有写锁的状态


# 节点替换期间也不允许有故障事务转移到101节点
su - gbase
gcadmin showfailover
# 解压对应集群版本的安装包并执行替换命令(需要在非替换节点101上执行)
su - gbase
tar xjf GBase8a_MPP_Cluster-NoLicense-8.6.2_build43-R30-redhat6.2-x86_64.tar.bz2 -C /opt/gcinstall
cd /opt/gcinstall
./replace.py --host=172.16.9.101 --rootPwd=cdoms.2020 --dbRootPwd= --overwrite --sync_coordi_metadata_timeout=60 --retry_times=1 --parallel_pack=1
参数说明:
--host: 被替换节点IP
--rootPwd: 操作系统root用户的密码
--dbaRootPwd: 数据库root用户的密码
--overwrite: 强制卸载安装被替换节点的8a环境
--sync_coordi_metadata_timeout: 元数据同步时间,单位为分钟,设置成60,如果元数据过多,调整至180乃至更大
--retry_times 重试次数
--parallel_pack: 设置成1,开启并行打包,加快节点替换速度



5.5 数据同步
替换完成后,集群状态从readonly变为normal,节点状态从replace变为open,多次执行gcadmin showdmlstorageevent |grep count命令查看dmlstorageevent的数量和恢复速度。(注意该过程会对表加锁,与应用竞争锁,会对业务产生影响,只影响性能,不阻断读写)。
su - gbase
gcadmin
gcadmin showdmlstorageevent |grep count
gcadmin showdmlstorageevent |grep count
gcadmin showdmlstorageevent |grep count

六. 替换后集群状态检查
6.1 对比备份参数
# 从102节点恢复备份的参数文件和定时任务文件
su - root
scp -rp /home/gbase/101 gbase@172.16.9.101:/home/gbase
# 对比当前参数和替换前参数,有不一致的修改至节点替换前
su - gbase
cd /home/gbase/101
diff ./gnode/config/gbase_8a_gbase.cnf /db/gnode/config/gbase_8a_gbase.cnf
diff ./gcluster/config/gbase_8a_gcluster.cnf /db/gcluster/config/gbase_8a_gcluster.cnf
gccli -uroot -e "show variables" > /home/gbase/101/current_gc_variables.log
gncli -uroot -e "show variables" > /home/gbase/101/current_gn_variables.log
diff current_gc_variables.log gc_variables.log
diff current_gc_variables.log gc_variables.log
# 根据备份好的root_coontab.log和gbase_coontab.log恢复定时任务
su - root
crontab -e
su - gbase
crontab -e
6.2 检查集群状态
su - gbase
gcadmin
gcadmin showddlevent
gcadmin showdmlevent
gcadmin showdmlstorageevent
gcadmin showfailover

至此,集群101节点替换完成。
七. 节点替换异常记录
节点替换操作会产生两个日志,一为在执行replace.py节点(本文档为102节点)的安装包解压目录即/opt/gcinstall产生的replace.log,二为被替换节点(101节点)的/tmp目录下的InstallTar.log。如替换过程中出现异常请查看并分析这两个日志文件,本文档编写过程中我遇到三个报错,具体内容如下所示。
7.1 执行替换命令后长时间无响应
# 执行完替换命令长时间无响应,观察替换节点172.16.9.101的/tmp/InstallTar.log日志停留在 su - gbase -c "ulimit -m"无法执行。
原因:替换脚本修改了/etc/bashrc环境变量文件,从而导致su - gbase -c "ulimit -m"直接切换用户而不执行ulimit -m,使替换脚本无法接收到信号继续执行下一步。删除修改部分并上锁文件重新执行替换命令即可。
sed -i '87,1000d' /etc/bashrc
chattr +i /etc/bashrc

7.2 Function gbase.tablenamefilename does not exist
# 替换过程中偶尔会出现gbase.tablenamefilename函数不存在错误,执行replace.py替换命令时,将parallel_pack=1改为parallel_pack=0即可。
./replace.py --host=172.16.9.101 --rootPwd=cdoms.2020 --dbRootPwd= --overwrite --sync_coordi_metadata_timeout=60 --retry_times=1 --parallel_pack=0
7.3 替换节点仍有gbase和gcware等残留服务运行时
# 当被替换节点仍有gbase或gcware服务运行,执行replace.py命令时会报如下错误,被替换节点关闭相关服务,即可正常运行。
su - root
service gcware stop
service gbased stop
pidof gclusterd gbased corosync gcmonit gcrecover gc_sync_server; #无输出即可
评论
热门帖子
- 12025-12-01浏览数:182762
- 22023-05-09浏览数:25056
- 42023-09-25浏览数:18525
- 52020-05-11浏览数:17528

