greenplum-centOs7环境-组模式扩容

1.扩容说明

GreenPlum6.X目前支持以下版本操作系统:

Red Hat Enterprise Linux 64-bit 7.x

Red Hat Enterprise Linux 64-bit 6.x

CentOS 64-bit 7.x

CentOS 64-bit 6.xs

Ubuntu 18.04 LTS
建议采用7.3以上的7系列版本
本次扩容使用两个segment的节点.每个节点配置为2核心2GB,操作系统为CentOS7.6(组镜像,一次至少增加两个节点,增加数量为2的的整数倍)

gpsegment3,gpsegment4

主机名ip地址操作系统硬件配置规划
gpsegment3192.168.152.142CentOS7.62C2Gseg3,mirror
gpsegment4192.168.152.142CentOS7.62C2Gseg4,mirror

扩容GP主要分为三个步骤:

准备工作:包括操作系统安装,系统参数修改等

安装验证

执行扩容命令扩容数据库

安装时间2022-01-15
安装版本6.10.0
下载地址https://network.pivotal.io/products/pivotal-gpdb 或者中文下载地址: https://github.com/greenplum-db/gpdb/releases
文档说明https://gpdb.docs.pivotal.io/6-10/install_guide/platform-requirements.html 或者中文文档地址: http://docs-cn.greenplum.org/v6/homenav.html

2.准备工作(除了特殊说明,只需要在新增节点执行命令)

操作系统的安装和主机名,ip地址的配置这里就不进行讲解了.注意这里使用了一个专门用来节点之间数据交互的网段,下面的所有配置,需要在每个节点进行配置

2.1 配置host(所有节点执行)

#新增加点执行,配置原有节点的host和新增的host
echo "
192.168.152.138 gpmaster
192.168.152.146 gpsegment1
192.168.152.140 gpsegment2
192.168.152.142 gpsegment3
192.168.152.141 gpsegment4
" >> /etc/hosts

#原节点 执行 只需要配置新增的几个节点的host
echo "
192.168.152.142 gpsegment3
192.168.152.141 gpsegment4
" >> /etc/hosts

#cat 查看

cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.152.138 gpmaster
192.168.152.146 gpsegment1
192.168.152.140 gpsegment2
192.168.152.142 gpsegment3
192.168.152.141 gpsegment4

2.2 配置sysctl.conf文件

配置内核参数/etc/sysctl.conf,配置完成后sysctl -p生效

echo "
kernel.shmmax = $(expr $(getconf _PHYS_PAGES) / 2  $(getconf PAGE_SIZE))      #注意这里查看说明Shared Memory Pages
kernel.shmmni = 4096
kernel.shmall = $(expr $(getconf _PHYS_PAGES) / 2)
vm.overcommit_memory = 2     # 注意这里查看说明Segment Host Memory
vm.overcommit_ratio = 95      # 注意这里查看说明Segment Host Memory
net.ipv4.ip_local_port_range = 10000 65535   # See Port Settings
kernel.sem = 500 2048000 200 4096
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.all.arp_filter = 1
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.swappiness = 10
vm.zone_reclaim_mode = 0
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
vm.dirty_background_ratio = 3    # 注意这里查看说明System Memory
vm.dirty_ratio = 10
\#vm.dirty_background_bytes = 1610612736
\#vm.dirty_bytes = 4294967296 
" >> /etc/sysctl.conf

sysctl -p 

下面的上面几个关键参数配置的说明,根据不同的场景自行进行配置:

  • Shared Memory Pages

Greenplum数据库使用共享内存进行 Postgres 进程和 Postgres 实例之间的通信。 kernel.shmall可以在系统范围内使用的共享内存总量(以页为单位)。kernel.shmmax 设置单个共享内存段的最大大小(以字节为单位)。
kernel.shmall 和 kernel.shmmax值取决于系统的物理内存和页面大小。通常,两个参数的值都应为系统物理内存的一半。
使用操作系统变量 _PHYS_PAGES 和 页面大小 设置参数。

kernel.shmall =(_PHYS_PAGES / 2)
kernel.shmmax =(_PHYS_PAGES / 2)* PAGE_SIZE

计算的值 kernel.shmall 和 kernel.shmmax,使用以下命令运行以下命令 getconf 命令,该命令返回操作系统变量的值。

$ echo $(expr $ {(getconf _PHYS_PAGES)/ 2)
$ echo $ {expr $ {(getconf _PHYS_PAGES)/ 2 \ * $ {getconf PAGE_SIZE))

作为最佳做法,我们建议您在 /etc/sysctl.conf使用计算值的文件。例如,主机系统安装了1583 GB的内存,并返回以下值:_PHYS_PAGES = 395903676和PAGE_SIZE = 4096。内核 和 内核 值:

kernel.shmall = 197951838
kernel.shmmax = 810810728448

如果Greeplum Database master的共享内存配置与段主机不同,则_PHYS_PAGES和PAGE_SIZE值可能会有所不同,并且 内核 和 内核 主主机上的值将与段主机上的值不同。

Segment Host Memory

的 vm.overcommit_memoryOS使用Linux内核参数来确定可以为进程分配多少内存。对于Greenplum数据库,此参数应始终设置为2。
vm.overcommit_ratio是用于应用程序进程的RAM的百分比,其余部分保留给操作系统。在Red Hat Enterprise Linux上,默认值为50。
对于 vm.overcommit_ratio有关基于资源组的资源管理或基于资源队列的资源管理的调整和计算建议,请参阅《Geenplum数据库管理员指南》中的“ 配置段主机内存的选项”。另请参阅Greenplum数据库服务器配置参数 gp_vmem_protect_limit在“ Greenplum数据库参考指南”中
Port Settings

为避免在Greenplum初始化期间Greenplum数据库与其他应用程序之间的端口冲突,请记下操作系统参数指定的端口范围 net.ipv4.ip_local_port_range。使用初始化Greenplum时gpinitsystem群集配置文件,请不要在该范围内指定Greenplum数据库端口。例如,如果net.ipv4.ip_local_port_range = 10000 65535,将Greenplum数据库基本端口号设置为这些值。
PORT_BASE = 6000
MIRROR_PORT_BASE = 7000

System Memory

  • 对于内存超过64GB的主机系统,建议以下设置:
vm.dirty_background_ratio = 0
vm.dirty_ratio = 0
vm.dirty_background_bytes = 1610612736#1.5GB
vm.dirty_bytes = 4294967296#4GB

对于具有64GB或更少内存的主机系统,请卸下 vm.dirty_background_bytes 和 vm.dirty_bytes 并设置两个这些值的参数:

vm.dirty_background_ratio = 3
vm.dirty_ratio = 10

增加 vm.min_free_kbytes 确保 PF_MEMALLOC 来自网络和存储驱动程序的请求很容易满足。这对于具有大量系统内存的系统尤其重要。在这些系统上,默认值通常太低。使用此awk命令进行设置vm.min_free_kbytes 到建议的系统物理内存的3%:

awk'BEGIN {OFMT =“%.0f”;} / MemTotal / {打印“ vm.min_free_kbytes =”,$ 2 * .03;}'
               / proc / meminfo >> /etc/sysctl.conf 

不设置 vm.min_free_kbytes 超过系统内存的5%,因为这样做可能会导致内存不足情况。

虚拟机3Gb运行内存建议配置

echo "
#GP system config   -------begin
# kernel.shmall = _PHYS_PAGES / 2 # See Shared Memory Pages
#表示可用共享内存的总量,单位是页,一般此值与kernel.shmmax相等
kernel.shmall = 233163
# kernel.shmmax = kernel.shmall * PAGE_SIZE 
#表示单个共享内存段的最大值,以字节为单位,此值一般为物理内存的一半,不过大一点也没关系
kernel.shmmax = 955035648
#表示单个共享内存段的最小值,一般为4kB,即4096bit,也可适当调大,一般为4096的2-3倍
kernel.shmmni = 4096
#Linux下overcommit有三种策略,0:启发式策略,1:任何overcommit都会被接受。2:当系统分配的内存超过swap+N%*物理RAM(N%由vm.overcommit_ratio决定)时,会拒绝commit,一般设置为2
vm.overcommit_memory = 2 # See Segment Host Memory
vm.overcommit_ratio = 50 # See Segment Host Memory
net.ipv4.ip_local_port_range = 1025 65535 # See Port Settings
#该文件用于控制内核信号量,信号量是System VIPC用于进程间通讯的方法。
#建议设置:250 32000 100 128
#第一列,表示每个信号集中的最大信号量数目。
#第二列,表示系统范围内的最大信号量总数目。
#第三列,表示每个信号发生时的最大系统操作数目。
#第四列,表示系统范围内的最大信号集总数目。
#所以,(第一列)*(第四列)=(第二列)
kernel.sem = 250 512000 100 2048
#内核系统请求调试功能控制,0表示禁用,1表示启用
kernel.sysrq = 1
#这有利于多线程调试,0表示禁用,1表示启用
kernel.core_uses_pid = 1
#该文件指定一个消息队列的最大长度(bytes)。缺省设置:16384
kernel.msgmnb = 65536
#该文件指定了从一个进程发送到另一个进程的消息的最大长度(bytes)。进程间的消息传递是在内核的内存中进行的,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。缺省设置:8192
kernel.msgmax = 65536
#该文件指定消息队列标识的最大数目,即系统范围内最大多少个消息队列。
kernel.msgmni = 2048
#表示开启SYN Cookies,当SYN等待队列溢出时,启用cookies来处理,可以防范少量的SYN攻击,默认为0,表示关闭。1表示启用
net.ipv4.tcp_syncookies = 1
#该文件表示是否打开IP转发。0:禁止 1:转发 缺省设置:0
net.ipv4.ip_forward = 0
#是否允许源地址经过路由。0:禁止 1:打开 缺省设置:0
net.ipv4.conf.default.accept_source_route = 0
#增加TCP SYN队列长度,使系统可以处理更多的并发连接。一般为4096,可以调大,必须是4096的倍数,建议是2-3倍
net.ipv4.tcp_max_syn_backlog = 4096
#表示控制具体应该由哪块网卡来回应arp包,缺省设置0, 建议设置为1
net.ipv4.conf.all.arp_filter = 1
#进入包的最大设备队列.默认是1000,对重负载服务器而言,该值太低,可调整到16384/32768/65535
net.core.netdev_max_backlog = 4096
#最大socket读buffer,可参考的优化值:1746400/3492800/6985600
net.core.rmem_max = 2097152
#最大socket写buffer,可参考的优化值:1746400/3492800/6985600
net.core.wmem_max = 2097152
#当物理内存超过设置的值是开始使用swap的内存空间,计算公式是100-1=99%表示物理内存使用到99%时开始交换分区使用
#vm.swappiness = 10
#echo 0 > /proc/sys/vm/zone_reclaim_mode:意味着关闭zone_reclaim模式,可以从其他zone或NUMA节点回收内存。
#echo 1 > /proc/sys/vm/zone_reclaim_mode:表示打开zone_reclaim模式,这样内存回收只会发生在本地节点内。
#echo 2 > /proc/sys/vm/zone_reclaim_mode:在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存。
#echo 4 > /proc/sys/vm/zone_reclaim_mode:可以用swap方式回收内存。
vm.zone_reclaim_mode = 0
#系统脏页到达这个值,系统后台刷脏页调度进程 pdflush(或其他) 自动将(dirty_expire_centisecs/100)秒前的脏页刷到磁盘
vm.dirty_expire_centisecs = 500
#有效防止用户进程刷脏页,在单机多实例,并且使用CGROUP限制单实例IOPS的情况下非常有效。
vm.dirty_writeback_centisecs = 100
#系统内存>=64G 可以考虑设置以下参数
#vm.dirty_background_ratio = 0 # See System Memory
#vm.dirty_ratio = 0
#vm.dirty_background_bytes = 1610612736
#vm.dirty_bytes = 4294967296
#----end----
" >> /etc/sysctl.conf
sysctl -p 

2.3 配置limits.conf

配置资源使用限制/etc/security/limits.conf和/etc/security/limits.d/20-nproc.conf

echo "
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
" >> /etc/security/limits.conf


echo "
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.


*          soft    nproc     10132
root       soft    nproc     unlimited
"  >/etc/security/limits.d/20-nproc.conf

2.4 关闭防火墙和selinux

systemctl disable firewalld
systemctl stop firewalld
setenforce 0
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config

#或者执行下面的命令
#检查防火墙状态
systemctl status firewalld
#关闭防火墙
systemctl stop firewalld
#启动自动关闭
systemctl disable firewalld

2.5 创建gp用户

需要创建一个特定的用户运行gp,一般为gpadmin:

创建gpadmin用户组:  
groupadd -r -g 300 gpadmin 
useradd -r -m -g gpadmin -u 300 gpadmin  
echo gpadmin | passwd gpadmin --stdin

生成SSH key

su gpadmin
ssh-keygen -t rsa -b 4096
#一路回车

(可选择配置)配置visudo,保证gpadmin用户可以不需要密码进行sudo命令

visudo  #找到%wheel        ALL=(ALL)       NOPASSWD: ALL 取消其注释,意思是wheel组可以无密码sudo
usermod -aG wheel gpadmin   #将gpadmin加入到wheel组

2.6 安装依赖包

除了对操作系统的要求外,还需要安装一些常用的软件包或工具,例如sed,perl,tar等,这里你需要先配置yum源:

yum install -y apr apr-util bash bzip2 curl krb5 libcurl libevent libevent2 libxml2 \
libyaml zlib openldap openssh openssl openssl-libs perl readline rsync \
R sed tar zip apr apr-util libyaml libevent java ntp

2.7 创建数据目录(切换回root用户)

我们这里使用的磁盘为/dev/sdb ,挂载目录为/data

注意:
The only file system supported for running Greenplum Database is the XFS file system. All other file systems are explicitly not supported by Pivotal.
官网提示,gp只支持xfs文件系统,不支持其它文件系统

pvcreate /dev/sdb
vgcreate datavg /dev/sdb
lvcreate -L +49.9G -n datalv datavg
mkfs.xfs  /dev/datavg/datalv
mkdir /data
echo "/dev/datavg/datalv      /data                   xfs     nodev,noatime,nobarrier,inode64  0 0" >> /etc/fstab
mount -a
chown -R gpadmin:gpadmin /data

注意:本地虚拟机没有磁盘挂载,直接创建数据目录就可以

mkdir /data
chown -R gpadmin:gpadmin /data

2.8 磁盘IO配置(虚拟机vmware不需要执行)

预读值

  • 每个磁盘设备文件都应预读(块设备)值16384。要查看磁盘设备的预读值,请执行以下操作:
/sbin/blockdev --getra devname
例如,我们这里是sdb
[root@gp2 ~]# /sbin/blockdev --getra /dev/sdb
8192

要在设备上设置blockdev(预读):

/sbin/blockdev --setra bytes devname
例如:
/sbin/blockdev --setra 16384 /dev/sdb

需要将此配置添加到开机自动启动中:

echo "/sbin/blockdev --setra 16384 /dev/sdb" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local

磁盘IO调度

用于磁盘访问的Linux磁盘I / O调度程序支持不同的策略,例如 CFQ, AS, deadline。

  • 建议使用deadline调度程序选项。要在下一次系统重新引导之前指定调度程序,请运行以下命令:
echo schedulername > /sys/block/devname/queue/scheduler
例如:
echo deadline > /sys/block/sdb/queue/scheduler

永久生效,7.X中使用grup命令进行修改

grubby --update-kernel=ALL --args="elevator=deadline"
查看
grubby --info=ALL
或者使用下面查看:
cat  /sys/block/sdb/queue/scheduler

2.9 关闭透明大页(THP)(虚拟机vmware不需要执行)

同样的,在7.X系列中使用grup命令进行修改

grubby --update-kernel=ALL --args="transparent_hugepage=never"
检查是否修改成功:
cat /sys/kernel/mm/*transparent_hugepage/enabled
#结果
always [never]

2.10 SSH连接阈值

某些Greenplum数据库管理实用程序包括 gpexpand, gpinitsystem和 gpaddmirrors,请使用系统之间的SHELL(SSH)连接来执行其任务。在大型Greenplum数据库部署,云部署或每台主机具有大量分段的部署中,这些实用程序可能会超出主机的未认证连接的最大阈值。发生这种情况时,您会收到以下错误:ssh_exchange_identification:连接被远程主机关闭。
要增加Greenplum数据库系统的此连接阈值,请更新SSH MaxStartups 和 最大会话数 配置参数之一 /etc/ssh sshd_config 要么 /etc/sshd_config SSH守护程序配置文件。如果指定 MaxStartups 和 最大会话数 使用单个整数值,您可以确定并发未认证连接的最大数量(MaxStartups)以及每个网络连接允许的最大外壳程序,登录或子系统会话数(最大会话数)。例如:

MaxStartups 200
MaxSessions 200

如果指定 MaxStartups使用“ start:rate:full ”语法,可以通过SSH守护程序启用随机的早期连接删除。start标识允许的最大未经身份验证的SSH连接尝试次数。一旦达到未经身份验证的连接尝试的起始次数,SSH守护程序将拒绝后续连接尝试的速率百分比。“完全”标识未经身份验证的连接尝试的最大数量,之后所有尝试都将被拒绝。例如:

#查看
cat /etc/ssh/sshd_config
#修改
echo "
MaxStartups 10:30:200
MaxSessions 200
" >> /etc/ssh/sshd_config
systemctl restart sshd

2.11 时钟同步(NTP)

您应该使用NTP(网络时间协议)来同步组成Greenplum数据库系统的所有主机上的系统时钟。有关NTP的更多信息,请参见www.ntp.org。

在segment主机上的NTP应该配置为将master主机用作主要时间源,将备用主控机用作辅助时间源。在主备主机上,将NTP配置为指向首选时间服务器。

  • 在master节点配置数据中心的时间,例如我这里的ntp源为192.168.152.138
#查看
cat /etc/ntp.conf
#修改
echo "
server 192.168.152.138
" > /etc/ntp.conf

  • 在standby端配置master节点为优先,ntp源为次(我这里的环境,没有配置standby节点)
echo "
server gpmaster prefer
server 192.168.56.1
" > /etc/ntp.conf

  • 在数据节点配置为master节点的IP为优先,standby端为次
#查看
cat /etc/ntp.conf
#修改
echo "
server gpmaster prefer
servier gpmaster-standby prefer
" > /etc/ntp.conf
#没有standby 用下面的 
#查看
cat /etc/ntp.conf
#修改
echo "
server gpmaster prefer
" > /etc/ntp.conf

3.安装GP数据库软件

3.1 安装GP数据库

您必须在Greenplum数据库系统的每台主机上安装Greenplum数据库。Pivotal将Greenplum数据库软件作为可下载的软件包分发,您可以使用操作系统的软件包管理系统将其安装在每个主机系统上。您可以从Pivotal Network下载该软件包。
在开始安装Greenplum Database之前,请确保已完成“ 配置系统”中的步骤, 以配置Greenplum Database的每个主,备用主服务器和段主机。
重要:安装Greenplum数据库后,必须设置Greenplum数据库环境变量。请参阅设置Greenplum环境变量。
有关示例脚本,请参见Ansible Playbook示例,该脚本显示了如何自动创建gpadmin 用户并安装Greenplum数据库。
请按照以下说明安装Greenplum数据库。
重要提示:您需要sudo或root用户访问权限,才能从预构建的RPM或DEB文件进行安装。
下载Greenplum数据库软件包并将其复制到 gpadmin主机,备用主机和每个段主机上的用户主目录。分发文件名具有以下格式 greenplum-db- <版本>-<平台> .rpm 用于RHEL和CentOS系统,或 greenplum-db- <版本>-<平台> .deb 对于Ubuntu系统, <平台> 类似于 rhel7-x86_64 (Red Hat 7 64位)。

使用sudo(或root),使用系统的程序包管理器软件在每台主机上安装Greenplum Database程序包。

  • 对于RHEL / CentOS系统,执行命令:
#使用yum默认会将软件安装到/usr/local/greenplum-db-<版本>下
yum install -y  greenplum-db-6.10.0-rhel7-x86_64.rpm
#或者使用rpm
rpm -ivh  greenplum-db-6.10.0-rhel7-x86_64.rpm
#如果想将软件安装到指定目录下,必须使用rpm安装,并且指定安装目录
rpm -ivh  greenplum-db-6.10.0-rhel7-x86_64.rpm --prefix=/usr/local/gp6.10

使用 yum将会自动安装所依赖的软件包,并且将Greenplum数据库软件文件复制到版本特定的目录下 /usr/lcoal, /usr/local/greenplum-db-<版本>,并创建符号链接/usr/local/greenplum-db 到安装目录。

注意:如果是内网环境,yml不行进行下载,请使用rpm命令安装,安装前,请将依赖导入临时路径,并执行以下命令安装缺失的依赖

rpm -ivh  /app/gp/rpm/libsepol-devel-2.5-10.el7.x86_64.rpm
rpm -ivh  /app/gp/rpm/pcre-devel-8.32-17.el7.x86_64.rpm
rpm -ivh  /app/gp/rpm/pkgconfig-0.27.1-4.el7.x86_64.rpm
rpm -ivh  /app/gp/rpm/libverto-devel-0.2.5-4.el7.x86_64.rpm
rpm -ivh  /app/gp/rpm/libselinux-devel-2.5-14.1.el7.x86_64.rpm
rpm -ivh  /app/gp/rpm/libkadm5-1.15.1-37.el7_6.x86_64.rpm
rpm -ivh  /app/gp/rpm/libcom_err-devel-1.42.9-16.el7.x86_64.rpm
rpm -ivh  /app/gp/rpm/keyutils-libs-devel-1.5.8-3.el7.x86_64.rpm
rpm -ivh  /app/gp/rpm/krb5-devel-1.15.1-37.el7_6.x86_64.rpm
rpm -ivh  /app/gp/rpm/libevent-2.0.21-4.el7.x86_64.rpm
rpm -ivh  /app/gp/rpm/libyaml-0.1.4-11.el7_0.x86_64.rpm

#安装依赖 需要联网 ,此处的两个依赖是红帽版本缺失的
 yum install --downloadonly apr apr-util --downloaddir=/app/

#上面安装完成了之后,执行gp的安装命令
#gp安装命令
 rpm -ivh /app/gp/greenplum-db-6.10.0-rhel7-x86_64.rpm

将所有者和已安装文件的组更改为 gpadmin:

chown -R gpadmin:gpadmin /usr/local/greenplum*
chgrp -R gpadmin /usr/local/greenplum*
#其他路径的一些权限
chown -R gpadmin:gpadmin  /tmp
chown -R gpadmin:gpadmin  /root
chown -R gpadmin:gpadmin  /usr/local/greenplum-db-6.10.0/share/*
chown -R gpadmin:gpadmin  /usr/local/greenplum-db/share/*

3.2 配置SSH等价(切换gpadmin用户)

gpadmin每个Greenplum主机上的用户必须能够从群集中的任何主机SSH到群集中的任何其他主机,而无需输入密码或口令(称为“无口令SSH”)。

如果您启用了从主控主机到群集中其他所有主机的无密码SSH (“ 1- n无密码SSH”),则可以使用Greenplum数据库gpssh-exkeys命令行实用程序,以启用从每个主机到其他主机的无密码SSH

1.使用gpadmin登录到master节点

2.source环境变量

su gpadmin
ssh-keygen -t rsa
 
 source /usr/local/greenplum-db-6.10.0/greenplum_path.sh 

3.使用 ssh-copy-id 命令添加 gpadmin 用户的公钥 授权主机 群集中其他所有主机上的SSH文件

ssh-copy-id gpmaster
ssh-copy-id gpsegment1
ssh-copy-id gpsegment2
#上面的已经添加过的就不用添加了
ssh-copy-id gpsegment3
ssh-copy-id gpsegment4

测试ssh等价是否完成,使用下面命令都不需要输入密码则表示配置成功:

#测试
ssh gpmaster date
ssh gpsegment1 date
ssh gpsegment2 date
ssh gpsegment3 date
ssh gpsegment4 date

4.创建hostfile-exkeys文件

在里面 gpadmin 家目录,创建一个名为 hostfile_exkeys为计算机配置了Greenplum系统中每个主机(主机,备用主机和SEGMENT主机)的主机名和主机地址(接口名称)。确保没有空白行或多余的空格。检查 /etc/ hosts文件在您的系统上,以获取要用于您的环境的正确主机名。例如,我们这里:

echo "gpmaster
gpsegment1
gpsegment2
gpsegment3
gpsegment4" > ~/hostfile_exkeys

5.使用gpssh-exkeys启用无密码访问

[gpadmin@gp1 ~]$  gpssh-exkeys -f ~/hostfile_exkeys 
[STEP 1 of 5] create local ID and authorize on local host
  ... /home/gpadmin/.ssh/id_rsa file exists ... key generation skipped


[STEP 2 of 5] keyscan all hosts and update known_hosts file


[STEP 3 of 5] retrieving credentials from remote hosts
  ... send to gpmaster-priv
  ... send to gpsegment1
  ... send to gpsegment1-priv
  ... send to gpsegment2
  ... send to gpsegment2-priv


[STEP 4 of 5] determine common authentication file content


[STEP 5 of 5] copy authentication files to all remote hosts
  ... finished key exchange with gpmaster-priv
  ... finished key exchange with gpsegment1
  ... finished key exchange with gpsegment1-priv
  ... finished key exchange with gpsegment2
  ... finished key exchange with gpsegment2-priv


[INFO] completed successfully

6.使用gpssh确认免密码登录配置成功

要确保正确安装和配置了Greenplum软件,请从Greenplum master主机运行以下确认步骤。如有必要,请纠正任何问题,然后再继续执行下一个任务。

[gpadmin@gp1 ~]$ gpssh -f ~/hostfile_exkeys -e 'ls -l /usr/local/greenplum-db'
[gp1] ls -l /usr/local/greenplum-db
[gp1] lrwxrwxrwx 1 gpadmin gpadmin 30 Aug 27 12:27 /usr/local/greenplum-db -> /usr/local/ greenplum-db-6.10.0
[gp3] ls -l /usr/local/greenplum-db
[gp3] lrwxrwxrwx 1 gpadmin gpadmin 30 Aug 27 12:27 /usr/local/greenplum-db -> /usr/local/ greenplum-db-6.10.0
[gp2] ls -l /usr/local/greenplum-db
[gp2] lrwxrwxrwx 1 gpadmin gpadmin 30 Aug 27 12:27 /usr/local/greenplum-db -> /usr/local/ greenplum-db-6.10.0

如果安装成功,则会显示每个节点的gp的安装目录,如果还需要输入密码,则使用:
gpssh-exkeys -f ~/hostfile_exkeys
继续进行配置

3.3 在所有节点配置ssh等价

登录gpadmin用户,在其它所有的节点执行以下命令:

source /usr/local/greenplum-db-6.10.0/greenplum_path.sh 
echo "
source /usr/local/greenplum-db-6.10.0/greenplum_path.sh 
" >> ~/.bash_profile
. ~/.bash_profile
source /usr/local/greenplum-db-6.10.0/greenplum_path.sh 

echo "gpmaster
gpsegment1
gpsegment2
gpsegment3
gpsegment4" > ~/hostfile_exkeys
gpssh-exkeys -f ~/hostfile_exkeys 

配置完成使用相同的命令进行检查:

gpssh -f ~/hostfile_exkeys -e 'ls -l /usr/local/greenplum-db'
[gpadmin@gp3 local]$ gpssh -f ~/hostfile_exkeys -e 'ls -l /usr/local/greenplum-db'
[gp3] ls -l /usr/local/greenplum-db
[gp3] lrwxrwxrwx 1 gpadmin gpadmin 30 Aug 27 12:27 /usr/local/greenplum-db -> /usr/local/ greenplum-db-6.10.0
[gp1] ls -l /usr/local/greenplum-db
[gp1] lrwxrwxrwx 1 gpadmin gpadmin 30 Aug 27 12:27 /usr/local/greenplum-db -> /usr/local/ greenplum-db-6.10.0
[gp2] ls -l /usr/local/greenplum-db
[gp2] lrwxrwxrwx 1 gpadmin gpadmin 30 Aug 27 12:27 /usr/local/greenplum-db -> /usr/local/ greenplum-db-6.10.0
#如果能显示所有节点的安装软件,则表示配置成功

3.4 安装文件说明

关Greenplum数据库安装文件说明如下:

  • greenplum_path.sh—该文件包含Greenplum数据库的环境变量。请参阅设置Greenplum环境变量。

  • bin-此目录包含Greenplum数据库管理实用程序。此目录还包含PostgreSQL客户端和服务器程序,其中大多数也在Greenplum数据库中使用。

  • docs / cli_help-此目录包含Greenplum数据库命令行实用程序的帮助文件。

  • docs / cli_help / gpconfigs-此目录包含示例 gpinitsystem 在安装和初始化Greenplum数据库系统时可以修改和使用的配置文件和主机文件。

  • ext —一些Greenplum Database实用程序使用的捆绑程序(例如Python)。

  • influde — Greenplum数据库的C头文件。

  • lib — Greenplum数据库和PostgreSQL库文件。

  • sbin —支持/内部脚本和程序。

  • share — Greenplum数据库的共享文件

4.创建数据存储区域

4.1 在semgents实例创建存储区域

Greenplum数据库segment主机上的主要segment需要数据存储区。镜像段需要单独的存储区域。

1.创建一个名为 hostfile_gpssh_segexpend。,我们这里有两台新增的segment节点,使用内部网络:

echo "gpsegment3
gpsegment4 " > ~/hostfile_gpssh_segexpend

2.在master节点使用 gpssh 一次在所有segment主机上创建主数据目录和镜像数据目录位置 ,hostfile_gpssh_segexpend您刚创建的文件。例如:我们创建primary为主目录,mirror为镜像文件目录

source /usr/local/greenplum-db/greenplum_path.sh
gpssh -f ~/hostfile_gpssh_segexpend -e 'mkdir -p /data/primary'
gpssh -f ~/hostfile_gpssh_segexpend -e 'mkdir -p /data/mirror'
gpssh -f ~/hostfile_gpssh_segexpend -e 'chown -R gpadmin /data/*'

5.验证系统

验证您的硬件和网络性能。

Greenplum提供了一个名为 gpcheckperf,可用于识别Greenplum数据库阵列中计算机上的硬件和系统级问题。 gpcheckperf 在指定的主机上启动会话并运行以下性能测试:

  • 网络性能(gpnetbench *)
  • 磁盘I / O性能(dd 测试)
  • 内存带宽(流测试)

使用之前 gpcheckperf,您必须在性能测试所涉及的主机之间建立受信任的主机设置。您可以使用该实用程序gpssh-exkeys更新已知的主机文件并在主机之间交换公钥(如果尚未这样做)。注意 gpcheckperf 调用 gpssh 和 gpscp,因此这些Greenplum实用程序必须位于您的 $ PATH。

5.1 验证网络性能

要测试网络性能,请运行 gpcheckperf 使用网络测试运行选项之一:并行对测试(r),串行对测试(-rn)或全矩阵测试(-R M)。

该实用程序运行一个网络基准程序,该程序将5秒钟的数据流从当前主机传输到测试中包括的每个远程主机。默认情况下,数据以并行方式传输到每个远程主机,最小,最大,平均和中值网络传输速率以每秒兆字节(MB)报告。如果结果传输速率比预期的慢(小于100 MB / s),则可以使用以下命令连续运行网络测试-rn选项以获得每个主机的结果。要运行全矩阵带宽测试,您可以指定-RM这将导致每个主机从指定的每个其他主机发送和接收数据。此测试最适合用来验证交换结构是否可以承受全矩阵工作负载。

Greenplum数据库阵列中的大多数系统都配置有多个网络接口卡(NIC),每个NIC都位于其自己的子网上。测试网络性能时,单独测试每个子网很重要。例如,我们目前的环境有两个网段分别为业务网端192.168.56.0和内部网段12.12.12.0 那么就需要测试这两个网段的性能:

这里我们master上创建单独的主机文件,存放网段的主机名:

echo "gpsegment1
gpsegment2
gpsegment3
gpsegment4" >~/seg_host1

使用gpcheckperf 进行网络测试:

gpcheckperf -f ~/seg_host1 -r N -d /tmp

##第一个网段测试:
[gpadmin@gpmaster ~]$ gpcheckperf -f /home/gpadmin/seg_host1 -r N -d /tmp
/usr/local/greenplum-db-6.10.0/bin/gpcheckperf -f /home/gpadmin/seg_host1 -r N -d /tmp

-------------------
--  NETPERF TEST
-------------------
NOTICE: -t is deprecated, and has no effect
NOTICE: -f is deprecated, and has no effect
NOTICE: -t is deprecated, and has no effect
NOTICE: -f is deprecated, and has no effect
NOTICE: -t is deprecated, and has no effect
NOTICE: -f is deprecated, and has no effect
NOTICE: -t is deprecated, and has no effect
NOTICE: -f is deprecated, and has no effect

====================
==  RESULT 2022-01-21T10:43:33.589022
====================
Netperf bisection bandwidth test
gpsegment1 -> gpsegment2 = 212.630000
gpsegment3 -> gpsegment4 = 162.960000
gpsegment2 -> gpsegment1 = 141.360000
gpsegment4 -> gpsegment3 = 173.560000

Summary:
sum = 690.51 MB/sec
min = 141.36 MB/sec
max = 212.63 MB/sec
avg = 172.63 MB/sec
median = 173.56 MB/sec

[Warning] connection between gpsegment3 and gpsegment4 is no good
[Warning] connection between gpsegment2 and gpsegment1 is no good
[Warning] connection between gpsegment4 and gpsegment3 is no good
You have new mail in /var/spool/mail/root
[gpadmin@gpmaster ~]$ 


5.2 验证磁盘IO和内存带宽

要测试磁盘和内存带宽性能,请运行 gpcheckperf 带有磁盘和流测试运行选项(-r ds)。磁盘测试使用dd命令(标准UNIX实用程序)以测试逻辑磁盘或文件系统的顺序吞吐性能。内存测试使用STREAM基准程序来测量可持续的内存带宽。结果以MB /秒(MB / s)报告。

1.创建一个包含所有segment节点的主机名文件hostfile_gpcheckperf

echo "gpsegment1
gpsegment2
gpsegment3
gpsegment4">~/hostfile_gpcheckperf

2.执行gpcheckperf 实用程序使用 hostfile_gpcheckperf您刚创建的文件。使用 -d选项以指定要在每个主机上测试的文件系统(您必须具有对这些目录的写访问权)。您将要测试所有主要和镜像段数据目录位置。例如我们这里:

gpcheckperf -f ~/hostfile_gpcheckperf -r ds -D \
  -d /data/primary -d  /data/mirror 
##如果有多个目录需要测试,则继续使用-d选项接目录位置
##下面是执行结果:
[gpadmin@gpmaster ~]$  source /usr/local/greenplum-db-6.10.0/greenplum_path.sh 
[gpadmin@gpmaster ~]$ gpcheckperf -f ~/hostfile_gpcheckperf -r ds -D   -d /data/primary -d  /data/mirror 
/usr/local/greenplum-db-6.10.0/bin/gpcheckperf -f /home/gpadmin/hostfile_gpcheckperf -r ds -D -d /data/primary -d /data/mirror

--------------------
--  DISK WRITE TEST
--------------------

--------------------
--  DISK READ TEST
--------------------

--------------------
--  STREAM TEST
--------------------

====================
==  RESULT 2022-01-21T11:54:40.535442
====================

 disk write avg time (sec): 1498.20
 disk write tot bytes: 32009879552
 disk write tot bandwidth (MB/s): 69.66
 disk write min bandwidth (MB/s): 2.47 [gpsegment1]
 disk write max bandwidth (MB/s): 33.10 [gpsegment3]
 -- per host bandwidth --
    disk write bandwidth (MB/s): 3.48 [gpsegment2]
    disk write bandwidth (MB/s): 33.10 [gpsegment3]
    disk write bandwidth (MB/s): 2.47 [gpsegment1]
    disk write bandwidth (MB/s): 30.62 [gpsegment4]


 disk read avg time (sec): 363.08
 disk read tot bytes: 32009879552
 disk read tot bandwidth (MB/s): 89.18
 disk read min bandwidth (MB/s): 15.22 [gpsegment4]
 disk read max bandwidth (MB/s): 31.68 [gpsegment1]
 -- per host bandwidth --
    disk read bandwidth (MB/s): 21.03 [gpsegment2]
    disk read bandwidth (MB/s): 21.25 [gpsegment3]
    disk read bandwidth (MB/s): 31.68 [gpsegment1]
    disk read bandwidth (MB/s): 15.22 [gpsegment4]


 stream tot bandwidth (MB/s): 51521.40
 stream min bandwidth (MB/s): 8734.20 [gpsegment2]
 stream max bandwidth (MB/s): 17679.30 [gpsegment4]
 -- per host bandwidth --
    stream bandwidth (MB/s): 8734.20 [gpsegment2]
    stream bandwidth (MB/s): 16290.10 [gpsegment3]
    stream bandwidth (MB/s): 8817.80 [gpsegment1]
    stream bandwidth (MB/s): 17679.30 [gpsegment4]

[gpadmin@gpmaster ~]$

6.扩容

通过执行gpexpand命令来完成新Instance的初始化操作。总体上来说,需要分三个阶段来运行gpexpand命令。第一阶段,通过运行gpexpand命令,生成扩容配置文件,一般来说,这个阶段只需要运行一次gpexpand命令。第二阶段,通过运行gpexpand命令,并指定扩容配置文件,gpexpand命令会创建新的Instance,并更新系统表信息,生成包含用于数据重分布的信息的gpexpand模式。第三阶段,通过运行gpexpand命令来完成数据的重分布,这一阶段,可能会多次运行gpexpand命令,数据重分布过程是可以中断并继续运行的,所以,允许管理员灵活的安排数据重分布的时间,直至所有数据表完成数据重分布。

6.1 生成扩展配置文件

gpexpand命令需要一个配置文件,来确定需要在哪些主机,以什么样的方式,创建哪些新的Instance,这个文件需要通过-i参数来提供。在GP数据库的Master主机上第一次执行gpexpand命令,而且没有指定-i参数,命令会进入一个交互界面,以获取必要的信息,然后自动生成一个扩容配置文件。

在交互式界面,需要提供新增的主机名,或者,通过gpexpand命令的-f参数提供一个主机名列表文件,如果指定了-f参数,只是不会再提示输入主机名,而其他信息仍然需要交互式确认。当然,如果可以自行生成扩容配置文件,这一步可以跳过。

  1. 使用gpadmin用户登录到需要扩容的GP集群的Master主机。

  2. 运行gpexpand命令。命令启动并进入交互界面,提示输入信息,以确定如何进行扩容操作,并提示,退出还是继续。

  3. 比如,不带任何参数的执行gpexpand命令,将会是如下形式的交互过程:

    Would you like to initiate a new System Expansion Yy|Nn (default=N): 
    > y  
    Enter a comma separated list of new hosts you want to add to your array. Do not include interface hostnames. **Enter a blank line to only add segments to existing hosts**[]: 
    > sdw002 . . . . . . 
    How many new primary segments per host do you want to add? (default=0):
    > 
    Generating configuration file... . . . . . . Input configuration file was written to 'gpexpand_inputfile_20200817_225256'.  
    Please review the file and make sure that it is correct then re-run with: gpexpand -i gpexpand_inputfile_20200817_225256  
    [INFO]:-Exiting... 
    
  4. 首先会询问是否要进行一个扩容操作,输入[y]以继续。

  5. 如果没有通过-f参数来指定一个扩容主机名清单文件,则会要求输入主机名,当有多个主机名时,使用英文逗号[,]分隔,不要输入子网端口的名称。例如

    **Enter a blank line to only add segments to existing hosts**[]: 
    > sdw002,sdw003,sdw004 
    
  6. 如果现有集群有Mirror,则会提示选择一个Mirror策略,可选项有spread、group,缺省如果不选择,Mirror策略为group。

  7. 询问希望为现有集群的每个计算节点主机,增加几个Primary,缺省为0,即,不增加现有计算节点主机上的Primary数量。新扩容主机上Primary的数量会保持与现有主机上Primary的数量一致。所以,假如现有每个计算节点主机上有8个

    Primary,如果不输入或者输入0,则,新扩容主机上Primary的数量也会是8个,如果输入数字2,则,扩容之后,所有计算节点主机上,都有10个Primary。

    How many new primary segments per host do you want to add? (default=0): 
    > 
    
  8. 对于6之前的版本,还会询问Primary的目录位置,这样,生成的扩容配置文件中,将会生成以输入的路径为参考路径的Primary工作目录,不要输入具体的工作目录的名称,gpexpand命令会在指定的目录下自动生成数据库的工作子目录。

    例如,现有的数据库工作目录为:

    /data/primary/gpseg0 
    /data/primary/gpseg1 
    

    为新扩容Primary指定的路径应该是这样:

    /data/primary 
    /data/primary 
    

    gpexpand会自动在/data/primary下创建gpseg2和gpseg3子目录。

  9. 对于6之前的版本,如果有Mirror,会询问Mirror的目录位置,这样,生成的扩容配置文件中,将会生成以输入的路径为参考路径的Mirror工作目录,不要输入具体的工作目录的名称,gpexpand命令会在指定的目录下自动生成数据库的工作子目录。

    例如,现有的数据库工作目录为:

    /data/mirror/gpseg0 
    /data/mirror/gpseg1 
    

    为新扩容Mirror指定的路径应该是这样:

    /data/mirror 
    /data/mirror
    

    gpexpand会自动在/data/mirror下创建gpseg2和gpseg3子目录。

    在上述步骤中需要输入的目录,在新扩容的主机上,必须已经存在,否则后续的扩容操作会报错说目录不存在,这些目录,gpadmin用户要有创建子目录的权限。在所有信息收集完成后,gpexpand命令会在当前路径生成一个库容配置文件。例如:

    gpexpand_inputfile_20220121_225256
    

6.2 扩容配置文件的格式

使用交互式界面生成扩容配置文件,可以满足一般的需求,如果对Mirror策略有特殊需求,则需要对扩容配置文件进行自定义。

GP6版本的扩容配置文件的格式是这样的:

 hostname|address|port|datadir|dbid|content|preferred_role

例如:

sdw003|sdw003-1|40000|/data/primary/gpseg4|6|4|p 
sdw003|sdw003-2|40001|/data/primary/gpseg5|7|5|p 
sdw004|sdw004-2|50000|/data/mirror/gpseg4|8|4|m 
sdw004|sdw004-1|50001|/data/mirror/gpseg5|9|5|m 

6.3 初始化新Instance

在完成了扩容配置文件的准备工作之后,就可以开始真正的扩容操作了,这一步,才是真正的让GP数据库集群的Instance数量增加的操作,之前一直都是在为这一步做充足的准备工作,因为,一旦初始化新的Instance成功了,是不可以回退的,所以,要在这之前,把性能测试做周密,确保扩容后可以达到预期的效果。

这一步操作,要么成功,要么失败报错,几乎没有什么步骤,如果报错,先进行扩容回退,然后,根据报错的信息解决问题,之后再重新尝试。

  1. 使用gpadmin用户登录到需要扩容的GP集群的Master主机。

  2. 执行gpexpand命令,通过-i参数指定扩容配置文件。例如:

    gpexpand -i gpexpand_inputfile_20220121_225256
    

gpexpand命令会检查是否已经有扩容模式存在,如果有,则不会继续执行,而是报错退出,所以,如果之前已经扩容成功了,要及时清理gpexpand模式,通过执行gpexpand -c来完成。如果在存储扩容模式的数据库中有用户定义的模式叫gpexpand,那么,很不幸,建议先修改这个名称,待扩容完成之后再改回这个名称,编者想说的是,在业务中使用这个模式名称,一定是一位神人。

在完成了新Instance初始化并启动,创建完成gpexpand模式,生成重分布的信息之后,gpexpand命令会输出成功的消息,并退出。

在完成新Instance的初始化之后,就可以在postgres数据库的gpexpand模式中,查看业务表的重分布的信息了。

6.4 扩容失败回退

如果扩容失败了,也就是gpexpand -i这一步操作,出现了报错失败,命令会提示,执行回退操作。如果此时数据库处于Down的状态,则,需要先将Master启动,再执行回退命令,启动master only模式,使用gpstart -m来完成。

扩容失败的回退操作,执行gpexpand,配合-r参数或者–rollback参数。例如:

$ gpexpand -r 

或者

$ gpexpand --rollback 

注意:如果扩容失败了,回退之后,首先要解决报错日志中提到的问题,之后再重新尝试扩容,否则,直接重新尝试,可能会得到相同的失败结果。

6.5 数据表的重分布

完成了新Instance的初始化之后,数据库加入了新的Instance,也加入了新的存储空间和计算资源,但原有的数据,仍然只存储在旧的Instance上,新的Instance上还是空的。所以,需要对数据表执行数据重分布的操作来重新平衡数据的分布。

在进行数据重分布时,数据库是可以正常使用的,实际上,完成了扩容配置之后,新的Instance已经成功加入数据库集群之中,从定性的角度来说,扩容已经完成,即便不进一步执行数据重分布操作,数据库的规模也不能回退到扩容前的状态。

在完成了新Instance的初始化之后,新创建的表,数据是分布在包括新增Instance在内的所有Instance上的,此时的集群,对于新创建的表来说,和直接初始化得到相同规模的集群,效果是完全一样的。只是,原有的那些表,数据还是倾斜的,数据只分布在之前规模较小的集群,这是通过gp_distribution_policy系统表的numsegments字段来区分的。

调整表的重分布顺序

对于一个数据数据重分布耗时可能会很久的系统来说,可以通过调整gpexpand模式下status_detail表的rank字段的值来调整数据表执行数据重分布的顺序,让一些更重要的表,先执行数据重分布操作,以尽早消除数据倾斜,将数据倾斜的影响降到最低。

要调整gpexpand.status_detail表的rank字段的值,需要先连接到postgres数据库(6之前的版本是gpexpand命令的-D参数指定的数据库),然后通过UPDATE命令来修改rank字段的值。例如:

=$ UPDATE gpexpand.status_detail SET rank=10; 
=$ UPDATE gpexpand.status_detail SET rank=1 WHERE fq_name = 'public.lineitem'; 
=$ UPDATE gpexpand.status_detail SET rank=2 WHERE fq_name = 'public.orders'; 

这三条SQL命令,首先是,将所有表的优先级调整到10,gpexpand生成的rank缺省值是2。然后将public.lineitem这张表的优先级调整为1,将public.orders这张表的优先级调整为2。当开始执行数据重分布操作时,第一张被执行的表将是rank值为1的表public.lineitem,其次是rank值为2的表public.orders,然后是gpexpand.status_detail中记录的其他表。虽然可以将一些表的名称gpexpand.status_detail中删除,这样gpexpand就不会对这些表进行数据重分布的操作,但是,编者建议不要这么做,因为这些表会一直以倾斜的状态遗留在系统中

使用gpexpand重分布数据

一般来说,执行数据重分布的操作,都是通过继续执行gpexpand命令来完成,虽然这个命令还有很多不如意的地方,比如,gpexpand命令对每张表,执行数据重分布操作时,都会显式的BEGIN事务和COMMIT事务,会Cache系统的类型,这些动作,对于一个规模很大的集群来说,会额外消耗很多的时间。编者最近也为此花了不少心思,改写了gpexpand重分布逻辑,将UPDATE操作替换为INSERT,在所有版本中都避免了UPDATE的锁冲突,同时,重新写了一个脚本来解决数据重分布的显式事务开销问题,本来也想继续修改gpexpand,但是发现动作太大,还是重写一个脚本更实用。

使用gpexpand命令来完成数据重分布,如同之前的两个阶段的操作一样,就是执行gpexpand命令即可。

  1. 使用gpadmin用户登录到需要扩容的GP集群的Master主机。

  2. 运行gpexpand命令。可以通过-d参数或者-e参数来指定数据重分布的时间。-d参数确定的是运行多长时间,-e参数确定的是结束的时间点。-d参数的格式是hh:mm:ss,-e参数的格式是YYYY-MM-DD hh:mm:ss。例如:

    $ gpexpand -d 60:00:00 
    

    命令会一直执行到,所有的表都已经完成了重分布,或者命令执行的时间长度达到了-d参数指定的长度,或者-e参数指定的时间点。缺省的(产品自带版本),gpexpand会在每完成一张表的数据重分布后,修改gpexpand.status_detail表中的状态。同时,在开始和结束命令时,gpexpand还会向gpexpand.status表中插入任务的开始和结束的记录,最后所有表都完成数据重分布时,gpexpand.status表中会插入一条status值为’EXPANSION COMPLETE’状态的记录,在此之后,数据重分布全部结束,再次执行gpexpand命令,将会检测gpexpand.status表中是否有status值为’EXPANSION COMPLETE’状态的记录,如果有,gpexpand命令将会直接退出。

监测数据重分布

在第二阶段,初始化新的Instance时,在gpexpand模式中,会创建一个视图,名为gpexpand.expansion_progress,在执行数据重分布期间,可以查询该视图来查看数据重分布的进展情况,这个视图会展示整体的重分布情况,包括未重分布的表数量,已经重分布的表的数量等信息,如果在第二阶段指定了-S参数,则会生成简单信息的视图定义,否则,会生成信息更全的视图定义,信息多,自然需要收集的信息也越多,在生成表清单时,即,在生成gpexpand.status_detail表的记录时,需要计算数据库集群中每张业务表的尺寸,这是一个非常耗时的操作,编者认为一般不需要这些详细信息。

对于每张表的重分布情况,可以查看gpexpand.status_detail表的记录,主要是记录每张表的重分布信息,是否还未开始,何时开始,正在重分布,何时完成等。

假如在第二阶段未指定-S参数,登录到postgres数据库,查询gpexpand.expansion_progress视图来查看数据重分布的详细情况。例如:

=# SELECT * FROM gpexpand.expansion_progress; 
name | value ------------------------------+----------------------- 
Bytes Left | 349539847977 
Bytes Done | 29872937423 
Estimated Expansion Rate | 891.2392397293 MB/s 
Estimated Time to Completion | 00:23:08.239082 
Tables Expanded | 32 
Tables Left | 293 (6 rows) 

对于在第二阶段指定了-S参数的情况来说,该视图只会显示处于不同状态的表的数量,不会有尺寸的统计,也不会有时间预估,实际上,时间的预估并不会很准确,因为数据重分布的性能不完全与尺寸相关,还与表的数量有很大关系,尺寸为0的表,重分布的耗时并不是0秒,因为事务的时间开销与数据量没有关系。

select * f rom gpexpand.status;

select * from gpexpand.status_detail

查看具体重分布进度: select * from gpexpand.expansion_progress

对于任何给定的表,用gpexpand重新它需要消耗和一次CREATE TABLE AS SELECT操作相同的时间

清除扩容用的模式

在完成所有的数据表的重分布操作之后,需要清理gpexpand模式,这样,在以后再进行扩容操作时,才不至于因为gpexpand模式已经存在而导致操作报错。对于6之前的版本来说,清理了gpexpand模式之后,还有必要将专门用于扩容的数据库删除,切记在6之前的版本,为扩容创建一个全新的空数据库,扩容完成之后,要清理并删除该数据库。

  1. 使用gpadmin用户登录到需要扩容的GP集群的Master主机。

  2. 使用带-c参数运行gpexpand命令。例如:

    $ gpexpand -c . . . . . . 
    Do you want to dump the gpexpand.status_detail table to file? Yy|Nn(default=Y): 
    > y 
    . . . . . . 
    

    编者建议,当询问,是否将扩容的重分布信息备份为文件时,建议选择备份,以便于以后还可以查看和再确认数据重分布的情况。

  • 28
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值