一、升级背景
某客户MogDB集群由于出现内存堆积的bug,导致业务在使用过程中占用大量内存,最终出现内存不足的报错,现将数据库从5.0.4的版本,升级到5.0.9版本。
二、集群环境
2.1 集群列表
数据中心 |
主机名 |
IP |
主备情况 |
数据库软件 |
A中心 |
A1 |
192.168.1.1 |
主 |
Mogdb5.0.4 |
A2 |
192.168.1.2 |
同步备 |
||
B中心 |
B1 |
192.168.2.1 |
同步备 |
|
B2 |
192.168.2.2 |
同步备 |
||
C中心 |
C1 |
192.168.3.1 |
异步备 |
|
C2 |
192.168.3.2 |
级联备库 |
目前PTK纳管了集群当中的5个节点,级联备库节点192.168.3.2未纳管到PTK中。
2.2 集群架构图
三、升级步骤
3.1 升级影响和升级约束
- 升级操作不能和扩容、缩容同时执行。
- 升级过程中,不允许对wal_level,max_connections,max_prepared_transactions,max_locks_per_transaction这四个GUC参数的值进行修改。如果修改,会导致回滚后实例启动异常。
- 建议在数据库系统空闲情况下进行升级,尽量避开业务繁忙的时间段(可按照经验判断,如节假日等)。
- 升级前尽可能保证数据库状态正常。通过PTK安装的版本可通过ptk cluster -n <CLUSTER_NAME> status命令查看集群状态,Normal代表集群所有实例正常可用。通过OM安装的版本可以通过gs_om -t status查询,查询结果的cluster_state为Normal代表数据库正常可用。
- 升级前保证数据库互信正常,可以在任意节点上,通过ssh hostname命令,连接另外一个节点进行验证。如果各机器间互连不用输入密码,说明互信正常(通常数据库状态正常时,互信一般都是正常的)。
- 升级前后,数据库的部署方式(配置文件)不能发生变化。升级前PTK会对部署方式进行校验,如果改变会报错。
- 升级过程中不允许打开kerberos开关。
- 集群流复制参数需开启(enable_stream_replication)。
3.2 升级流程
- 确认业务已经关闭,确认数据库中无业务连接
- 关闭集群所有MogHA
- 备份APP目录和DATA目录
- 断开C中心的级联备库C2,强行将该库拉成可读写的库
- 升级C中心的级联备库,验证在有生产数据的情况下是否可以升级
- 在ptk纳管中,踢出A中心的备节点A2
- 在集群中踢出A中心的备节点A2,将该备节点,强行拉成可读写的库,,用于A和B中心节点升级验证及升级后的备份
- 原地升级数据库节点(A1,B1,B2,C1)
- 将A中心的备节点重新纳管到PTK中,并重做该备节点A1
- 利用C中心C1节点重做C中心的级联备库C2
3.3.升级操作
3.3.1 确认数据库连接与数据库状态
在数据库中确认业务是否继续还有连接,检查是否还有active的会话
select datname,usename,state,count(*) from pg_stat_activity group by datname,usename,state;
确认数据库状态都为normal,且主从复制不存在延迟
A1节点:
ptk cluster -n status mogdb01
gs_ctl query -D /data/mogdb/data
C2节点:
ptk cluster -n status mogdb01
gs_ctl query -D /data/mogdb/data
3.3.2 关闭MogHA
由于在升级操作中,数据库会反复启停,MogHA会在停止数据库后尝试将数据库拉起或者切换主从,会影响升级得成功性。
需在每个节点中执行:
systemctl stop mogha
systemctl status mogha
3.3.3 删除pg_hba.conf白名单
删除pg_hba.conf 白名单配置确保没有应用连进来
pg_guc reload -N all -I all -h "host all all 0.0.0.0/0"
3.3.4 备份APP和DATA目录
先停止数据库中所有节点,对数据库中所有节点的APP目录和DATA目录进行备份
A1节点:
ptk cluster -n mogdb01 stop
备份所有节点上的目录(在所有节点上执行)
cd /data/mogdb
cp data data.bak
cp app app.bak
备份好后在A1上重新拉起集群
ptk cluster -n mogdb01 start
3.3.5 升级C中心级联节点C2
将C中心C2强行拉成读写状态后升级
C2节点:
$ gs_ctl stop -D /data/mogdb/data
$ gs_ctl start -D /data/mogdb/data -M primary
确认为primary状态
# ptk cluster -n mogdb01 status
进行升级操作
# ptk cluster -n mogdb01 upgrade -p <mogdb509安装包> --plugin-dir <mogdb509插件目录>
# ptk cluster -n mogdb01 upgrade-commit
验证数据库版本
$ gsql -dpostgres -c "select version()"
检查插件升级状态
ptk cluster -n mogdb01 list-plguins
3.3.7 PTK中取消纳管A2,A2主机ptk只纳管A2
修改A1ptk配置,取消A2纳管
A1节点:
# cd /root/.ptk/data/mogdb01
# cp topology.yml topology.yml_bak
# vi topology.yml
----在dbserver中取消A2的所有配置
# ptk ls
修改A2 ptk配置,取消除A2外的其他所有节点
A2节点:
# cd /root/.ptk/data/mogdb01
# cp topology.yml topology.yml_bak
# vi topology.yml
----在dbserver中取消A2的所有配置
# ptk ls
3.3.8 集群中踢出A2
强行将A2通过Primary的方式启动,断开与其他节点的主从关系
A2节点:
gs_ctl stop -D /data/mogdb/data
gs_ctl start -D /data/mogdb/data -M primary
3.3.9 升级A2
A2节点:
检查数据库升级的节点以及状态
ptk cluster -n mogdb01 status
进行升级操作
# ptk cluster -n mogdb01 upgrade -p <mogdb509安装包> --plugin-dir <mogdb509插件目录>
# ptk cluster -n mogdb01 upgrade-commit
升级的节点验证数据库版本
$ gsql -dpostgres -c "select version()"
检查插件升级状态
ptk cluster -n mogdb01 list-plguins
3.3.10 原地升级数据库节点(A1,B1,B2,C1)
就地升级数据库中的节点,除A1外
A1:
检查数据库升级的节点以及状态
ptk cluster -n mogdb01 status
进行升级操作
# ptk cluster -n mogdb01 upgrade -p <mogdb509安装包> --plugin-dir <mogdb509插件目录>
# ptk cluster -n mogdb01 upgrade-commit
升级的节点验证数据库版本
$ gsql -dpostgres -c "select version()"
检查插件升级状态
ptk cluster -n mogdb01 list-plguins
3.3.11 重新纳管A2
对A2进行重建,添加到数据库集群中
A2:
$ gs_ctl stop -D /data/mogdb/data
$ gs_ctl build -D /data/mogdb/data -M standby
将A2的配置信息重新添加到ptk中
A1:
# cd /root/.ptk/data/mogdb01
# cp topology.yml topology.yml_bak
# vi topology.yml
----在dbserver中添加A2的配置
# ptk ls
检查整个集群状态
ptk cluster -n status mogdb01
将ptk data目录复制到A2,B1,B2中
scp -r data A2:/root/.ptk/
scp -r data B1:/root/.ptk/
:
scp -r data B2:/root/.ptk/
3.3.11 重做C2
在所有集群所有节点全部升级成功后,通过C中心中C1来重做C2
C2节点:
$ gs_ctl stop -D /data/mogdb/data
$ gs_ctl -D /data/mogdb build -b standby_full -M cascade_standby -C "localhost=192.168.3.2 localport=26000 remotehost=192.168.3.1 remoteport=26000"
检查数据库状态
$ gs_ctl query - D /data/mogdb/data
四、回滚步骤
4.1 C2升级失败,升级停止
C2升级失败,通过ptk回滚命令进行回滚
ptk cluster upgrade-rollback -n XXXX
若上述命令执行不成功,关闭C2,恢复备份的app和data目录,重做C2
C2节点:
cd /data/mogdb
mv app.bak app
mv data.bak data
$ gs_ctl stop -D /data/mogdb/data
$ gs_ctl -D /data/mogdb build -b standby_full -M cascade_standby -C "localhost=192.168.3.2 localport=26000 remotehost=192.168.3.1 remoteport=26000"
检查数据库状态
$ gs_ctl query - D /data/mogdb/data
4.2 A2升级失败,升级停止
A2升级失败,通过ptk回滚命令进行回滚
ptk cluster upgrade-rollback -n XXXX
若上述命令执行不成功,关闭C2,恢复备份的app和data目录,重做A2
A2节点:
cd /data/mogdb
mv app.bak app
mv data.bak data
$ gs_ctl stop -D /data/mogdb/data
$ gs_ctl -D /data/mogdb build -b standby -M standby
检查数据库状态
$ gs_ctl query - D /data/mogdb/data
4.3 数据库集群升级失败
先通过ptk回滚命令进行回滚
ptk cluster upgrade-rollback -n mogdb01
若上述命令执行不成功
将vip手动挂载到A2上,优先恢复业务
在A1节点上取消挂载VIP
# ifconfig bond0:1
在A2节点手动关在VIP
# ifconfig bond0:1 <VIP> netmask 255.255.255.0 up
测试VIP连接
# arping -D -f-w 1 - I bond0 <VIP>
# aping -c 1 -w 1 -A -f -q -I bond0 <VIP>
将集群中升级的所有节点,恢复之前备份的APP目录和DATA目录,在以备库的形式进行重建
每个升级节点上执行:
cd /data/mogdb
mv app.bak app
mv data.bak data
$ gs_ctl stop -D /data/mogdb/data
$ gs_ctl build -D /data/mogdb/data -M standby
检查数据库状态
$ gs_ctl query - D /data/mogdb/data