跳转至

集群升级

集群升级

简介

集群升级工具(scupgrade)用于完成SeaboxMPP数据库的升级操作。其具有如下特征:

  • 支持大版本升级 —— 例如,21.0.3.XXX升级至21.1.1.XXX
  • 就地升级(inplace-upgrade) —— 无需重新初始化数据库,无需数据导出导入
  • 支持备份 —— 可以只备份元数据,也可以备份所有数据
  • 支持恢复 —— 如果升级失败,可以回退到原始版本
  • 支持并行执行 —— 并发备份、升级和恢复
  • 支持自动升级 —— 根据版本信息,自动执行需要的升级脚本

基本操作

scupgrade工具位于$SDHOME/share/seaboxsql/upgrade目录下。操作选项如下:

[seabox@test-1 upgrade]$ ./scupgrade -h
Usage: scupgrade

Options:
  -h, --help            show this help message and exit
  -c, --check           Check old cluster status
  -b, --backup          Backup old cluster system catalog
  --catalog-only        Backup all or only catalog schema
  --no-backup           Do not perform backup, only prepare
  -x, --execute         Execute upgrade scripts
  -r, --recover         Recover the cluster
  -m, --clear           Clear the temporary files generated by scupgrade
  --post                Execute upgrade scripts on new version
  -B OPT_BATCHSIZE, --batch-size=OPT_BATCHSIZE
                        Batch size for scupgrade
  -v, --verbose         output verbose messages

参数选项说明:

  • -h

查看帮助信息。

  • -c/–check

对旧集群进行必要检查,确认是否能够执行升级。

  • -b/–backup

  • 进行一些准备工作,如:收集数据库信息,准备升级脚本。

  • 进行备份,升级工具使用basebackup工具备份旧集群数据,可以通过–catalog-only指定只备份元数据(不备份用户数据)。

  • –catalog-only

与-b/–backup配合使用,指定只备份元数据(不备份用户数据)。

  • –no-backup

与-b/–backup配合使用,指定允许只进行准备操作,不进行备份(不能进行恢复)。

  • -x/–execute

执行前置升级脚本,前置升级脚本在旧集群上面执行。

  • -r/–recover

执行恢复操作。

  • -m/–clear

清除升级操作临时文件。

  • –post

与-x/–execute配合使用,通过–post指定当前执行的是后置升级,后置升级脚本在新集群上面执行。

  • -B/–batch-size

指定并行度,默认等于当前执行操作的数据库实例个数,对于不同操作,默认并行度为: * 备份:1 + NUM(primary) * 升级:NUM(coordinator) + NUM(primary) * 恢复:NUM(coordinator) + NUM(primary) + NUM(mirror)

  • -v/–verbose

显示详细日志。

升级前准备

执行升级之前的准备工作。

获取新版本

最终升级目标版本,并确认该版本中已经提供scupgrade工具(确认方法:新版本临时安装到某个目录下,查看新的$SDHOME目录下是否有share/seaboxsql/upgrade目录)。

seaboxsql.conf配置文件

对于小版本升级(例如,21.0.3.3xx升级到21.0.3.4xx),seaboxsql.conf文件配置参数一般不发生变化,所以一般不需要提供新的seaboxsql.conf配置文件;如果是大版本升级,默认配置参数一般会发生变化,那么应该以新版的seaboxsql.conf配置文件为准,重新提供配置文件。

coordinator和executor各提供一份配置文件。

新seaboxsql.conf配置文件确定方法:

  • 默认值发生变化: 那么调整为新版本的参数
  • 新增参数: 设定合理参数值
  • 删除参数: 新版本中有等效参数,那么重新设定新版本中相应参数;如果为舍弃的参数,那么删除该参数
  • 用户自定义参数:如果该参数在新版中含义没有发生变化,那么保留该参数;否则,作相应处理

注: sc_contentid参数不需要保留,升级工具会自动添加; sc_dcs_conn_str参数需要跟旧的配置文件保持一致

升级执行人员(DBA)应该确保配置文件正确、可用,确认方法如下:

  • 未提供新配置文件: 初始化单机数据库,使用原有配置文件启动该单机数据库,确认是否可以成功启动;
  • 提供新配置文件: 初始化单机数据库,使用新配置文件启动该单机数据库,确认是否可以成功启动;
升级路线

对于旧版本比较老的大版本升级,例如21.0.3.408升级到21.1.1.660,那么升级路线是:

21.0.3.408 --> 21.0.3.422 --> 21.1.1.660

备注:21.0.3.422版本引入升级工具

需要经过两次升级到最终版本,因此需要提供两个安装包;每一步升级都要进行上面介绍的准备工作。后面章节有介绍21.0.3升级至21.1.1的参考示例。

确认seabox-topo.yml

针对21.0->21.1大版本升级,21.1版本升级可以跳过。

查看旧集群是否存在seabox-topo.yml文件($SDHOME/etc/seabox-topo.yml),如果不存在,那么执行一次集群重启。

升级流程

升级操作应该申请一段足够的升级窗口期,在升级过程中,不允许集群对外继续提供服务,以免产生不可预期的结果。升级操作应该严格按照操作流程进行。

禁止外部应用访问

升级窗口期内,应该禁止外部应用继续使用数据库集群,否则可能造成不可预测的错误结果。

禁止方法:

  • 修改所有主节点(coordinator + primary)的sd_hba.conf文件,禁止外部连接请求;
安装新版本

安装目录与旧集群的安装目录不同。为方便描述,将旧集群的安装目录记作$SDHOME_OLD,将新集群的安装目录记作$SDHOME_NEW

拷贝旧集群的配置文件,执行如下命令:

cp $SDHOME_OLD/etc/seabox-site.yml $SDHOME_NEW/etc/
cp $SDHOME_OLD/etc/seabox-topo.yml $SDHOME_NEW/etc/
cp $SDHOME_OLD/etc/scdcs-topo.yml $SDHOME_NEW/etc/   # 针对21.1

执行集群安装:

source $SDHOME_NEW/seaboxmpp_path.sh
seabox install

注意:这里只需要执行安装,不需要执行初始化!

配置参数

配置升级工具的参数配置文件config.yml(位于$SDHOME_NEW/share/seaboxsql/upgrade目录下),文件格式如下:

old_sdhome : /home/seabox/sdsql
new_sdhome : /home/seabox/sdsql_upgrade
upgrade_user : seabox
tmp_dir : /home/seabox/myscupgrade
cluster_type : mpp
seaboxsql_conf : 
  coor : /home/seabox/sdsql_upgrade/share/seaboxsql/upgrade/coor_conf/seaboxsql.conf
  exec : /home/seabox/sdsql_upgrade/share/seaboxsql/upgrade/exec_conf/seaboxsql.conf

参数说明如下:

  • old_sdhome

旧集群的SDHOME目录。

  • new_sdhome

新集群的SDHOME目录。

  • upgrade_user

数据库安装用户,应该与旧集群的安装用户一致。

  • tmp_dir 升级工具工作目录,如果不指定则取$HOME目录。

  • cluster_type

不指定或者指定为'mpp',表示seaboxmpp数据库升级;指定为'centralized',表示集中式集群升级。

  • seaboxsql_conf 使用指定的配置文件:
  • coor: 指定coordinator使用的配置文件
  • exec: 指定executor使用的配置文件

注: sc_contentid参数不需要保留,升级工具会自动添加; sc_dcs_conn_str参数需要跟旧的配置文件保持一致

重启集群

确保此时集群已经没有外部应用访问,并且集群已经不存在正在运行中的任务(通过pg_stat_activity视图获取)。

手动执行一次checkpoint。

重新启动集群。

检查

开始进入升级窗口,检查升级操作能够进行。

source $SDHOME_NEW/seaboxmpp_path.sh
cd $SDHOME_NEW/share/seaboxsql/upgrade

执行命令:

./scupgrade -c

目前执行的检查操作包括:

序号 检查项 说明
1 check ssh 检查coor节点和exec节点之间是否配置互信
2 check multi threading 检查旧版本是否是多线程版本,当前不支持多线程模式升级
3 check version 检查新旧版本是否可升级
4 check perfect status 检查当前集群状态是否为perfect
5 check user 检查升级用户,要求升级用户是数据库的安装用户
6 check database connection 检查当前数据库连接状态,要求template0库不可连接,其它数据库可连接
7 check namespace 要求有public schema
8 check cluster status 集群状态详细检查,包括:主从是否同步,主从是否发生切换
9 check hba conf 检查sd_hba.conf配置,检查是否有非集群内部ip(目前仅警告)
10 cluster restart 检查数据库是否能正常重启
11 cluster state activity 检查当前是否有运行任务,如有则报错
12 prepared transaction 检查当前集群是否有prepared transaction,如有则报错
13 check read only 检查当前所有的主的default_transaction_read_only属性,如果为on则报错
14 seaboxsql conf 检查旧版本或者是提供的seaboxsql.conf文件对于新版本是否有效
15 c function 检查是否存在用户自定义c函数,如果存在则报错,要求drop掉,升级之后重新创建
16 oid 检查升级脚本中设置的oid是否都有效,要求设置的oid小于16384
17 check extensions 检查当前集群中的扩展包是否需要升级
18 check guc 检查新旧版本guc参数,比如默认值是否发生变化

没有报错信息认为检查通过。

备份

备份旧集群。

执行命令:

./scupgrade -b

数据备份至各个节点的$tmpdir/scupgrade_21.X/backup目录下。如果只备份元数据可指定–catalog-only选项。

备份操作包括如下内容:

序号 操作 说明
1 获取旧集群database信息
2 获取旧集群tablespace信息
3 确定升级路径 具体要执行哪些升级脚本
4 升级脚本预处理

可以通过–batch-size参数指定并行度。

特殊场景下,可以通过指定–no-backup只做准备工作,不进行备份。 注: 如果发生升级失败,将无法进行恢复!

没有报错信息认为备份成功。

执行前置升级

这里指在旧集群上面执行的升级,该操作为可选。

执行命令:

./scupgrade -x

可以通过–batch-size参数指定并行度。

没有报错信息认为升级操作执行成功。

执行后置升级

这里指在旧集群上面执行的升级,该操作为可选。

执行命令:

./scupgrade -x --post

可以通过–batch-size参数指定并行度。

没有报错信息认为升级操作执行成功。

至此,升级操作完成。

恢复

对于已经备份(全量或只备份元数据)的升级操作,如果执行升级(前置或后置)失败,可进行集群恢复。

执行命令:

./scupgrade -r

可以通过–batch-size参数指定并行度。

没有报错信息认为恢复操作执行成功。

启动新集群

执行命令:

seabox start -a
seabox --version
对新集群进行必要检查。

升级示例

21.0.3升级至21.1.1

这里假设: * $SDHOME_OLD为:/home/seabox/seabox_21.0.3.408 * $SDHOME_NEW为:/home/seabox/seabox_21.1.1.660

操作流程如下:

升级前准备

软件包

两个软件包,例如:

  • seaboxmpp-db-21.0.3.422-RHEL7.7-x86_64.zip (中间过渡版本)
  • seaboxmpp-db-21.1.1.660-RHEL7.7-x86_64.zip

安装21.0.3.422

安装至一个新的目录,例如/home/seabox/seabox_21.0.3.422,该目录记作SDHOME_MID

拷贝配置文件:

cp $SDHOME_OLD/etc/seabox-site.yml  $SDHOME_MID/etc/
cp $SDHOME_OLD/etc/seabox-topo.yml  $SDHOME_MID/etc/

执行集群安装:

source $SDHOME_MID/seaboxmpp_path.sh
seabox install

升级至21.0.3.422

编辑升级配置文件config.yml:

cd $SDHOME_MID/share/seaboxsql/upgrade
vim ./config.yml

文件内容如下:

old_sdhome : /home/seabox/seabox_21.0.3.408
new_sdhome : /home/seabox/seabox_21.0.3.422
upgrade_user : seabox
tmpdir : /home/seabox/upgrade_to_408

依次执行如下操作:

./scupgrade -c
./scupgrade -b
./scupgrade -x --post

启动21.0.3.422

seabox start -a
seabox version

安装21.1.1.660

安装至SDHOME_NEW(/home/seabox/seabox_21.1.1.660)。

拷贝配置文件:

cp $SDHOME_MID/etc/seabox-site.yml  $SDHOME_NEW/etc/
cp $SDHOME_MID/etc/seabox-topo.yml  $SDHOME_NEW/etc/

执行集群安装:

source $SDHOME_NEW/seaboxmpp_path.sh
seabox install

升级至21.1.1.660

编辑升级配置文件config.yml:

cd $SDHOME_NEW/share/seaboxsql/upgrade
vim ./config.yml

文件内容如下:

old_sdhome : /home/seabox/seabox_21.0.3.422
new_sdhome : /home/seabox/seabox_21.1.1.660
upgrade_user : seabox
tmpdir : /home/seabox/upgrade_to_660
seaboxsql_conf :
  coor : /home/seabox/seabox_21.1.1.660/share/seaboxsql/upgrade/coor_conf/seaboxsql.conf
  exec : /home/seabox/seabox_21.1.1.660/share/seaboxsql/upgrade/exec_conf/seaboxsql.conf
注意
21.0.3.422升级至21.1.1.660,seaboxsql.conf配置文件发生了变化,所以这里需要准备两个seaboxsql.conf配置文件:一个用于配置coordinator, 一个用于配置exector;配置文件的准备方式参考升级前准备一节

依次执行如下操作:

./scupgrade -c
./scupgrade -b
./scupgrade -x
./scupgrade -x --post

启动21.1.1.660

seabox start -a
seabox --version