一系统环境及硬件
1.系统版本 centos 7.7
2.硬件
-
cpu :>= 8核16线程
根据实际并发量来考量,比如 8 并发,每个seg里面有2个数据节点,那么cpu应该是 8*2*2=20核32线程,如果都是小查询,核心数 可以适当降低
- 内存 :>= 16 GB
- 磁盘 :sas盘15k转速,固态最好。生产环境上硬盘使用率最好 <30%
-
物理机:
系统盘:独立一块盘(最好做raid10),即2块盘 数据盘:(根据seg中节点数来做raid0),如一个seg中2个节点,可以做2个raid组,每个节点放在不同的raid上,充分利用IO
-
虚拟机:建议系统盘和数据盘分开挂载
系统盘: >64GB 数据盘:按需分配
-
网络:
多网口(卡): 客户端网络(可以千兆,万兆) 内部网网络(万兆),网络性能对GP影响最大 单网口(卡):万兆即10Gbit
3.集群规模
master :1 台
segment :3 台
standby :1 台
二.安装部署
1.下载离线安装包
https://github.com/greenplum-db/gpdb/releases/tag/6.1.0
2.上传到服务器,放在/usr/local/src下
3.关闭防火墙
- 关闭防火墙(所有机器)
iptables (centos6.x)
关闭:service iptables stop
永久关闭:chkconfig iptables off
- 检查firewalld (centos 7.x)
关闭:systemctl stop firewalld
永久关闭 :systemctl disable firewalld
4.关闭SELINUX(所有机器)
[root@mdw ~]# vi /etc/selinux/config
确保SELINUX=disabled
5.配置/etc/hosts (所有机器)
为之后GP在各个节点之间相互通信做准备。
修改各台主机的主机名称。 一般建议的命名规则如下: 项目名_gp_节点
Master : dis_gp_mdw
Standby Master : dis_gp_smdw
Segment Host : dis_gp_sdw1 dis_gp_sdw2 dis_gp_sdw3 以此类推
如果Standby也搭建在某Segment host下,则命名为:dis_gp_sdw3_smdw
[root@mdw ~]# vi /etc/hosts
添加每台机器的ip 和hostname,确保所有机器的/etc/hosts中包含以下信息:
10.16.162.166 dis-gp-mdw
10.16.162.151 dis-gp-sdw1
10.16.162.152 dis-gp-sdw2
10.16.162.153 dis-gp-sdw3-smdw
6.修改主机名
Centos7.x vi /etc/hostname
Centos6.x vi /etc/sysconfig/network
修改完之后 reboot机器
7.配置sysctl.conf(所有机器)
kernel.shmall = 197951838 # echo $(expr $(getconf _PHYS_PAGES) / 2)
kernel.shmmax = 810810728448 # echo $(expr $(getconf _PHYS_PAGES) / 2 \* $(getconf PAGE_SIZE))
kernel.shmmni = 4096
vm.overcommit_memory = 2
vm.overcommit_ratio = 75 #vm.overcommit_ratio = (RAM - 0.026 * gp_vmem_rq) / RAM #gp_vmem_rq = ((SWAP + RAM) – (7.5GB + 0.05 * RAM)) / 1.7
net.ipv4.ip_local_port_range = 10000 65535
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.min_free_kbytes = 487119#awk 'BEGIN {OFMT = "%.0f";} /MemTotal/ {print "vm.min_free_kbytes =", $2 * .03;}' /proc/meminfo
#对于大于64GB的主机,加上下面4行
vm.dirty_background_ratio = 0
vm.dirty_ratio = 0
vm.dirty_background_bytes = 1610612736 # 1.5GB
vm.dirty_bytes = 4294967296 # 4GB
#对于小于64GB的主机删除dirty_background_bytes dirty_bytes,加上下面2行
vm.dirty_background_ratio = 3
vm.dirty_ratio = 10
#vm.min_free_kbytes在内存 > 64GB系统的时候可以设置,一般比较少设置此参数。
#vm.min_free_kbytes,确保网络和存储驱动程序PF_MEMALLOC得到分配。这对内存大的系统尤其重要。一般系统上,默认值通常太低。可以使用awk命令计算vm.min_free_kbytes的值,通常是建议的系统物理内存的3%:
#awk 'BEGIN {OFMT = "%.0f";} /MemTotal/ {print "vm.min_free_kbytes =", $2 * .03;}' /proc/meminfo >> /etc/sysctl.conf
#不要设置 vm.min_free_kbytes 超过系统内存的5%,这样做可能会导致内存不足。
8.配置资源限制参数(所有机器)
在/etc/security/limits.conf文件下增加以下参数
* soft nofile 524288
* hard nofile 524288
* soft nproc 131072
* hard nproc 131072
“*” 星号表示所有用户
noproc 是代表最大进程数
nofile 是代表最大文件打开数
RHEL / CentOS 6.X
修改:/etc/security/limits.d/90-nproc.conf 文件的nproc
[root@mdw ~]# vi /etc/security/limits.d/90-nproc.conf
确保 * soft nproc 131072
RHEL / CentOS 7.X 修改:
修改:/etc/security/limits.d/20-nproc.conf 文件的nproc
[root@mdw ~]# vi /etc/security/limits.d/20-nproc.conf
确保 * soft nproc 131072
ulimit -u 命令显示每个用户可用的最大进程数 max user processes,验证返回值为131072.
9.XFS挂载选项
XFS相比较ext4具有如下优点:
XFS的扩展性明显优于ext4,ext4的单个文件目录超过200W个性能下降明显
ext4作为传统文件系统确实非常稳定,但是随着存储需求的越来越大,ext4渐渐不在适应
由于历史磁盘原因,ext4的inode个数限制(32位),最多只能支持40多亿个文件,单个文件最大支持到16T
XFS使用的是64位管理空间,文件系统规模可以达到EB级别,XFS是基于B+Tree管理元数据
GP 需要使用XFS的文件系统,RHEL/CentOS 7 和Oracle Linux将XFS作为默认文件系统,SUSE/openSUSE已经为XFS做了长期支持。
centos6.x需要先安装xfs包
centos7.x不需要先安装
例如挂载新xfs步骤:
1.[root@mdw ~]# fdisk /dev/sdd
然后跟着n,p,1提示做下去,最后wq保存退出
[root@mdw ~]# mkfs.xfs /dev/sdd1
2.挂载目录
[root@mdw ~]# mount /dev/sdd1 /data/master
3.设置自动挂载
[root@mdw ~]# vi /etc/fstab
/dev/sdd1 /data xfs rw,noatime,inode64,allocsize=16m 0 0
10.磁盘I/O 预读大小设置
- 临时生效
[root@mdw ~]# /sbin/blockdev --setra 16384 /dev/sda
- 永久生效
[root@mdw ~]# vi /etc/rc.d/rc.local
blockdev --setra 16384 /dev/sdd*
11.修改rc.local 权限
必须在启动时可以运行 rc.local文件。
例如,在RHEL / CentOS 7系统上,设置文件的执行权限。
[root@mdw ~]# chmod + x /etc/rc.d/rc.local
12.磁盘I/O调度算法(确保是deadline)
centos7默认就是deadline
[root@mdw ~]# more /sys/block/sdd/queue/scheduler
noop anticipatory [deadline] cfq
如上所示,就不需要修改,否则按下面操作
RHEL 6.x or CentOS 6.x 可以修改 /boot/grub/grub.conf,增加 elevator=deadline 例如:
RHEL 7.x or CentOS 7.x, 使用 grub2 ,可以使用系统工具grubby来修改;
[root@mdw ~]# grubby --update-kernel=ALL --args="elevator=deadline"
重启后使用一下命令检查
[root@mdw ~]# grubby --info=ALL
13.关闭Transparent Huge Pages (THP)
禁用THP,因为它会降低Greenplum数据库的性能。
RHEL 6.x or CentOS 6.x 或更高版本默认情况下启用THP。在RHEL 6.x上禁用THP的一种方法是添加参transparent_hugepage=never 到/boot/grub/grub.conf:
RHEL 7.x or CentOS 7.x, 使用 grub2 ,可以使用系统工具grubby来修改;
[root@mdw ~]# grubby --update-kernel=ALL --args="transparent_hugepage=never"
添加参数后,重启系统reboot。
参数检查:
[root@mdw ~]# cat /sys/kernel/mm/*transparent_hugepage/enabled
always [never]
14.SSH连接阈值
Greenplum数据库管理程序中的gpexpand‘ gpinitsystem、gpaddmirrors,使用 SSH连接来执行任务。在规模较大的Greenplum集群中,程序的ssh连接数可能会超出主机的未认证连接的最大阈值。发生这种情况时,会收到以下错误:ssh_exchange_identification:连接被远程主机关闭。
为避免这种情况,可以更新 /etc/ssh/sshd_config 或者 /etc/sshd_config 文件的 MaxStartups 和 MaxSessions 参数
MaxStartups 300:30:1000
重启sshd,使参数生效
service sshd restart
15.同步集群时钟(NTP) (此项为操作,环境已经设置好ntp)
为了保证集群各个服务的时间一致,首先在master 服务器上,编辑 /etc/ntp.conf,配置时钟服务器为数据中心的ntp服务器。若没有,先修改master 服务器的时间到正确的时间,再修改其他节点的 /etc/ntp.conf,让他们跟随master服务器的时间。
[root@mdw ~]# vi /etc/ntp.conf
在server 最前面加上
master:
把server1,2,3,4全删
改成 server xxx,可以问公司IT人员公司的时钟IP,如果没有就设置成
server 1.cn.pool.ntp.org
segment:
server mdw prefer # 优先主节点
server smdw # 其次standby 节点,若没有standby ,可以配置成数据中心的时钟服务器
[root@mdw ~]# service ntpd restart # 修改完重启ntp服务
16.检查字符集
[root@mdw greenplum-db]# echo $LANG
en_US.UTF-8
如果为zh_CN.UTF-8
则要修改 CentOS 6.X /etc/syscconfig/i18n
CentOS 7.X /etc/locale.conf
17.创建gpadmin用户(所有机器)
在每个节点上创建gpadmin用户,用于管理和运行gp集群
[root@mdw ~]# groupadd gpadmin
[root@mdw ~]# useradd gpadmin -g gpadmin -s /bin/bash
[root@mdw ~]# passwd gpadmin
三.集群软件安装
1.安装依赖(所有机器)root用户执行
[root@mdw ~]# yum install -y zip unzip openssh-clients ed ntp net-tools perl perl-devel perl-ExtUtils* mlocate lrzsz parted apr apr-util bzip2 krb5-devel libevent libyaml rsync
2.执行安装程序(root用户执行)
执行安装脚本,默认安装到/usr/local/ 目录下。
[root@mdw ~]# rpm -ivh greenplum-db-6.1.0-rhel6-x86_64.rpm
安装完成后可在/usr/local下看到greenplum-db-6.1.0和它的软连接greenplum-db
由于权限的问题,建议手动修改安装路径,放在/home/gpadmin下,执行以下语句
1.进入安装父目录
cd /usr/local
2.把安装目录移动到/home/gpadmin
mv greenplum-db-6.1.0 /home/gpadmin
3.删除软连接
/bin/rm –r greenplum-db
4.在/home/gpadmin下建立新的软链接
ln -s /home/gpadmin/greenplum-db-6.1.0 /home/gpadmin/greenplum-db
5.修改greenplum_path.sh (重要)
vi /home/gpadmin/greenplum-db/greenplum_path.sh
把 GPHOME=/usr/local/greenplum-db-6.1.0
修改为
GPHOME=/home/gpadmin/greenplum-db
6.把文件赋权给gpadmin
chown –R gpadmin:gpadmin /home/gpadmin
3.集群互信,免密登陆(root用户执行)
生成密钥
GP6.x开始gpssh-exkeys命令已经不带自动生成密钥了,所以需要自己手动生成
[root@mdw greenplum-db]# ssh-keygen -t rsa
提示语不用管,一直按Enter键使用默认值即可
4.将本机的公钥复制到各个节点机器的authorized_keys文件中
[root@mdw greenplum-db]# ssh-copy-id dis-gp-sdw1
[root@mdw greenplum-db]# ssh-copy-id dis-gp-sdw2
[root@mdw greenplum-db]# ssh-copy-id dis-gp-sdw3
5.使用gpssh-exkeys 工具,打通n-n的免密登陆
vi all_host
增加所有hostname到文件中
dis-gp-mdw
dis-gp-sdw1
dis-gp-sdw2
dis-gp-sdw3
[root@mdw greenplum-db]# source /home/gpadmin/greenplum-db/greenplum_path.sh
[root@mdw greenplum-db]# gpssh-exkeys -f all_host
6.同步master 配置到各个主机
打通gpadmin 用户免密登录
[root@mdw greenplum-db-6.2.1]# su - gpadmin
[gpadmin@mdw ~]$ source /home/gpadmin/greenplum-db/greenplum_path.sh
[gpadmin@mdw ~]$ ssh-keygen -t rsa
[gpadmin@mdw greenplum-db]$ ssh-copy-id dis-gp-sdw1
[gpadmin@mdw greenplum-db]$ ssh-copy-id dis-gp-sdw2
[gpadmin@mdw greenplum-db]$ ssh-copy-id dis-gp-sdw3
[gpadmin@mdw greenplum-db]$ mkdir gpconfigs
[gpadmin@mdw greenplum-db]$ cd gpconfigs
[gpadmin@mdw greenplum-db]$ vi all_hosts
把所有主机hostname添加进去
[gpadmin@mdw ~]$ gpssh-exkeys -f /home/gpadmin/gpconfigs/all_hosts
[gpadmin@mdw greenplum-db]$ vi /home/gpadmin/gpconfigs/seg_hosts
把所有数据节点hostname添加进去
7.批量设置greenplum在gpadmin用户的环境变量(gpadmin用户下)
添加gp的安装目录,和环境信息到用户的环境变量中。
编辑 .bashrc
source /home/gpadmin/greenplum-db/greenplum_path.sh
8.批量复制系统参数到其他节点(如果前面已经每台机器设置过可以跳过)
示例:
[gpadmin@mdw gpconfigs]$ exit
[root@mdw ~]# source /home/gpadmin/greenplum-db/greenplum_path.sh
[root@mdw ~]# gpscp -f /home/gpadmin/gpconfigs/seg_hosts /etc/hosts root@=:/etc/hosts
[root@mdw ~]# gpscp -f /home/gpadmin/gpconfigs/seg_hosts /etc/security/limits.conf root@=:/etc/security/limits.conf
[root@mdw ~]# gpscp -f /home/gpadmin/gpconfigs/seg_hosts /etc/sysctl.conf root@=:/etc/sysctl.conf
[root@mdw ~]# gpscp -f /home/gpadmin/gpconfigs/seg_hosts /etc/security/limits.d/20-nproc.conf
root@=:/etc/security/limits.d/20-nproc.conf
[root@mdw ~]# gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'sysctl -p'
[root@mdw ~]# gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'reboot'
9.集群节点安装
3.5.1 模拟gpseginstall 脚本(gpadmin用户执行)
GP6.x无gpseginstall 命令,以下模拟此命令主要过程,完成gpsegment的部署
gpadmin 用户下执行
1.cd /home/gpadmin
2.tar -cf gp6.tar greenplum-db-6.1.0/
3.vi /home/gpadmin/gpconfigs/gpseginstall_hosts
添加
dis-gp-sdw1
dis-gp-sdw2
dis-gp-sdw3-smdw
10.把压缩包分发到segment上
gpscp -f /home/gpadmin/gpconfigs/gpseginstall_hosts gp6.tar =:/home/gpadmin
11.通过gpssh命令链接到各个segment上执行命令
[gpadmin@mdw gpconfigs]$ gpssh -f /home/gpadmin/gpconfigs/gpseginstall_hosts
tar -xf gp6.tar
ln -s greenplum-db-6.1.0 greenplum-db
exit
12.环境变量文件分发到其他节点
[gpadmin@mdw gpconfigs]$ exit
[root@mdw greenplum-db-6.2.1]# su – gpadmin
[gpadmin@mdw ~]$ cd gpconfigs
[gpadmin@mdw gpconfigs]$ vi seg_hosts
把segment的hostname都添加到文件中
dis-gp-sdw1
dis-gp-sdw2
dis-gp-sdw3
[gpadmin@mdw gpconfigs]$ gpscp -f /home/gpadmin/gpconfigs/seg_hosts /home/gpadmin/.bashrc gpadmin@=:/home/gpadmin/.bashrc
13.创建集群数据目录(root用户执行)
1. 创建master 数据目录
mkdir -p /data/master
chown -R gpadmin:gpadmin /data
source /home/gpadmin/greenplum-db/greenplum_path.sh
如果有standby节点则需要执行下面2句 dis-gp-sdw3-smdw 这个hostname灵活变更
gpssh -h dis-gp-sdw3-smdw -e 'mkdir -p /data/master'
gpssh -h dis-gp-sdw3-smdw -e 'chown -R gpadmin:gpadmin /data'
2. 创建segment数据目录
source /home/gpadmin/greenplum-db/greenplum_path.sh
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'mkdir -p /data/p1'
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'mkdir -p /data/p2'
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'mkdir -p /data/m1'
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'mkdir -p /data/m2'
gpssh -f /home/gpadmin/gpconfigs/seg_hosts -e 'chown –R gpadmin:gpadmin /data'
四.集群初始化
1.编写初始化配置文件(gpadmin用户)
拷贝配置文件模板
su - gpadmin
cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config /home/gpadmin/gpconfigs/gpinitsystem_config
2.根据需要修改参数
vi /home/gpadmin/gpconfigs/gpinitsystem_config
注意:To specify PORT_BASE, review the port range specified in the net.ipv4.ip_local_port_range parameter in the /etc/sysctl.conf file.
主要修改的参数:
#primary的数据目录
declare -a DATA_DIRECTORY=(/data/p1 /data/p2)
#master节点的hostname
MASTER_HOSTNAME=dis-gp-mdw
#master节点的主目录
MASTER_DIRECTORY=/data/master
#mirror的端口要把前面的#去掉(启用mirror)
MIRROR_PORT_BASE=7000
#mirror的数据目录要把前面的#去掉(启用mirror)
declare -a MIRROR_DATA_DIRECTORY=(/data/m1 /data/m2)
3.集群初始化(gpadmin用户)
执行脚本:
gpinitsystem -c /home/gpadmin/gpconfigs/gpinitsystem_config --locale=C -h /home/gpadmin/gpconfigs/gpseginstall_hosts --mirror-mode=spread
注意:spread是指spread分布策略,只允许主机数>每个主机中的段实例数情况(number of hosts is greater than the number of segment instances.)
如果不指定mirror_mode,则是默认的group策略,这样做的情况在段实例数>1时,down机之后不会导致它的镜像全在另外一台机器中,降低另外一台机器的性能瓶颈。
4.安装中途失败,提示使用 bash /home/gpadmin/gpAdminLogs/backout_gpinitsystem_gpadmin_* 回退,执行该脚本即可,例如:
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[FATAL]:-Unknown host gpzq-sh-mb: ping: unknown host gpzq-sh-mb
unknown host Script Exiting!
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[WARN]:-Script has left Greenplum Database in an incomplete state
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[WARN]:-Run command bash
/home/gpadmin/gpAdminLogs/backout_gpinitsystem_gpadmin_20191218_203938 to remove these changes
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[INFO]:-Start Function BACKOUT_COMMAND
20191218:20:39:53:011405 gpinitsystem:mdw:gpadmin-[INFO]:-End Function BACKOUT_COMMAND
[gpadmin@mdw gpAdminLogs]$ ls
backout_gpinitsystem_gpadmin_20191218_203938 gpinitsystem_20191218.log
[gpadmin@mdw gpAdminLogs]$ bash backout_gpinitsystem_gpadmin_20191218_203938
Stopping Master instance
waiting for server to shut down.... done
server stopped
Removing Master log file
Removing Master lock files
Removing Master data directory files
若执行后仍然未清理干净,可执行一下语句后,再重新安装:
pg_ctl -D /data/master/gpseg-1 stop
rm -f /tmp/.s.PGSQL.5432 /tmp/.s.PGSQL.5432.lock
主节点
rm -rf /data/master/gpseg-1
所有数据节点
rm -rf /data/p1/gpseg-x
rm -rf /data/p2/gpseg-x
5.安装成功后设置环境变量(gpadmin用户)
编辑gpadmin 用户的环境变量,增加(重要)
export MASTER_DATA_DIRECTORY=/data/master/gpseg-1
除此之外,通常还增加:(可以不设置)
export PGPORT=5432 # 根据实际情况填写
export PGUSER=gpadmin # 根据实际情况填写
export PGDATABASE=gpdw # 根据实际情况填写
前面已经添加过 source /usr/local/greenplum-db/greenplum_path.sh,此处操作如下:
编辑 .bashrc
export MASTER_DATA_DIRECTORY=/data/master/gpseg-1
6.安装成功后配置
psql 登陆gp 并设置密码(gpadmin用户)
psql -h hostname -p port -d database -U user -W password
-h后面接对应的master或者segment主机名
-p后面接master或者segment的端口号
-d后面接数据库名可将上述参数配置到用户环境变量中,linux 中使用gpadmin用户不需要密码。
psql 登录,并设置gpadmin用户密码示例:
psql -d postgres
alter user gpadmin encrypted password ‘xxx’;0.
7.客户端登陆gp
配置 pg_hba.conf
vi /data/master/gpseg-1/pg_hba.conf
新增一行 host all all 0.0.0.0/0 md5
8.初始化standby节点
gpinitstandby -s dis-gp-sdw3