集群升级
集群升级¶
简介¶
集群升级工具(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