主题
引擎扩容
引擎扩容可以分为纵向和横向扩容两种方式。纵向扩容是指增加单台机器的 segment 数量。横向扩容是指增加机器数量,每台机器的 segment 数量保持不变。下面详细介绍在 HENGSHI SENSE 上如何使用上述两种方式进行引擎扩容。
扩容前现有系统准备工作
扩容前请完成如下准备工作
- 停止 HENGSHI 以及其他会使用引擎的服务。
bash
${HENGSHI_HOME}/bin/hengshi-sense-bin stop hengshi
1
清理数据膨胀 分为下面两种场景
- 日常还没有通过 crontab 运行
${HENGSHI_HOME}/bin/clean_engine.sh -t -r
的情况。
- 需要在非工作时间,先跑一次
${HENGSHI_HOME}/bin/clean_engine.sh -t -r -f
这个过程根据实际情况不同,等待的时间不同,通常以小时为单位计算时间。 - 然后配置上每日凌晨执行
${HENGSHI_HOME}/bin/clean_engine.sh -t -r
。
- 日常配置了通过 crontab 运行
${HENGSHI_HOME}/bin/clean_engine.sh -t -r
的情况。
- 需要在非工作时间,跑一次
${HENGSHI_HOME}/bin/clean_engine.sh -t -r -f
。
- 日常还没有通过 crontab 运行
登录引擎,修改 localhost 类的地址为能区分不同机器的域名 通过把
gp_segment_configuration
表中hostname
和address
两个字段本机的域名和地址修改成局域网内可区分不同机器的域名和地址 例如查询当前环境:
sql
$ psql
psql (9.4.24)
Type "help" for help.
hengshi=# select * from gp_segment_configuration ;
dbid | content | role | preferred_role | mode | status | port | hostname | address | datadir
------+---------+------+----------------+------+--------+------+-----------------+-----------------+--------------------------------------------------------------
1 | -1 | p | p | n | u | 5232 | localhost | localhost | /home/data/engine-cluster/data/SegDataDir-1
2 | 0 | p | p | n | u | 5233 | localhost | localhost | /home/data/engine-cluster/data/SegDataDir0
(2 rows)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- greenplum6
sql
psql (9.4.24)
Type "help" for help.
set allow_system_table_mods='true';
update gp_segment_configuration set address = '<real_ip>' where address = localhost';
update gp_segment_configuration set hostname = '<real_hostname>' where hostname = 'localhost';
1
2
3
4
5
6
2
3
4
5
6
- greenplum5
sql
$ psql
psql (8.3)
Type "help" for help.
set allow_system_table_mods='DML';
update gp_segment_configuration set address = '<real_ip>' where address = localhost';
update gp_segment_configuration set hostname = '<real_hostname>' where hostname = 'localhost';
1
2
3
4
5
6
7
2
3
4
5
6
7
增加机器扩容
扩容前新机器准备工作
横向扩容前需要在新机器上进行如下准备工作。
请参考引擎新节点环境准备完成新节点准备工作。
GP 扩容
清理历史扩容 schema
对于曾经执行过扩容操作的集群,可能会由于操作遗漏留存有上次扩容的 schema,这种情况需要先清理干净,否则会造成扩容失败
bash
source /opt/hengshi/engine-cluster/export-cluster.sh
psql postgres -c '\dn'
1
2
2
若存在 gpexpand
名字的 schema,则需要清理
bash
source /opt/hengshi/engine-cluster/export-cluster.sh
gpexpand -c
1
2
2
清理后查看是否清理干净(重复上述 psql postgres -c '\dn' 的方法),若未清理干净可选择手工清理
sql
source /opt/hengshi/engine-cluster/export-cluster.sh
psql postgres
drop view gpexpand.expansion_progress;
drop table gpexpand.status;
drop table gpexpand.status_detail;
drop schema gpexpand;
1
2
3
4
5
6
2
3
4
5
6
扩容操作
扩容分为无镜像扩容和有镜像扩容。
无镜像扩容
生成扩容配置文件
- 先准备一个 new-host 文件,里面写上新增的 hostname,请不要重复。 如果无新增 host 就用空文件,参考下面示例为集群中新增一台 hostname 为
engien2
的机器
bash
engine2
1
- 执行下面命令生成扩容配置文件。示例中包含了 greenplum-6和 greenplum-5两种扩容命令,执行时请根据环境选择对应的命令。
bash
cd /opt/hengshi
source engine-cluster/export-cluster.sh
# for greenplum-6
gpexpand -f new-host
# for greenplum-5
psql -c 'create database gpexpand_schame_db' # greenplum 临时存储 schema 的数据库, 可以临时建立一个
gpexpand -f new-host -D gpexpand_schame_db
1
2
3
4
5
6
7
2
3
4
5
6
7
- 根据提示填写信息,生成扩容配置文件。
bash
Would you like to initiate a new System Expansion Yy|Nn (default=N): #回答 'y'
Are you sure you want to continue with this gpexpand session? Yy|Nn (default=N): #回答 'y'
How many new primary segments per host do you want to add? (default=0): #增加新机器回答 '0'; 现有机器上增加 segment 数量则回答增量数,比如每台增加2个 segment 就回答 '2'
Enter new primary data directory 1: #填写数据目录的根目录,比如现有目录 /opt/hengshi/engine-cluster/data/SegDataDir-1, 则回答 '/opt/hengshi/engine-cluster/data'
Enter new primary data directory 2: #填写数据目录的根目录,比如现有目录 /opt/hengshi/engine-cluster/data/SegDataDir-1, 则回答 '/opt/hengshi/engine-cluster/data'
1
2
3
4
5
2
3
4
5
等待执行结果,示例中 gpexpand_inputfile_20210806_121646就是生成的扩容配置文件。
bash
Generating configuration file...
20210806:12:16:46:744854 gpexpand:m86:lvliang-[INFO]:-Generating input file...
Input configuration file was written to 'gpexpand_inputfile_20210806_121646'.
Please review the file and make sure that it is correct then re-run
with: gpexpand -i gpexpand_inputfile_20210806_121646
20210806:12:16:46:744854 gpexpand:m86:lvliang-[INFO]:-Exiting...
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 配置文件格式说明。
bash
<hostname>|<address>|<port>|<datadir>|<dbid>|<content>|<preferred_role>
1
其中preferred_role值是 p 或 m,决定这个 segment 是主节点还是镜像,p 表示主节点,m 表示镜像。
假设现有两台机器,分别是 engine1、engine2,每台机器有1个 segment,现在每台机器上新增一个 segment,文件命名为 gpexpand_inputfile,则配置文件内容如下。
bash
engine1|engine1|25433|/opt/hengshi/engine-cluster/data/SegDataDir1|4|2|p
engine2|engine2|25433|/opt/hengshi/engine-cluster/data/SegDataDir2|5|3|p
1
2
2
执行扩容
执行如下命令进行扩容,扩容过程中需要使用上一步生成的 gpexpand_inputfile_xxxxxxxx_xxxxxx 文件。
bash
source /opt/hengshi/engine-cluster/export-cluster.sh
# for greenplum-6
gpexpand -i gpexpand_inputfile_xxxxxxxx_xxxxxx
# for greenplum-5
gpexpand -i gpexpand_inputfile_xxxxxxxx_xxxxxx -D gpexpand_schame_db #上面生成扩容配置文件时新建的 db
1
2
3
4
5
2
3
4
5
提示
greenplum-6扩容期间,会在 postgres 下面新建一个 gpexpand schema。 greenplum-5扩容期间, 使用我们手工建立并指定的 gpexpand_schame_db 数据库来存储扩容期间的 schema 信息。
修改旧节点配置以便脚本正常使用
- conf/engine-master-hosts 和 conf/engine-segment-hosts 都改成最新的非 localhost 的地址
验证扩容后集群是否正常工作
首先挑选集群内存在的一张数据表 <DATA_TABLE>
和 表中的两个字段 <col1>
, <col2>
用于验证分析,数据表不用很大,几千行量级即可
sql
source /opt/hengshi/engine-cluster/export-cluster.sh;
psql hengshi;
DROP TABLE IF EXISTS test_redistribution;
CREATE TABLE test_redistribution WITH (APPENDONLY = true, ORIENTATION = COLUMN, COMPRESSTYPE = zlib, COMPRESSLEVEL = 5) as select * from <DATA_TABLE> DISTRIBUTED RANDOMLY;
select <col1>, count(<col2>) from test_redistribution group by <col1>; -- 这一步正常返回统计结果则集群正常
DROP TABLE IF EXISTS test_redistribution;
1
2
3
4
5
6
2
3
4
5
6
以上 sql 中,若查询语句 select <col1>, count(<col2>) from test_redistribution group by <col1>;
正常返回了结果,没有卡主或报错,则说明集群正常
Redistributing Tables。
注意
扩容后,新的表会分布到所有的 segment 上,但扩容前的表不会自动 redistributing。 执行 Redistributing Tables,数据量越大,时间也就越长,建议在空闲时期执行,如果时间太长可以使用-d/-e,具体参考 gpexpand。 参考 Redistributing Tables 获取更详细的信息。
- 自动重分布 自动重分布会对所有表做操作,耗时可能会非常久。所以如果大部分的表有定期的全量更新,也可以针对重点表手工先重分布,然后等业务流程自动全量更新刷新其余的表。
bash
source /opt/hengshi/engine-cluster/export-cluster.sh
gpexpand
1
2
2
- 手工操作,挑大表重分布
sql
create table schema.<NAME>_tmp WITH (APPENDONLY = true, ORIENTATION = COLUMN, COMPRESSTYPE = zlib, COMPRESSLEVEL = 5) as select * from schema.<NAME> DISTRIBUTED RANDOMLY;
drop table schema.<NAME>;
alter table schema.<NAME>_tmp rename to <NAME>;
1
2
3
2
3
移除扩容生成的 schema
bash
source /opt/hengshi/engine-cluster/export-cluster.sh
gpexpand -c
1
2
2
有镜像扩容
有镜像的扩容与无镜像的扩容,差别在配置扩容输入文件中需要添加镜像的配置文件,其他步骤相同。
配置文件示例,假设现在有两台机器,分别是 engine1和 engein2,每台有1个 segment,每个 segment 有1个 mirror,新增一个 segment,每个 segment 有1个镜像,则配置如下。
bash
engine1|engine1|25434|/opt/hengshi/engine-cluster/data/SegDataDir1|6|2|p
engine2|engine2|25434|/opt/hengshi/engine-cluster/mirror/SegDataDir1|7|2|m
engine2|engine2|25435|/opt/hengshi/engine-cluster/data/SegDataDir2|8|3|p
engine1|engine1|25435|/opt/hengshi/engine-cluster/mirror/SegDataDir2|9|3|m
1
2
3
4
2
3
4
回滚
如果在引擎扩容的过程中出现了错误,则需要进行回退。参考下面示例中的代码进行还原操作。
bash
cd /opt/hengshi
source engine-cluster/export-cluster.sh
gpexpand -r
1
2
3
2
3