GBase 8a
运维管理
文章

Gbase 8a 86版本节点替换

发表于2024-02-25 16:47:56149次浏览0个评论

一. 节点替换适用场景

  1. 当某些服务器出现不可恢复的故障时,比如磁盘损坏,文件系统故障,且长时间不可修复时。
  2. 当某些服务器磁盘使用达到瓶颈,且无法通过加盘在线扩容,需要重新规划raid,重装系统时。
  3. 当某些服务器过于老旧,需要淘汰换新时。

二. 节点替换前信息收集

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; #无输出即可

 

评论

登录后才可以发表评论