暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB集群5.0.4-> 5.0.9升级方案

蔡璐 2024-12-12
47

一、升级背景

某客户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 升级流程

  1. 确认业务已经关闭,确认数据库中无业务连接
  2. 关闭集群所有MogHA
  3. 备份APP目录和DATA目录
  4. 断开C中心的级联备库C2,强行将该库拉成可读写的库
  5. 升级C中心的级联备库,验证在有生产数据的情况下是否可以升级
  6. 在ptk纳管中,踢出A中心的备节点A2
  7. 在集群中踢出A中心的备节点A2,将该备节点,强行拉成可读写的库,,用于A和B中心节点升级验证及升级后的备份
  8. 原地升级数据库节点(A1,B1,B2,C1)
  9. 将A中心的备节点重新纳管到PTK中,并重做该备节点A1
  10. 利用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

 

最后修改时间:2024-12-12 18:39:43
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论