Greenplum数据库在使用过程中,根据使用情况要进行节点扩展,实际就是增加segment节点。表的重新分布是指,新增segment节点之后,原集群系统中的数据会重新分布到当前集群的所有节点中。
一、节点扩展过程:
1.对所有新增节点的计算机进行优化和更新,和原数据库系统在安装时的操作一样,保证执行扩展时,不会由于缺少组件导致无法执行,这些操作可以参考自动部署脚本中的说明文件。
2.把新增节点的IP信息和原集群节点的IP信息,统一编写到所有节点的hosts文件中,使节点之间可以通过节点名称进行访问。
3.在新增节点上安装一套GP数据库,和初始安装一样,首先在一个节点上进行安装,然后系统会自动通过SSH把文件分布到所有节点上,但此时注意,用来扩展的安装不需要创建MASTER目录,不需要进行节点初始化。
gpseginstall -f newhosts -u gpadmin -p xxxxxx
4.在原集群上执行交换key,让所有节点之间建立信任关系。
gpssh-exkeys -e existhosts -x newhosts
existhosts为现有主机名,newhosts为新增主机名。
5.在新增节点下创建数据目录,这个目录可以不和原数据库的结构一样,但是必须给目录赋予数据库用户的执行权限和相应所属。
6.创建扩展配置文件,在主库的bin目录下执行,注意原库需要运行中,首先编辑一个文本,里面每行是一个新节点的节点名或IP地址。例如文件名为:newhosts
./gpexpand -f newhosts -D 原库名
生成一个名为:gpexpand_inputfile_Date,的文件,其中的内容如下:
node05:192.168.153.170:50003:/data/gp_data:74:39:m:51003
<hostname>:<address>:<port>:<fselocation>:<dbid>:<content>:<preferred_role>:<replication_port>
hostname 主机名
address IP地址,可以用主机名
port segment监听端口
fselocation segment data目录,注意是全路径
dbid greenplum集群的唯一ID,可以到gp_segment_configuration中获得,必须顺序累加
content 可以到gp_segment_configuration中获得,必须顺序累加
prefered_role 角色(p或m)(primary , mirror)
replication_port 如果没有mirror则不需要(用于replication的端口)。
具体来说,首先GP这个gpexpand文件有个问题,执行时他会问你“How many new primary segments per host do you want to add? (default=0)”,常规理解如果我一个primary目录下有一个gpseg数据目录,那我输入1,以此类推,但其实如果你要生成1个gpseg目录,则要输入0,并且这个时候直接会生成配置文件,目录结构会和原库正在运行的数据库的目录完全一致,如果输入了1,则预示primary下有2个gpseg数据目录,则后面他会问你这个primary和mirror目录在哪儿,这里只输入一次,但生成文件的时候有两部分,一部分是和原库完全相同的目录结构,另一部分是刚刚输入了新位置的primary和mirror,显然自动生成的配置文件只有在选择primary segments为0的时候是最直接最不用人为干预的。
所以这个文件我们可以自己生成,具体看一下内容:
node03:node03:40000:/data/gpdata/primary/gpseg2:6:2:p:41000
记录的主要信息来自原库的gp_segment_configuration表,查询可得当前情况:
gpdb_test=# select * from gp_segment_configuration;
dbid | content | role | preferred_role | mode | status | port | hostname | address | replication_port
------+---------+------+----------------+------+--------+-------+----------+---------+------------------
1 | -1 | p | p | s | u | 5432 | node01 | node01 |
2 | 0 | p | p | s | u | 40000 | node01 | node01 | 41000
3 | 1 | p | p | s | u | 40000 | node02 | node02 | 41000
4 | 0 | m | m | s | u | 50000 | node02 | node02 | 51000
5 | 1 | m | m | s | u | 50000 | node01 | node01 | 51000
(5 rows)
原库在物理分布上,一共使用了两台电脑,首先MASTER和一个PRIMARY在一起,我们不管MASTER节点,只看primary和mirror,dbid和content是比较重要的,首先后续无论增加多少节点,所有的dbid均为递增排序,而content则从这个表最大的1开始增加,一个primary和一个mirror对应为一组,公用一个相同的content,那么新增的content应该就是2,相同一组的primary和mirror均是2,怎讲叫一组呢,这和节点部署方案有关,无论是新装数据库还是扩展数据库,都会选择使用grouped部署还是spread部署,如果选择grouped,则所有mirror节点和他相对应的primary节点都后搓一位,也就是如果primary节点按0-1-2-3排列,则mirror节点则按3-0-1-2排列,grouped允许最少一个primary segment,即一组primary和mirror在同一台物理机器上,而spread分布至少需要两个物理节点,因为他的mirror节点要求顺序分布在当前节点的之后的节点。分布新的content再增加则都是3,而新增的p和m两个节点,dbid各自随原库的dbid增加,6和7。以此我们手写配置文件,若增加两个物理节点,之间彼此存放primary和mirror目录,则按如下方式:
node07:node07:40000:/data/gpdata/primary/gpseg2:6:2:p:41000
node08:node08:50000:/data1/gpdata/mirror/gpseg2:7:2:m:51000
node08:node08:40000:/data/gpdata/primary/gpseg3:8:3:p:41000
node07:node07:50000:/data1/gpdata/mirror/gpseg3:9:3:m:51000
其中我们要注意,文件目录先要进行创建,并且需要给数据库用户相应的权限和所属,gpseg目录会由扩展功能自动创建,但上层目录必须手动添加,也就是数据库用户必须有创建gpseg目录位置的权限。
gpseg目录的编号,和content编号一致,这样整个数据库完成扩展后,所有的gpseg目录没有重复。
端口:同一个节点下,primary和mirror中如果有多个gpseg,则注意节点不要重复即可。
上面的两个节点,4条记录的排列是grouped模式的primary和mirror分布规则,如果是spread分布,则content编号的排列会有不同:
如图所示,spread分布时,也是PX和MX为一组,但是一个机器上的primary的对应mirror,会顺序排列在后面逐个节点上,如此图,主机1上p0的m0在主机2上,同时主机1p1的m1后续排列在主机3上,以此类推。
假如我们有4个节点:node06,node07,node08,node09,每个节点上有2个primary和2个mirror,则通过整理得出配置文件如下:
node06:node06:40000:/data/gpdata/primary/gpseg3:6:3:p:41000
node07:node07:50000:/data1/gpdata/mirror/gpseg3:7:3:m:51000
node06:node06:40001:/data/gpdata/primary/gpseg4:8:4:p:41001
node08:node08:50001:/data/gpdata/mirror/gpseg4:9:4:m:51001
node07:node07:40000:/data/gpdata/primary/gpseg5:10:5:p:41000
node08:node08:50000:/data1/gpdata/mirror/gpseg5:11:5:m:51000
node07:node07:40001:/data/gpdata/primary/gpseg6:12:6:p:41001
node09:node09:50001:/data/gpdata/mirror/gpseg6:13:6:m:51001
node08:node08:40000:/data/gpdata/primary/gpseg7:14:7:p:41000
node09:node09:50000:/data1/gpdata/mirror/gpseg7:15:7:m:51000
node08:node08:40001:/data/gpdata/primary/gpseg8:16:8:p:41001
node06:node06:50001:/data/gpdata/mirror/gpseg8:17:8:m:51001
node09:node09:40000:/data/gpdata/primary/gpseg9:18:9:p:41000
node06:node06:50000:/data1/gpdata/mirror/gpseg9:19:9:m:51000
node09:node09:40001:/data/gpdata/primary/gpseg10:20:10:p:41001
node07:node07:50001:/data/gpdata/mirror/gpseg10:21:10:m:51001
根据规则进行分组排列,重新排序dbid和content编号。
7.执行节点插入
gpexpand -i gpexpand_inputfile_20171217_111125 -D greenplum-db_test
8.插入失败,执行回滚。
echo "y"|gpstart -R
./gpexpand --rollback -D gpdb_test
echo "y"|gpstart -a
二、表的重新分布
执行扩展后,执行gpstate -m,若节点状态是Synchronized,说明该节点已经完成同步,可以开始执行分布。
gpexpand -a -d 1:00:00 -D greenplum-db_test
-a表示重分布后执行ANALYZE统计表信息
-d表示预计执行时间
-D表示执行的数据库
-S表示显示简单的进程视图
-t表示指定Segment节点的临时目录,用来存放tar包文件
-n表示并行度
重分布结束后,执行清理操作:
gpexpand -c -D greenplum-db_test