本文主要介绍如何快速安装部署单节点的Greenplum过程,以及Greenplum的一些常用命令及工具。

环境准备

环境说明

操作系统:Centos7
节点环境:

| ip | hostname | 角色 | | —- | —- | —- |

| 192.168.56.141 | dw-test-node001 | master |

| 192.168.56.142 | dw-test-node002 | segment |

| 192.168.56.143 | dw-test-node003 | segment |

安装用户:root

配置系统参数

在每台服务器上执行以下操作。

配置hosts文件

  1. cat > /etc/hosts <<EOF
  2. 192.168.56.141 dw-test-node001
  3. 192.168.56.142 dw-test-node002
  4. 192.168.56.143 dw-test-node003
  5. EOF

关闭selinux

  1. setenforce 0 >/dev/null 2>&1
  2. sed -i -e 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
  3. sed -i -e 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

关闭防火墙

  1. systemctl stop firewalld.service && systemctl disable firewalld.service

设置时钟同步

  1. yum install ntp -y
  2. cat > /etc/ntp.conf << EOF
  3. #在与上级时间服务器联系时所花费的时间,记录在driftfile参数后面的文件
  4. driftfile /var/lib/ntp/drift
  5. #默认关闭所有的 NTP 联机服务
  6. restrict default ignore
  7. restrict -6 default ignore
  8. #如从loopback网口请求,则允许NTP的所有操作
  9. restrict 127.0.0.1
  10. restrict -6 ::1
  11. #使用指定的时间服务器
  12. server ntp1.aliyun.com
  13. server ntp2.aliyun.com
  14. server ntp3.aliyun.com
  15. #允许指定的时间服务器查询本时间服务器的信息
  16. restrict ntp1.aliyun.com nomodify notrap nopeer noquery
  17. #其它认证信息
  18. includefile /etc/ntp/crypto/pw
  19. keys /etc/ntp/keys
  20. EOF
  21. systemctl start ntpd && systemctl enable ntpd
  22. echo '* */6 * * * /usr/sbin/ntpdate -u ntp1.aliyun.com && /sbin/hwclock --systohc > /dev/null 2>&1' >> /var/spool/cron/`whoami`

配置内核参数

参考 https://segmentfault.com/a/1190000020654036?utm_source=tag-newest

  1. #设置内核参数
  2. cat > greenplum.conf <<EOF
  3. kernel.shmall = 2033299
  4. kernel.shmmax = 8328392704
  5. kernel.shmmni = 4096
  6. kernel.sem = 500 1024000 200 4096
  7. kernel.sysrq = 1
  8. kernel.core_uses_pid = 1
  9. kernel.msgmnb = 65536
  10. kernel.msgmax = 65536
  11. kernel.msgmni = 31764
  12. net.ipv4.tcp_syncookies = 1
  13. net.ipv4.conf.default.accept_source_route = 0
  14. net.ipv4.tcp_tw_recycle = 1
  15. net.ipv4.tcp_max_syn_backlog = 4096
  16. net.ipv4.conf.all.arp_filter = 1
  17. net.ipv4.ip_local_port_range = 10000 65535
  18. net.core.netdev_max_backlog = 10000
  19. net.core.rmem_max = 2097152
  20. net.core.wmem_max = 2097152
  21. vm.overcommit_memory = 2
  22. vm.overcommit_ratio = 95
  23. vm.swappiness = 0
  24. vm.zone_reclaim_mode = 0
  25. #这个时候,后台进行在脏数据达到3%时就开始异步清理,但在10%之前系统不会强制同步写磁盘。刷脏进程3秒起来一次,脏数据存活超过10秒就会开始刷。
  26. vm.dirty_expire_centisecs = 500
  27. vm.dirty_writeback_centisecs = 100
  28. vm.dirty_background_ratio = 3
  29. vm.dirty_ratio = 10
  30. EOF
  31. mv greenplum.conf /etc/sysctl.d/greenplum.conf
  32. sysctl -p /etc/sysctl.d/greenplum.conf

生产环境的配置,需要详细参考官方文档的说明:https://gpdb.docs.pivotal.io/6-1/install_guide/prep_os.html#topic3__sysctl_file
kernel.shmall(共享内存页总数)
kernel.shmmax (共享内存段的最大值)
一般来讲,这两个参数的值应该是物理内存的一半,可以通过操作系统的值_PHYS_PAGES和PAGE_SIZE计算得出。

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

也可以通过以下两个命令得出这两个参数的值:

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

如果得出的kernel.shmmax值小于系统的默认值,则引用系统默认值即可
对于64G内存的操作系统,建议配置如下值:

  1. vm.dirty_background_ratio = 0
  2. vm.dirty_ratio = 0
  3. vm.dirty_background_bytes = 1610612736 # 1.5GB
  4. vm.dirty_bytes = 4294967296 # 4GB

对于小于64G内存的操作系统,建议配置如下值:

  1. vm.dirty_background_ratio = 3
  2. vm.dirty_ratio = 10

设置文件句柄数

  1. cat >/etc/security/limits.d/file.conf<<EOF
  2. * soft nproc 131072
  3. * hard nproc 131072
  4. * soft nofile 131072
  5. * hard nofile 131072
  6. root soft nproc 131072
  7. root hard nproc 131072
  8. root soft nofile 131072
  9. root hard nofile 131072
  10. EOF

设置SSH连接

  1. sed -i 's/#MaxStartups 10:30:100/MaxStartups 10:30:200/g' /etc/ssh/sshd_config
  2. service sshd restart

配置 Greenplum 要求的参数

磁盘IO设置

设置磁盘预读

  1. fdisk -l
  2. /sbin/blockdev --setra 16384 /dev/sdb

调整IO调度算法

  1. echo deadline > /sys/block/sdb/queue/scheduler
  2. grubby --update-kernel=ALL --args="elevator=deadline"

设置Transparent Huge Pages

禁止透明大页,Redhat 6以及更高版本默认激活THP,THP会降低GP database性能,通过修改文件/boot/grub/grub.conf添加参数transparent_hugepage=never禁止THP的应用,但需要重新启动系统

  1. echo "echo never > /sys/kernel/mm/*transparent_hugepage/defrag" >/etc/rc.local
  2. echo "echo never > /sys/kernel/mm/*transparent_hugepage/enabled" >/etc/rc.local
  3. grubby --update-kernel=ALL --args="transparent_hugepage=never"

需要重启系统

查看是否禁用:

  1. $ cat /sys/kernel/mm/*transparent_hugepage/enabled
  2. always madvise [never]

检查内核参数:

  1. $ grubby --info=ALL
  2. index=0
  3. kernel=/boot/vmlinuz-4.4.202-1.el7.elrepo.x86_64
  4. args="ro elevator=deadline no_timer_check crashkernel=auto rd.lvm.lv=centos_centos7/root rd.lvm.lv=centos_centos7/swap biosdevname=0 net.ifnames=0 rhgb quiet numa=off transparent_hugepage=never"
  5. root=/dev/mapper/centos_centos7-root
  6. initrd=/boot/initramfs-4.4.202-1.el7.elrepo.x86_64.img
  7. title=CentOS Linux (4.4.202-1.el7.elrepo.x86_64) 7 (Core)

关闭RemoveIPC

  1. sed -i 's/#RemoveIPC=no/RemoveIPC=no/g' /etc/systemd/logind.conf
  2. service systemd-logind restart

挂载磁盘

先查看磁盘挂载:

  1. fdisk -l

如果没有磁盘,则需要挂载磁盘。官方建议使用XFS磁盘类型,当然其他磁盘类型也是可以。
配置/etc/fstab文件以使Linux系统启动默认挂载磁盘,如下配置添加到文件/etc/fstab:

  1. mkfs.xfs -f /dev/sdb
  2. mkdir /data
  3. echo "/dev/sdb /data xfs nodev,noatime,nobarrier,inode64 0 0" >> /etc/fstab
  4. mount -a

创建Greenplum管理员用户

使用root用户创建用户 gpadmin,这里密码也设置为 gpadmin

  1. USER=gpadmin
  2. groupadd $USER
  3. useradd $USER -r -m -g $USER
  4. echo $USER|passwd $USER --stdin >/dev/null 2>&1

添加sudo权限:

  1. echo "$USER ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/$USER

切换到 gpadmin 用户,生成ssh密钥:

  1. su gpadmin
  2. [ ! -f ~/.ssh/id_rsa.pub ] && (yes|ssh-keygen -f ~/.ssh/id_rsa -t rsa -N "")
  3. ( chmod 600 ~/.ssh/id_rsa.pub ) && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

安装数据库

安装

1、下载页面:https://network.pivotal.io/products/pivotal-gpdb/ ,当前最新版本为6.11.1,对应的rpm文件 greenplum-db-6.11.1-rhel7-x86_64.rpm。
拷贝到每个节点:

  1. scp greenplum-db-6.11.1-rhel7-x86_64.rpm gpadmin@dw-test-node001:~
  2. scp greenplum-db-6.11.1-rhel7-x86_64.rpm gpadmin@dw-test-node002:~
  3. scp greenplum-db-6.11.1-rhel7-x86_64.rpm gpadmin@dw-test-node003:~

2、每个节点安装RPM

  1. ssh dw-test-node001 "sudo yum install greenplum-db-6.11.1-rhel7-x86_64.rpm -y"
  2. ssh dw-test-node002 "sudo yum install greenplum-db-6.11.1-rhel7-x86_64.rpm -y"
  3. ssh dw-test-node003 "sudo yum install greenplum-db-6.11.1-rhel7-x86_64.rpm -y"

3、修改安装目录权限

  1. ssh dw-test-node001 "sudo chown -R gpadmin:gpadmin /usr/local/greenplum*"
  2. ssh dw-test-node002 "sudo chown -R gpadmin:gpadmin /usr/local/greenplum*"
  3. ssh dw-test-node003 "sudo chown -R gpadmin:gpadmin /usr/local/greenplum*"

确保无密码登陆

1、dw-test-node001节点上配置gpadmin用户无密码登陆到其他节点:

  1. su gpadmin
  2. ssh-copy-id dw-test-node001
  3. ssh-copy-id dw-test-node002
  4. ssh-copy-id dw-test-node003

2、设置greenplum环境变量使其生效

  1. source /usr/local/greenplum-db/greenplum_path.sh

3、配置hostfile_all文件,将所有的服务器名记录在里面。

  1. cat > hostfile_all << EOF
  2. dw-test-node001
  3. dw-test-node002
  4. dw-test-node003
  5. EOF

hostfile_segment只保存segment节点的hostname

  1. cat > hostfile_segment << EOF
  2. dw-test-node002
  3. dw-test-node003
  4. EOF

4、使用gpssh-exkeys打通所有服务器,配置所有GP节点之间ssh互信:

  1. $ gpssh-exkeys -f hostfile_all
  2. [STEP 1 of 5] create local ID and authorize on local host
  3. ... /home/gpadmin/.ssh/id_rsa file exists ... key generation skipped
  4. [STEP 2 of 5] keyscan all hosts and update known_hosts file
  5. [STEP 3 of 5] retrieving credentials from remote hosts
  6. ... send to dw-test-node001
  7. ... send to dw-test-node002
  8. [STEP 4 of 5] determine common authentication file content
  9. [STEP 5 of 5] copy authentication files to all remote hosts
  10. ... finished key exchange with dw-test-node001
  11. ... finished key exchange with dw-test-node002
  12. [INFO] completed successfully

在打通所有机器通道之后,我们就可以使用gpssh命令对所有机器进行批量操作了。

  1. gpssh -f hostfile_all "ls -l /usr/local/greenplum-db"

创建存储

master上创建目录:

  1. gpssh -h dw-test-node001 -e 'sudo mkdir -p /gpdata/master && sudo chown gpadmin:gpadmin /gpdata/master'

数据节点创建目录:

  1. gpssh -f hostfile_segment -e 'sudo mkdir -p /gpdata/primary{0,1} /gpdata/mirror{0,1} && sudo chown -R gpadmin:gpadmin /gpdata/*'

初始化数据库

创建模板

配置文件的模板可以在 $GPHOME/docs/cli_help/gpconfigs/ 目录下找到。gpinitsystem_config文件是初始化Greenplum的模板,在这个模板中,Mirror Segment的配置都被注释掉了,模板中基本初始化数据库的参数都是有的。

  1. cat > gpinitsystem_config <<EOF
  2. #数据库的代号
  3. ARRAY_NAME="Greenplum Data Platform"
  4. #Segment的名称前缀
  5. SEG_PREFIX=gpseg
  6. #Primary Segment起始的端口号
  7. PORT_BASE=40000
  8. #指定Primary Segment的数据目录,配置几次资源目录就是每个子节点有几个实例(推荐4-8个,这里配置了4个,primary与mirror文件夹个数对应)
  9. declare -a DATA_DIRECTORY=(/gpdata/primary0 /gpdata/primary1)
  10. #Master所在机器的Hostname
  11. MASTER_HOSTNAME=dw-test-node001
  12. #指定Master的数据目录
  13. MASTER_DIRECTORY=/gpdata/master
  14. #Master的端口
  15. MASTER_PORT=5432
  16. #指定Bash的版本
  17. TRUSTED_SHELL=ssh
  18. #设置的是检查点段的大小,较大的检查点段可以改善大数据量装载的性能,同时会加长灾难事务恢复的时间。
  19. CHECK_POINT_SEGMENTS=8
  20. #字符集
  21. ENCODING=utf-8
  22. #Mirror Segment起始的端口号
  23. MIRROR_PORT_BASE=41000
  24. #Primary Segment主备同步的起始端口号
  25. REPLICATION_PORT_BASE=42000
  26. #Mirror Segment主备同步的起始端口号
  27. MIRROR_REPLICATION_PORT_BASE=43000
  28. #Mirror Segment的数据目录,配置几次资源目录就是每个子节点有几个实例(推荐4-8个,这里配置了4个,primary与mirror文件夹个数对应)
  29. declare -a MIRROR_DATA_DIRECTORY=(/gpdata/mirror0 /gpdata/mirror1)
  30. MASTER_MAX_CONNECT=250
  31. EOF

如果是挂载了多个磁盘,则数据路径需要使用独立的路径。

初始化数据库

使用gpinitsystem脚本来初始化数据库,命令如下:

  1. gpinitsystem -c gpinitsystem_config -h hostfile_segment

也可以指定standby master :

  1. gpinitsystem -c gpinitsystem_config -h hostfile_segment -s dw-test-node002

如果不想手动确认,可以添加 -a 参数。

后期添加standby master:

  1. #在不同机器增加standby master节点
  2. gpinitstandby -S /gdata/master/gpseg1 -s dw-test-node001
  3. #在同一机器增加standby master节点
  4. gpinitstandby -S /gdata/master/gpseg1 -P 5433 -s dw-test-node001

设置环境变量

切换到gpadmin用户:

  1. su - gpadmin
  2. cat >> ~/.bashrc <<EOF
  3. source /usr/local/greenplum-db/greenplum_path.sh
  4. export GPHOME=/usr/local/greenplum-db
  5. export MASTER_DATA_DIRECTORY=/gpdata/master/gpseg1
  6. export PGPORT=5432
  7. export PGUSER=gpadmin
  8. export PGDATABASE=postgres
  9. export LD_PRELOAD=/lib64/libz.so.1
  10. EOF
  11. source ~/.bashrc

如果配置了 standby master节点,则拷贝到standby master节点:

  1. scp ~/.bashrc dw-test-node002:~
  2. ssh dw-test-node002 "source ~/.bashrc"

设置数据库时区

  1. gpconfig -s TimeZone
  2. gpconfig -c TimeZone -v 'Asia/Shanghai'

修改配置

设置远程用户访问

查看/gpdata/master/gpseg1/pg_hba.conf:

  1. local all gpadmin ident
  2. host all gpadmin 127.0.0.1/28 trust
  3. host all gpadmin 192.168.56.141/32 trust
  4. local replication gpadmin ident
  5. host replication gpadmin samehost trust
  6. host replication gpadmin 192.168.56.141/32 trust

修改为:

  1. local all gpadmin ident
  2. host all gpadmin 127.0.0.1/28 trust
  3. host all gpadmin 192.168.56.141/32 trust
  4. local replication gpadmin ident
  5. host replication gpadmin samehost trust
  6. host replication gpadmin 192.168.56.141/32 trust
  7. host all all 192.168.56.141/32 trust #add this

添加一行,设置192.168.56.141/32可以访问所有数据库

设置监听IP和Port

  1. vi /gpdata/master/gpseg1/postgresql.conf
  2. # 设置监听IP (* 生产环境慎用)
  3. listen_addresses = '${ host ip address } '
  4. port = 5432

启动与关闭

启动数据库:

  1. gpstart -a

关闭数据库:

  1. gpstop -a
  2. gpstop -M fast

重启数据库:

  1. gpstop -ar

重新加载配置文件:

  1. gpstop -u

设置开机启动:

  1. cat > greenplum.service <<EOF
  2. [Unit]
  3. Description=greenplum server daemon
  4. [Service]
  5. Restart=on-failure
  6. ExecStart=/usr/local/greenplum-db/bin/gpstart -a
  7. [Install]
  8. WantedBy=multi-user.target
  9. EOF
  10. sudo mv greenplum.service /usr/lib/systemd/system/

测试

客户端访问

在本地访问:

  1. psql -p 5432 -U gpadmin -d postgres

在其他机器访问:

  1. psql -p 5432 -h 192.168.56.141 -U gpadmin -d postgres

清空数据

  1. #如有报错需重新初始化,清理以下内容:
  2. kill -9 $(ps -ef |grep greenplum|awk '{print $2}')
  3. gpssh -f hostfile_all -e "rm -rf /gpdata/master/*"
  4. gpssh -f hostfile_segment -e "rm -rf /gpdata/{mirror*,primary*}/*"
  5. rm -f /tmp/.s.PGSQL*.lock

升级

1、登陆:

  1. su - gpadmin

2、停止数据库
master节点执行:

  1. gpstop -a

3、安装新版本
https://github.com/greenplum-db/gpdb/releases 下载最新版本,并拷贝到每个阶段。在每个节点运行下面命令:

  1. sudo yum install greenplum-db-6.11.1-rhel7-x86_64.rpm -y

4、设置目录权限
每个节点执行:

  1. sudo chown -R gpadmin:gpadmin /usr/local/greenplum*

5、设置环境变量
重新设置软连接:

  1. rm /usr/local/greenplum-db
  2. ln -s /usr/local/greenplum-db-6.11.1 /usr/local/greenplum-db
  3. source ~/.bashrc

6、启动数据库
master节点执行:

  1. gpstart -a

常用命令

查看数据库状态

1、查看segment
列出当前状态为down的Segment:

  1. SELECT * FROM gp_segment_configuration WHERE status <> 'u';

检查当前处于改变跟踪模式的Segment。

  1. SELECT * FROM gp_segment_configuration WHERE mode = 'c';

检查当前在重新同步的Segment。

  1. SELECT * FROM gp_segment_configuration WHERE mode = 'r';

检查没有以其最优角色运转的Segment。

  1. SELECT * FROM gp_segment_configuration WHERE preferred_role <> role;

运行一个分布式查询来测试它运行在所有Segment上。对每个主Segment都应返回一行。

  1. SELECT gp_segment_id, count(*) FROM gp_dist_random('pg_class') GROUP BY 1;

2、查看数据库连接
查看到当前数据库连接的IP 地址,用户名,提交的查询等。

  1. select * from pg_stat_activity

3、查看表存储结构
查看表的存储结构:

  1. select distinct relstorage from pg_class;

查询当前数据库有哪些AO表:

  1. select t2.nspname, t1.relname from pg_class t1, pg_namespace t2 where t1.relnamespace=t2.oid and relstorage in ('c', 'a');

查询当前数据库有哪些堆表:

  1. select t2.nspname, t1.relname from pg_class t1, pg_namespace t2 where t1.relnamespace=t2.oid and relstorage in ('h') and relkind='r';

维护数据库

检查表上缺失的统计信息。

  1. SELECT * FROM gp_toolkit.gp_stats_missing;

检查数据文件中出现膨胀(死亡空间)且无法用常规VACUUM命令恢复的表。

  1. SELECT * FROM gp_toolkit.gp_bloat_diag;

清理用户表

  1. VACUUM <table>;

分析用户表。

  1. analyzedb -d <database> -a
  2. analyzedb -s pg_catalog -d <database>

推荐周期性地在系统目录上运行VACUUM和REINDEX来清理系统表和索引中已删除对象所占用的空间:
下面的示例脚本在一个Greenplum数据库系统目录上执行一次VACUUM、REINDEX以及ANALYZE:

  1. #!/bin/bash
  2. DBNAME="<database-name>"
  3. SYSTABLES="' pg_catalog.' || relname || ';' from pg_class a, pg_namespace b
  4. where a.relnamespace=b.oid and b.nspname='pg_catalog' and a.relkind='r'"
  5. psql -tc "SELECT 'VACUUM' || $SYSTABLES" $DBNAME | psql -a $DBNAME
  6. reindexdb --system -d $DBNAME
  7. analyzedb -s pg_catalog -d $DBNAME

查看磁盘空间

1、检查磁盘空间使用
以使用gp_toolkit管理方案中的gp_disk_free外部表来检查Segment主机文件系统中的剩余空闲空间(以千字节计)。

  1. dw_lps=# SELECT * FROM gp_toolkit.gp_disk_free ORDER BY dfsegment;
  2. dfsegment | dfhostname | dfdevice | dfspace
  3. -----------+------------------+-----------+-----------
  4. 0 | dw-test-node001 | /dev/sdb | 472594712
  5. 1 | dw-test-node001 | /dev/sdb | 472594712
  6. (2 rows)

2、查看数据库的磁盘空间使用
要查看一个数据库的总尺寸(以字节计),使用gp_toolkit管理方案中的gp_size_of_database视图。

  1. dw_lps=# SELECT * FROM gp_toolkit.gp_size_of_database ORDER BY sodddatname;
  2. sodddatname | sodddatsize
  3. -------------+-------------
  4. dw_lps | 3833874988
  5. gpperfmon | 63310532
  6. (2 rows)

查看某个数据库占用空间:

  1. dw_lps=# select pg_size_pretty(pg_database_size('dw_lps'));
  2. pg_size_pretty
  3. ----------------
  4. 3656 MB
  5. (1 row)

3、查看一个表的磁盘空间使用

  1. SELECT relname AS name, sotdsize AS size, sotdtoastsize
  2. AS toast, sotdadditionalsize AS other
  3. FROM gp_toolkit.gp_size_of_table_disk as sotd, pg_class
  4. WHERE sotd.sotdoid=pg_class.oid ORDER BY relname;

4、查看索引的磁盘空间使用

  1. SELECT soisize, relname as indexname
  2. FROM pg_class, gp_toolkit.gp_size_of_index
  3. WHERE pg_class.oid=gp_size_of_index.soioid
  4. AND pg_class.relkind='i';

查看数据分布

1、查看某个表的数据分布:

  1. dw_lps=# select gp_segment_id,count(*) from ods_lps_bill group by gp_segment_id;
  2. gp_segment_id | count
  3. ---------------+---------
  4. 0 | 1440129
  5. 1 | 1439143
  6. (2 rows)

2、查询压缩率:

  1. select get_ao_compression_ratio('ods_lps_bill');

3、查看AO表的膨胀率

  1. select * from gp_toolkit.__gp_aovisimap_compaction_info('ods_lps_bill'::regclass);

膨胀率超过千分之2的AO表:

  1. select * from (
  2. select t2.nspname, t1.relname, (gp_toolkit.__gp_aovisimap_compaction_info(t1.oid)).*
  3. from pg_class t1, pg_namespace t2 where t1.relnamespace=t2.oid and relstorage in ('c', 'a')
  4. ) t
  5. where t.percent_hidden > 0.2;

查看元数据

1、查看表元数据

  1. \d+ ods_lps_bill

2、查看某一个表上执行的操作

  1. SELECT schemaname as schema, objname as table,
  2. usename as role, actionname as action,
  3. subtype as type, statime as time
  4. FROM pg_stat_operations
  5. WHERE objname='ods_lps_bill';

参考文章