本文主要记录我的一次容器化升级流程。
环境准备
1、下载openGauss-server代码的docker目录至本地
2、准备所需镜像对应的版本的包
创建一个所需版本的版本号的目录,类似于上图中的5.0.0,下载对应版本的包至当前dockerfiles目录,并解压出其中的内核包,将其放到对应的版本号目录。例如我需要3.0.0和3.0.5两个版本的镜像,我的环境如下
3、升级准备
升级工具
升级目标版本也就是新版本的升级脚本
创建镜像
创建3.0.0版本镜像
sh buildDockerImage.sh -v 3.0.0 -i
创建旧版本1主2备容器集群
bash create_master_slave.sh --SLAVE_COUNT 2 --NETWORK_NAME net_xuemn --VERSION 3.0.0 --MASTER_HOST_PORT 4432
做升级的容器是必须要做数据持久化的,可自行修改create_master_slave.sh脚本,添加持久化参数-v
其他参数如备机个数、旧版本号、主备端口号、网络名称等可以自行指定,或修改创建容器的脚本
检查集群状态
docker exec dn_6001 su - omm -c "gs_ctl query -D /var/lib/opengauss/data"
docker exec dn_6002 su - omm -c "gs_ctl query -D /var/lib/opengauss/data"
docker exec dn_6003 su - omm -c "gs_ctl query -D /var/lib/opengauss/data"
准备升级工具目录及新包
创建upgrade目录,也可以直接使用下载的目录,在upgrade目录中创建pkg_new目录,并将新版本升级脚本和版本文件移入其中。
将升级工具包拷贝到容器内
docker cp /data2/xuemn/docker/upgrade dn_6001:/var/lib/opengauss/
docker exec dn_6001 chown omm:omm /var/lib/opengauss/upgrade/ -R
docker exec dn_6001 ls -al /var/lib/opengauss/upgrade/
docker cp /data2/xuemn/containers/dn_6001/upgrade dn_6002:/var/lib/opengauss/
docker cp /data2/xuemn/containers/dn_6001/upgrade dn_6003:/var/lib/opengauss/
升级测试
其他操作准备
设置同步备,关闭最大可用模式
docker exec dn_6001 su - omm -c "gs_guc reload -D /var/lib/opengauss/data/ -c \"synchronous_standby_names = '2(dn_6002,dn_6003)'\" -c \"most_available_sync=off\""
这一步是我的测试所需要的,按需执行即可。
步骤一 所有节点执行前置升级
docker exec dn_6001 su - omm -c "sh /var/lib/opengauss/upgrade/upgrade.sh -B /var/lib/opengauss/upgrade -N /var/lib/opengauss/upgrade/pkg_new -t upgrade_pre"
docker exec dn_6002 su - omm -c "sh /var/lib/opengauss/upgrade/upgrade.sh -B /var/lib/opengauss/upgrade -N /var/lib/opengauss/upgrade/pkg_new -t upgrade_pre"
docker exec dn_6003 su - omm -c "sh /var/lib/opengauss/upgrade/upgrade.sh -B /var/lib/opengauss/upgrade -N /var/lib/opengauss/upgrade/pkg_new -t upgrade_pre"
故障测试场景1 执行前置操作前,注入节点3被停掉的故障
主机上查询状态如下
主机上执行前置升级
从执行结果可以看到成功拦截到故障问题。
步骤二 停掉所有容器
docker exec dn_6003 su - omm -c "gs_ctl stop -D /var/lib/opengauss/data/"
docker exec dn_6002 su - omm -c "gs_ctl stop -D /var/lib/opengauss/data/"
docker exec dn_6001 su - omm -c "gs_ctl stop -D /var/lib/opengauss/data/"
步骤三 启动新版本容器并执行upgrade_bin
docker run --network net_xuemn --ip 182.11.0.101 --privileged=true --name dn_6001_305 -h dn_6001 -p 4432:4432 -v /data2/xuemn/containers/dn_6001/:/var/lib/opengauss -it --entrypoint /bin/bash opengauss:3.0.5
su - omm -c "sh /var/lib/opengauss/upgrade/upgrade.sh -B /var/lib/opengauss/upgrade -N /var/lib/opengauss/upgrade/pkg_new -t upgrade_bin"
docker run --network net_xuemn --ip 182.11.0.102 --privileged=true --name dn_6002_305 -h dn_6002 -p 6432:6432 -v /data2/xuemn/containers/dn_6002/:/var/lib/opengauss -it --entrypoint /bin/bash opengauss:3.0.5
su - omm -c "sh /var/lib/opengauss/upgrade/upgrade.sh -B /var/lib/opengauss/upgrade -N /var/lib/opengauss/upgrade/pkg_new -t upgrade_bin"
docker run --network net_xuemn --ip 182.11.0.103 --privileged=true --name dn_6003_305 -h dn_6003 -p 7432:7432 -v /data2/xuemn/containers/dn_6003/:/var/lib/opengauss -it --entrypoint /bin/bash opengauss:3.0.5
su - omm -c "sh /var/lib/opengauss/upgrade/upgrade.sh -B /var/lib/opengauss/upgrade -N /var/lib/opengauss/upgrade/pkg_new -t upgrade_bin"
故障测试场景2 停旧容器时,有一个容器未停掉
步骤四 所有节点执行后置升级
su - omm -c "sh /var/lib/opengauss/upgrade/upgrade.sh -B /var/lib/opengauss/upgrade -N /var/lib/opengauss/upgrade/pkg_new -t upgrade_post"
故障测试场景3 有备机未连接上主机
有备机未连接上主机的场景,成功检测到并退出后置升级
故障修复后再次执行后置升级,成功
故障测试场景4 注入旧容器未停掉的故障
步骤五 提交
所有节点执行升级提交动作
su - omm -c "sh /var/lib/opengauss/upgrade/upgrade.sh -B /var/lib/opengauss/upgrade -N /var/lib/opengauss/upgrade/pkg_new -t upgrade_commit"
至此,升级完成。
其他可能用到的命令
进入运行中的容器
docker exec -ti dn_6001 /bin/bash
环境清理
docker rm dn_6001 dn_6002 dn_6003 dn_6002_305 dn_6001_305 dn_6003_305 -f; docker network rm net_xuemn;
rm /data2/xuemn/containers/dn_600*/* -rf
调试
docker run --network net_xuemn --ip 182.11.0.101 --privileged=true --name dn_6001 -h dn_6001 -p 4432:4432 -e GS_PORT=4432 -e OG_SUBNET=182.11.0.0/24 -e GS_PASSWORD=Enmo@123 -e NODE_NAME=dn_6001 -e "REPL_CONN_INFO=replconninfo1 = 'localhost=182.11.0.101 localport=4433 localservice=4436 localheartbeatport=4437 remotehost=182.11.0.102 remoteport=6433 remoteservice=6436 remoteheartbeatport=6437'\n replconninfo2 = 'localhost=182.11.0.101 localport=4433 localservice=4436 localheartbeatport=4437 remotehost=182.11.0.103 remoteport=7433 remoteservice=7436 remoteheartbeatport=7437'\n replconninfo3 = 'localhost=182.11.0.101 localport=4433 localservice=4436 localheartbeatport=4437 remotehost=182.11.0.104 remoteport=8433 remoteservice=8436 remoteheartbeatport=8437'\n" -it --entrypoint /bin/bash opengauss:3.0.0