1. 引擎扩容
引擎扩容可以分为纵向和横向扩容两种方式。纵向扩容是指增加单台机器的segment数量。横向扩容是指增加机器数量,每台机器的segment数量保持不变。下面详细介绍在HENGSHI SENSE上如何使用上述两种方式进行引擎扩容。
1.1. 扩容前现有系统准备工作
扩容前请完成如下准备工作
- 停止HENGSHI以及其他会使用引擎的服务。
${HENGSHI_HOME}/bin/hengshi-sense-bin stop hengshi
清理数据膨胀 分为下面两种场景
- 日常还没有通过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
两个字段本机的域名和地址修改成局域网内可区分不同机器的域名和地址
例如查询当前环境:
$ 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)
- greenplum5 ```shell $ psql psql (8.3) Type "help" for help.
set allow_system_table_mods='DML';
update gp_segment_configuration set address = '
+ greenplum6
```shell
psql (9.4.24)
Type "help" for help.
set allow_system_table_mods='true';
update gp_segment_configuration set address = '<new_ip>' where address = localhost';
update gp_segment_configuration set hostname = '<new_hostname>' where hostname = 'localhost';
1.2. 增加机器扩容
1.2.1. 扩容前新机器准备工作
横向扩容前需要在新机器上进行如下准备工作。
- 增加执行用户,示例中用户名为hengshi。
grep hengshi /etc/passwd > /dev/null || sudo useradd -m hengshi sudo mkdir -p /opt/hengshi && sudo chown hengshi:hengshi /opt/hengshi
- 服务端sshd监听非22端口。
安装所涉及的机器包括本机以及HS_ENGINE_SEGMENTS变量中配置的机器,如有非ssh 22端口的情况,需要在部署用户 ~/.ssh/config中配置各个host的实际端口。
本机需要配置localhost和hostname命令返回域名的端口。例如: 本机配置hostname为localhost,并且HS_ENGINE_SEGMENTS=(Node-A),对应的监听端口都为122。
在.ssh/config配置文件中需要包含以下配置:Host localhost Port 122 Host Node-A Port 122
- 在新机器上配置ssh无密码登录。
- 创建安装路径,实例中安装路径为
/opt/hengshi
。sudo mkdir -p /opt/hengshi && sudo chown hengshi:hengshi /opt/hengshi
- 安装HENGSHI SENSE。
sudo su - hengshi #切换到产品运行用户 cd ~/pkgs/hengshi-sense-[version] #切换到解压目标目录 ./hs_install -p /opt/hengshi #执行安装
- 在sudo权限下,初始化OS。
sudo su - hengshi #切换到产品运行用户 cd /opt/hengshi #进入安装目标目录 bin/hengshi-sense-bin init-os all #初始化os
- 检查新旧环境greenplum版本需要一致
衡石安装目录lib下gpdb软链接指向当前使用的greenplum版本, 检查旧机器和新扩容机器上gpdb软链接指向的版本是否一致,如果不一致需要将旧机器上的greenplum拷贝到新机器并修改新机器gpdb软链接指向旧机器的greenplum版本
例如: node1旧机器上
node2新机器上hengshi@node1$ cd /opt/hengshi hengshi@node1$ ls lib/gpdb -l lrwxrwxrwx 1 hengshi hengshi 20 Oct 11 23:03 lib/gpdb -> gpdb-6.2.1.1-centos7
此时两个gpdb版本不一致hengshi@node2$ cd /opt/hengshi hengshi@node2$ ls lib/gpdb -l lrwxrwxrwx 1 hengshi hengshi 21 Oct 11 23:03 lib/gpdb -> gpdb-6.18.1.1-centos7
gpdb-6.2.1.1-centos7 != gpdb-6.18.1.1-centos7
因为新机器使用的安装包并不是旧机器环境所用的安装包,需要将旧机器gpdb拷贝到新机器并修改新机器gpdb软链接$ ssh node1 hengshi@node1$ cd /opt/hengshi/lib hengshi@node1$ rsync -avzP gpdb-6.2.1.1-centos7 node2:/opt/hengshi/lib/ hengshi@node1$ ssh node2 "cd /opt/hengshi/lib; rm -f gpdb; ln -s gpdb-6.2.1.1-centos7 gpdb"
1.2.2. 扩容操作
扩容分为无镜像扩容和有镜像扩容。
无镜像扩容
生成扩容配置文件
先准备一个new-host文件,里面写上新增的hostname,请不要重复。 如果无新增host就用空文件,参考下面示例。
engine2
执行下面命令生成扩容配置文件。示例中包含了greenplum-6和greenplum-5两种扩容命令,执行时请根据环境选择对应的命令。 ```shell cd /opt/hengshi source engine-cluster/export-cluster.sh
2. greenplum-6
gpexpand -f new-host
3. greenplum-5
psql -c 'create database gpexpand_schame_db' # greenplum 临时存储schema的数据库, 可以临时建立一个 gpexpand -f new-host -D gpexpand_schame_db
3. 根据提示填写信息,生成扩容配置文件。
```shell
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'
等待执行结果,示例中 gpexpand_inputfile_20210806_121646就是生成的扩容配置文件。
```shell
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...
```
配置文件格式说明。
<hostname>|<address>|<port>|<datadir>|<dbid>|<content>|<preferred_role>
其中preferred_role值是p或m,决定这个segment是主节点还是镜像,p表示主节点,m表示镜像。
假设现有两台机器,分别是engine1、engine2,每台机器有1个segment,现在每台机器上新增一个segment,文件命名为 gpexpand_inputfile,则配置文件内容如下。
engine1|engine1|25433|/opt/hengshi/engine-cluster/data/SegDataDir1|4|2|p engine2|engine2|25433|/opt/hengshi/engine-cluster/data/SegDataDir2|5|3|p
执行扩容
执行如下命令进行扩容,扩容过程中需要使用上一步生成的gpexpand_inputfile_xxxxxxxx_xxxxxx文件。
cd /opt/hengshi
source engine-cluster/export-cluster.sh
# greenplum-6
gpexpand -i gpexpand_inputfile_xxxxxxxx_xxxxxx
# greenplum-5
gpexpand -i gpexpand_inputfile_xxxxxxxx_xxxxxx -D gpexpand_schame_db #上面生成扩容配置文件时新建的db
说明:
greenplum-6扩容期间,会在postgres下面新建一个 gpexpand schema。
greenplum-5扩容期间, 使用我们手工建立并指定的 gpexpand_schame_db数据库来存储扩容期间的schema信息。
修改旧节点配置以便脚本正常使用
- conf/engine-master-hosts和conf/engine-segment-hosts都改成最新的非localhost的地址
Redistributing Tables。
注意:
扩容后,新的表会分布到所有的segment上,但扩容前的表不会自动redistributing。
执行 Redistributing Tables,数据量越大,时间也就越长,建议在空闲时期执行,如果时间太长可以使用-d/-e,具体参考 gpexpand。
参考 Redistributing Tables 获取更详细的信息。
自动重分布 自动重分布会对所有表做操作,耗时可能会非常久。所以如果大部分的表有定期的全量更新,也可以针对重点表手工先重分布,然后等业务流程自动全量更新刷新其余的表。
source /opt/hengshi/engine-cluster/export-cluster.sh gpexpand
手工操作,挑大表重分布
create table schema.<NAME>_tmp WITH (APPENDONLY = true, ORIENTATION = COLUMN, COMPRESSTYPE = zlib, COMPRESSLEVEL = 5) as select * from schema.<NAME> DISTRIBUTED RANDOMLY; alter table rename schema.<NAME>_tmp to <NAME>;
移除扩容生成的schema
source /opt/hengshi/engine-cluster/export-cluster.sh
gpexpand -c
有镜像扩容
有镜像的扩容与无镜像的扩容,差别在配置扩容输入文件中需要添加镜像的配置文件,其他步骤相同。
配置文件示例,假设现在有两台机器,分别是engine1和engein2,每台有1个segment,每个segment有1个mirror,新增一个segment,每个segment有1个镜像,则配置如下。
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
3.1. 回滚
如果在引擎扩容的过程中出现了错误,则需要进行回退。参考下面示例中的代码进行还原操作。
cd /opt/hengshi
source engine-cluster/export-cluster.sh
gpexpand -r