Greenplum 实时数据仓库实践(4)——Greenplum安装部署
目录
1. 在Master和Standby Master主机创建数据存储区
Greenplum是一个MPP分布式数据库软件,本质上是并行利用硬件使其充分发挥能力以达到最佳性能。Greenplum可以运行在多种环境中,如物理机、虚拟机、云服务器等等,但无论哪种环境,要保证高可用、高性能和稳定性,必须以选择适当的硬件、操作系统、文件系统为基础。对底层系统和数据库的合理配置,也是获得一个强力Greenplum集群的重要前提条件。本篇详细论述Greenplum 6安装部署所涉及的各方面问题。
4.1 平台需求
4.1.1 操作系统
Greenplum 6可以运行在以下主流操作系统之上:
- 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.x
- Ubuntu 18.04 LTS
RedHat 6.x和CentOS 6.x的一个已知问题是,启动资源组时Greenplum性能明显下降。这是由Linux cgroup内核错误引起,已在CentOS 7.x和Red Hat 7.x系统中修复。对于安装在7.3之前版本的Greenplum,可能由于Linux内核问题导致高工作负载的Greenplum数据库挂起,7.3版本解决了该问题。建议操作系统选择CentOS 64-bit 7.3或以上版本。另外,不要在Greenplum主机上安装防病毒软件,这可能会导致额外的CPU和IO负载,从而干扰Greenplum数据库操作。
Greenplum 6需要在RHEL/CentOS 7系统上安装以下软件包(在安装Greenplum RPM包时,这些软件包将作为依赖项自动安装):apr、apr-util、bash、bzip2、curl、krb5、libcurl、libevent、libxml2、libyaml、zlib、openldap openssh、openssl、openssl-libs、perl、readline、rsync、R、sed、tar、zip。如果使用PL/Java或PXF,需要安装Open JDK 8或Open JDK 11。
4.1.2 硬件和网络
Greenplum数据库系统中的所有主机服务器应该具有相同的硬件和软件配置。数据库整体性能依赖于硬件的性能和各种硬件资源的均衡。对于OLAP应用来说,最大的瓶颈是磁盘性能,因此所有其他资源都应围绕磁盘性能来均衡配置。这些资源包括CPU主频与核数、内存容量、网络带宽、RAID性能等,但基本宗旨是,IO资源必须有富余,CPU资源被充分利用。
1. CPU主频与核数
就目前来说,一个SQL语句的执行性能,取决于单核的计算能力和有多少个Primary段参与计算。通常对于一个Primary来说,在执行一个任务时,只能利用一个CPU核的计算能力。
现在主流的两路X86服务器,CPU一般都配置64核甚至更高核数。相同核数情况下追求高主频需要很高的成本,性价比很低,基本没有什么选择的空间。所以,要提升集群的整体计算能力,核数是个非常重要的因素。如果有可能,尽量增加CPU核数,配置96核甚至128核以上的CPU,将会带来更好的计算能力。
2. 内存容量
单机最小物理内存需求为16G。随着近年来大规模数据分析需求的上升,主流配置单机内存至少256GB,很多已经达到512GB甚至更高。Greenplum的很多算子,比如Hash、AGG、Sort等都属于内存密集型算子,可能需要消耗大量内存。
活跃内存的消耗量与计算的数据量、计算的类型、并发数都有关系。只能说配置的内存多,Greenplum在处理内存需求量很大的场景时会更高效,但不能保证活跃内存的使用率就一定很高。因此,如果极少有内存密集型计算,可以适当降低内存配置,不过建议每个Primary段的最低内存配置不要低于30GB。如前所述,Greenplum集群中的IO是最珍贵的资源,如果内存不足,就要从内存溢出到磁盘文件,把压力转移到磁盘上,这种情况是不应该出现的。
3. 内联网络
内联网络的带宽及其重要。MPP架构带来了一个无法避免的数据移动问题。虽然数据移动不是总会发生,但如果发生时受带宽限制,数据移动操作就会卡在网络层。好在已经普遍存在的万兆网卡和万兆交换机提供了强大的网络能力。
强烈建议集群中所有主机在同一局域网内,连接万兆交换机。另外,为了实现网络的高可用,每台主机建议至少两块万兆网卡。如果可以选择,要采用mode4的bond,而不是mode1。从安全角度来看,mode4和mode1是完全一样的,都有多个通道,只要不是全部通道故障,不影响连通性。而从带宽角度考虑,正常情况下mode4的带宽更高,而mode1的带宽就相当于故障了的mode4。
一定要确保网络的健康,长期大量错包丢包必定影响集群的稳定性甚至性能。对于超大规模集群,应该考虑为Master服务器配置更多的网口做链路聚合,因为随着Master管理的机器增多,Master本身的网络压力会随之上升。100台以上的集群,可以考虑增加Master的网络带宽为4个万兆口做mode4的链路聚合。
4. RAID卡性能
如果使用机械盘,RAID卡是缓解磁盘压力的关键,其最大作用是,将离散IO操作缓存并合并为连续IO操作。普通机械盘的随机读写能力较差,一个10K/Min转速的机械盘,连续的磁盘读写性能不会超过200MB/S,随机读写性能更差,一般IOPS能力都达不到200。
对于OLAP型应用,主要是大尺寸的连续读写。如果RAID卡有Cache功能,不管读写,都可以经过RAID卡的Cache进行IO合并,充分发挥机械盘的连续读写能力。一般要求24块机械盘,起码要配置2GB以上Cache的双通道RAID卡,否则RAID卡可能成为性能瓶颈。根据经验,24块机械盘,采用12块一组的RAID-5方案,条带一般选择256KB大小。
5. 磁盘配置
磁盘性能对Greenplum尤为重要。对OLAP型应用,目前主流的配置方案是,Segment节点主机配置24块机械盘,Master节点主机配置8~12块机械盘。如果选择SSD或NVMe,可以根据容量和性能评估硬盘数量。
不能只是单纯地追求容量,要综合考虑性能指标,单块磁盘的容量越大,故障恢复的时间越长。一般来说,如果选择机械盘,目前主流的选择是单盘不超过1.8TB。
4.1.3 文件系统
应该在XFS文件系统上运行Greenplum数据库。原厂未明确支持其他文件系统,所以Greenplum数据库的数据目录应该使用XFS文件系统。
对于网络文件系统或共享存储,也必须挂载为本地XFS文件系统。非本地磁盘的文件系统,虽然支持,但不推荐。对Greenplum来说,都是本地目录,不会区分对待不同的存储。网络文件系统或共享存储,虽然可以运行,但性能和可靠性无法保证。
4.2 容量评估
本节是估算Greenplum数据库系统可以容纳多少数据的指南。除此之外,可能还希望在每个Segment主机上有额外的空间,来放置备份文件和需要加载的外部数据文件。
4.2.1 可用磁盘空间
要估算Greenplum数据库系统可以容纳的数据量,必须从计算每个Segment主机上可用于数据存储的物理磁盘的原始容量开始,然后用每个Segment主机的可用磁盘容量,乘以Greenplum集群中的Segment主机数。原始容量等于磁盘大小乘以磁盘数量,而磁盘数量要考虑使用的RAID级别,例如使用带有Hotspare的RAID-5的原始容量计算如下:
原始容量 = 磁盘大小 * (磁盘总数 - RAID数量 - Hotspare数量)
下一步计算格式化后的磁盘容量,这时要考虑文件系统格式化开销(大约10%):
格式化后的磁盘容量 = 原始容量 * 0.9
磁盘使用率不能是100%,为保障性能,Greenplum建议磁盘使用率不要超过70%,因此可用磁盘空间为:
可用磁盘空间 = 格式化后的磁盘容量 * 0.7
假设24块1.2TB的磁盘,做两组RAID-5,带有两块Hotspare,则可用磁盘空间为:
1.2TB * (24 - 2 - 2) * 0.9 * 0.7 = 15.12TB
Greenplum可以将其余30%用于相同磁盘上的临时文件和事务文件。如果主机系统有一个单独的磁盘系统用于临时文件和事务文件,则可以指定一个使用这些文件的表空间。根据磁盘系统的性能,移动文件的位置可能会提高性能。
在计算用户数据(U)的实际可用存储量时,通常使用Mirror实现数据冗余是生产环境的必选项,那么用户数据的大小将增加一倍(2*U)。Greenplum还需要保留一些空间作为活动查询的工作区(work space),应约为用户数据大小的三分之一:
(2 * U) + U/3 = 15.12TB
用户数据可用空间(U)= 6.48TB
这里的计算公式针对典型的分析型应用。高并发工作负载或需要大量临时空间的查询可以从保留较大的工作区中获益。通过适当的负载管理,可以提高总体系统吞吐量,同时降低工作区使用率。此外,通过指定临时空间和用户空间位于不同的表空间上,可以将它们彼此隔离。
4.2.2 用户数据容量
与其他数据库类似,原始数据一旦被装载到数据库中,将比原始数据文件稍大一些,平均而言,约为原始大小的1.4倍。根据使用的数据类型、表存储类型和数据是否压缩等因素,情况可能有所不同。计算用户数据容量要考虑以下因素:
- 页开销:数据被装载到Greenplum数据库中时,被划分为32KB的页,每页有20字节的开销。
- 行开销:在常规堆表中,每行数据有24字节的行开销,AO表只有4字节的行开销。
- 列开销:对于数据值本身,与每个属性值关联的大小取决于所选的数据类型。一般来说,希望使用尽可能小的数据类型来存储数据。
- 索引:在Greenplum数据库中,索引以表数据的形式分布在Segment主机上,默认为B树索引。由于索引大小取决于索引中唯一值的数量和要插入的数据,因此不可能预先计算索引的确切大小,但可以使用下面的公式进行粗略估计:
B树索引: 唯一值个数 * (数据类型字节数 + 24字节) 位图索引: (唯一值个数 * 行数 * / 8 * 压缩率) + (唯一值个数 * 32)
4.2.3 元数据和日志空间需求
在每个Segment主机上,还有一些Greenplum数据库日志文件和系统元数据,相对于用户数据来说,它们所占空间很小。
- 系统元数据:每个Segment实例(Primary或Mirror)或Master实例的元数据约有20MB。
- 预写日志:对于每个Segment实例(Primary或Mirror)或Master实例,为预写日志(WAL)分配空间。WAL被划分为每个64MB的段文件,文件数量最多为:2 * checkpoint_segments + 1。可以使用它来估计WAL的空间需求,Greenplum数据库实例的默认checkpoint_segments为8,这意味着为主机上的每个实例分配1088MB的WAL空间。
- 数据库日志文件:每个Segment实例和Master实例生成的数据库日志文件将随时间增长。应为这些日志文件分配足够的空间,并使用日志轮换功能以确保日志文件不会增长过大。
4.2.4 RAID划分最佳实践
机械盘建议做RAID-5,一方面可以提高数据安全性,另一方面能缓解倾斜的影响。对于机械盘RAID-5一般采取如下方式配置:
- StripSize:Master建议32KB ~ 128KB,准确的选择可以根据测试情况来确定。如果无法确定,可以选择128KB。Segment建议256KB,这是经验值,具体设备的最优值可以根据测试来确定。
- WritePolicy:选择[Always Write Back]或称为[Force Write Back]。
- ReadPolicy:选择[Read Ahead]。
- Raid Cache比例:不建议调整,因为调整了反而综合性能往往会下降。
- Drive Cache:选择[Disable]。
- IO Policy:选择[Direct]。
- 系统盘:操作系统建议安装在单独的两块盘的RAID-1上。
- Hotspare:如果需要,建议做Global Hotspare。如果更换磁盘的流程不是很长,比如一两天就能更换故障磁盘,建议可以不配置Hotspare。Hotspare不是一定会带来好处,因为出现故障时,RAID的性能会有很大下降,且这个过程是自动的,无法根据业务情况灵活安排。
Master类主机的RAID划分参考如表4-1所示。
磁盘 |
RAID类型 |
磁盘数量 |
设备号 |
可用容量 |
挂载点 |
用途 |
本地盘 |
RAID-1 |
2 |
/dev/sda |
2048MB |
/boot |
操作系统 |
剩余尺寸 |
/ |
|||||
RAID-5 |
X+1+1 |
/dev/sdb |
内存尺寸 |
swap |
SWAP |
|
/dev/sdc |
剩余尺寸 |
/data |
数据盘 |
表4-1 Master类主机RAID划分
Segment类主机的RAID划分参考如表4-2所示。
磁盘 |
RAID类型 |
磁盘数量 |
设备号 |
可用容量 |
挂载点 |
用途 |
本地盘 |
RAID-1 |
2 |
/dev/sda |
2048MB |
/boot |
操作系统 |
剩余尺寸 |
/ |
|||||
RAID-5 |
Y+1+1 |
/dev/sdb |
内存尺寸/2 |
swap |
SWAP |
|
/dev/sdc |
剩余尺寸 |
/data1 |
数据盘 |
|||
Y+1+1 |
/dev/sdd |
内存尺寸/2 |
swap |
SWAP |
||
/dev/sde |
剩余尺寸 |
/data2 |
数据盘 |
表4-2 Segment类主机RAID划分
生产环境一般都需要配置Mirror,一旦出现故障切换,Mirror被**的主机将会消耗更多的内存资源,因此SWAP是对故障切换的一种保护。在配置Greenplum数据库时,在健康状态下不应该使用SWAP。如果镜像模式是group mirroring,SWAP尺寸应该与物理内存相同,如果是spread mirroring,一般可以设置SWAP尺寸为物理内存的1/N,N为单台主机上所有Segment实例数,包括Primary和Mirror。
由于SWAP的性能会极大影响计算效率,Greenplum要求将SWAP设置在性能最好的磁盘上。两块盘组成的RAID-1用作操作系统安装,其性能与数据盘的RAID-5相比差很多,因此不能将SWAP设置在操作系统盘上。
对于SSD或NVMe盘来说,以上关于性能的问题需要重新衡量,比如SWAP放在哪里,是否要做RAID等。一般来说,在不考虑安全要求的情况下,建议不做RAID,因为RAID的校验计算对于RAID卡的计算能力来说,会约束磁盘的性能发挥。如果条件允许,可能SSD或NVMe是更好的选择,这也是硬盘技术的未来趋势。机械盘在长期高压力下,故障率会很高,而SSD技术则会更稳定。
4.3 操作系统配置
本节说明如何为Greenplum数据库软件安装准备操作系统环境。安装环境的主机、软硬件信息如下:
- 主机信息如表4-3所示,所有主机在一个局域网内通过万兆网连接。
别名 |
IP地址 |
Greenplum角色 |
mdw |
114.112.77.198 |
master、segment |
smdw |
114.112.77.199 |
standby master、segment |
sdw3 |
114.112.77.200 |
segment |
表4-3 主机信息
- 硬件配置:每台主机CPU 2 * 12核;内存128G;SSD用作Segment数据盘,可用空间7.4TB,机械盘用于Master数据盘,可用空间1.4T。
- 软件版本如表4-4所示。
名称 |
版本 |
操作系统 |
CentOS Linux release 7.9.2009 (Core) |
JDK |
openjdk version "1.8.0_282" |
Greenplum |
6.14.1 |
表4-4 系统软件版本
本专题后面的实践部分都是在本节描述主机环境中进行的。注意这只是个实验环境,生产环境中,Greenplum的Master、Standby Master、Segment应该部署在独立主机上,并且硬件配置,尤其是CPU核数与物理内存应该有所增加。
4.3.1 安装操作系统
根据实践总结,建议按照表4-5所示方式安装Linux操作系统,这也是目前的主流选择。
选项 |
要求 |
|||
操作系统版本 |
7.3以上X86 64位服务器 |
|||
目录及尺寸 |
挂载点 |
设备名 |
文件系统格式 |
尺寸 |
/boot |
/sda1 |
XFS |
2048MB |
|
/ |
/sda2 |
XFS |
剩余全部 |
|
SWAP |
/sdb |
SWAP |
内存尺寸/2 |
|
SWAP |
/sdd |
SWAP |
内存尺寸/2 |
|
语言选择 |
English(United States) |
|||
时区选择 |
Asia/Shanghai |
|||
软件选择 |
File and Print Server |
|||
附加组件选择 |
Development Tools |
表4-5 Linux安装
如果在安装操作系统时,图形化引导界面中无法配置超过128GB的SWAP,可以先不配置,留在操作系统装好之后再配。Greenplum数据库使用的数据盘不需要在安装操作系统时配置(表4-5中未列出数据盘),可以在装好操作系统之后,在准备安装部署Greenplum数据库时再统一按照文件系统挂载要求进行配置。按本实验环境的主机规划,Master类主机只需要一个数据分区/data,存储介质为机械盘,可用空间1.4TB;Segment类主机需要两个数据分区/data1、/data2,分别用作Primary和Mirror,存储介质是SSD,可用空间各为3.7TB。
最好为Greenplum数据库的操作系统配置yum源。在部署Greenplum集群时,可能会有少量的软件包需要安装,对于未按照建议安装的操作系统,可能会有大量的软件包需要安装。
4.3.2 禁用SELinux和防火墙
对于运行RHEL或CentOS的主机系统,必须禁用SELinux,或将其配置为允许对Greenplum进程、目录和gpadmin用户进行无限制访问。在所有主机用root用户执行以下步骤禁用SELinux。
1. 检查SELinux状态
sestatus
2. 如果SELinux状态不是disabled,编辑/etc/selinux/config文件修改SELINUX参数值为disabled。
SELINUX=disabled
完成以上操作后需要重启系统以使配置生效。我们将在完成所有操作系统配置后再重启系统,一次性使所有配置生效。如要临时禁用SELinux,可执行下面的命令:
setenforce 0
还应该禁用Linux 6.x上的iptables,或7.x的firewalld等防火墙软件。如果未禁用防火墙,则必须将其配置为允许Greenplum主机之间进行所需的通信。在所有主机用root用户执行以下步骤禁用防火墙软件。
1. 检查防火墙状态
systemctl status firewalld
如果已禁用则输出如下:
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
2. 如果需要,禁用防火墙服务
systemctl stop firewalld.service
systemctl disable firewalld.service
4.3.3 操作系统推荐配置
Greenplum要求在系统的所有主机(Master类和Segment类)上设置某些Linux操作系统参数。通常需要更改以下类别的系统参数:
- 共享内存:除非内核的共享内存段大小合适,否则Greenplum数据库实例将无法工作。对于Greenplum数据库,大多数默认操作系统安装的共享内存值设置得太低。在Linux系统上还必须禁用OOM killer。
- 网络:在大容量Greenplum数据库系统上,必须设置某些与网络相关的参数,以优化Greenplum互连网络连接。
- 用户限制:用户限制控制由用户shell启动进程的可用资源。Greenplum数据库要求单个进程可以打开的文件描述符数值更高。默认设置可能会导致某些Greenplum数据库查询失败,因为它们将耗尽处理查询所需的文件描述符。
在所有主机用root用户执行以下步骤。
1. 设置主机名
编辑/etc/hosts文件,添加Greenplum系统中的所有IP、主机名、别名。Master别名为mdw,Standby Master别名为smdw,Segment别名为sdw1、sdw2 ...。
114.112.77.198 mdw
114.112.77.199 smdw
114.112.77.200 sdw3
2. 设置系统参数
编辑/etc/sysctl.conf文件,添加如下参数设置,然后执行sysctl -p使配置生效。
# 共享内存页
kernel.shmall = 32912094
kernel.shmmax = 134807937024
kernel.shmmni = 4096
# Segment主机内存溢出策略
vm.overcommit_memory = 2
vm.overcommit_ratio = 95
# 禁用端口范围
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=33554432
net.core.wmem_max=33554432
vm.swappiness = 0
vm.zone_reclaim_mode = 0
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
# 对于大于64GB内存的主机系统,推荐以下配置
vm.dirty_background_ratio = 0
vm.dirty_ratio = 0
vm.dirty_background_bytes = 1610612736 # 1.5GB
vm.dirty_bytes = 4294967296 # 4GB
vm.min_free_kbytes = 7898906
Greenplum数据库使用共享内存在属于同一postgres实例的postgres进程之间进行通信。shmall设置可在系统范围内使用的共享内存总量(以页为单位)。shmmax以字节为单位设置单个共享内存段的最大大小。根据系统的物理内存和页面大小设置kernel.shmall和kernel.shmmax值。通常这两个参数的值应为系统物理内存的一半。使用操作系统变量 _PHYS_PAGES和PAGE_SIZE设置参数:
kernel.shmall 设置为echo $(expr $(getconf _PHYS_PAGES) / 2)的值
kernel.shmmax 设置为echo $(expr $(getconf _PHYS_PAGES) / 2 \* $(getconf PAGE_SIZE))的值
如果Greeplum的Master类主机和Segment类主机的物理内存大小不同,则对应主机上的kernel.shmall和kernel.shmmax值也将不同。
操作系统使用vm.overcommit_memory内核参数来确定可以为进程分配多少内存。对于Greenplum数据库,此参数应始终设置为2。vm.overcommit_ratio是用于应用程序进程的内存百分比,其余部分保留给操作系统。
为避免Greenplum数据库和其他应用程序发生端口冲突,Greenplum集群初始化时,不要指定参数net.ipv4.ip_local_port_range范围内的端口作为Greenplum数据库端口。
增加vm.min_free_kbytes以确保满足来自网络和存储驱动程序的PF_MEMALLOC请求,这对于具有大量系统内存的系统尤其重要。不要将vm.min_free_kbytes设置为高于系统内存的5%,这样做可能会导致内存不足。使用下面的awk命令将vm.min_free_kbytes设置为系统物理内存的3%:
awk 'BEGIN {OFMT = "%.0f";} /MemTotal/ {print "vm.min_free_kbytes =", $2 * .03;}' /proc/meminfo >> /etc/sysctl.conf
3. 设置资源限制
Linux模块pam_limits通过读取limits.conf文件或20-nproc.conf文件(Linux 7)中的值来设置用户限制,确保文件中的所有参数都设置为所需值。编辑/etc/security/limits.d/20-nproc.conf文件,添加(或修改)如下参数设置。执行ulimit -a确认当前配置。
* soft nofile 524288
* hard nofile 524288
* soft nproc 131072
* hard nproc 131072
4. 设置XFS文件系统mount选项
编辑/etc/fstab文件,添加XFS文件系统mount选项为rw,nodev,noatime,nobarrier,inode64,例如:
/dev/data /data xfs rw,nodev,noatime,nobarrier,inode64 0 0
/dev/data1 /data1 xfs rw,nodev,noatime,nobarrier,inode64 0 0
/dev/data2 /data2 xfs rw,nodev,noatime,nobarrier,inode64 0 0
重新mount使配置生效,例如:
mount -o remount /data
mount -o remount /data1
mount -o remount /data2
# 查看
mount
5. 设置预读值
每个磁盘设备文件的预读(blockdev)值应为16384。
# 获取值,例如:
/sbin/blockdev --getra /dev/sdb1
# 设置值,例如:
/sbin/blockdev --setra 16384 /dev/sdb1
将设置命令添加到/etc/rc.d/rc.local文件,并将该文件设置为可执行,使得系统重启自动执行。
chmod +x /etc/rc.d/rc.local
6. 设置磁盘IO调度策略
用于磁盘访问的Linux磁盘IO调度程序支持不同的策略,如CFQ、AS和deadline。建议使用deadline scheduler选项,例如:
echo deadline > /sys/block/sdb/queue/scheduler
echo mq-deadline > /sys/block/nvme0n1/queue/scheduler
echo mq-deadline > /sys/block/nvme1n1/queue/scheduler
将设置命令添加到/etc/rc.d/rc.local文件,使得系统重启时自动执行。按照以下官方文档中描述的方法,在我的环境中重启后无效:
# 设置
grubby --update-kernel=ALL --args="elevator=mq-deadline"
# 查看
grubby --info=ALL
7. 禁用透明大页面
RHEL 6.0或更高版本默认启用透明大页面(Transparent Huge Pages,THP),它会降低Greenplum数据库的性能。
# 查看当前配置
cat /sys/kernel/mm/transparent_hugepage/enabled
# 设置
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 使得系统重启自动生效
grubby --update-kernel=ALL --args="transparent_hugepage=never"
# 查看
grubby --info=ALL
8. 禁止IPC对象删除
禁用RHEL 7.2或CentOS 7.2的IPC对象删除。当非系统用户帐户注销时,默认的systemd设置RemoveIPC=yes会删除IPC连接,这会导致gpinitsystem程序因信号量错误而失败。执行以下操作以避免此问题。
编辑/etc/systemd/logind.conf文件,设置RemoveIPC参数:
RemoveIPC=no
重启服务使配置生效:
service systemd-logind restart
9. 设置SSH连接数阈值
某些Greenplum数据库管理实用程序,如gpexpand、gpinitsystem和gpaddmirrors,在系统之间使用SSH连接来执行其任务。在大型Greenplum数据库部署、云部署或每个主机具有大量Segment的部署中,这些实用程序可能会超过主机未经身份验证连接的最大阈值,发生这种情况时会收到错误:
ssh_exchange_identification: Connection closed by remote host.
更新/etc/ssh/sshd_config文件中的MaxStartups和MaxSessions配置参数增加连接阈值。
MaxStartups 10:30:200
MaxSessions 200
使用“start:rate:full”语法指定MaxStartups,可以通过SSH守护进程启用随机早期连接断开。start标识在断开连接前允许的最大未经验证的SSH连接尝试次数。一旦达到未经验证的连接尝试的开始次数,SSH守护进程将拒绝后续连接尝试的百分比。full标识未经验证的连接尝试的最大次数,在此之后所有尝试都被拒绝。
重启服务使配置生效:
systemctl reload sshd.service
10. 确认或配置时区
date命令的输出应该为东八区,例如:Thu Feb 25 08:13:00 CST 2021。如果在安装操作系统时设置的时区有误,可以执行tzselect命令更改时区,依次选择 Asia -> China -> Beijing Time -> YES。一定要在安装Greenplum前确保时区设置正确,因为在Greenplum系统初始化后,LC_COLLATE、LC_CTYPE的值不能再更改。
4.3.4 时钟同步
应该使用NTP网络时间协议同步构成Greenplum集群的所有主机的系统时钟。Segment主机上的NTP应配置为使用Master主机作为主时间源,Standby Master主机作为辅助时间源。在Master主机和Standby Master主机上,将NTP配置为指向首选时间服务器。
1. 在mdw主机的/etc/ntp.conf文件中添加NTP服务器
server 101.251.209.250
2. 在smdw主机的/etc/ntp.conf文件中添加NTP服务器
server mdw prefer
server 101.251.209.250
3. 在sdw3主机的/etc/ntp.conf文件中添加NTP服务器
server mdw prefer
server smdw
4. 在所有主机启动ntpd服务并查看时间同步状态
systemctl disable chronyd
systemctl enable ntpd
systemctl start ntpd
ntpstat
4.3.5 创建Greenplum管理员账号
不能以root用户身份运行Greenplum数据库服务器,因此需要在每个节点上创建专用的操作系统用户帐户,以运行和管理Greenplum数据库,按照惯例,此用户帐户名为gpadmin。gpadmin用户必须具有访问安装和运行Greenplum数据库所需的服务和目录的权限。
每个Greenplum主机上的gpadmin用户必须配置SSH**对,并且集群中的任何主机都能够免密SSH到群集中的任何主机。可以选择授予gpadmin用户sudo权限,以便可以使用sudo、ssh、scp、gpssh、gpscp命令以gpadmin身份管理Greenplum数据库集群中的所有主机。
以下步骤显示如何在主机上设置gpadmin用户、设置密码、创建SSH**对以及启用可选的sudo功能。
1. 建立组和用户
注意确保gpadmin用户在每个主机上具有相同的用户id(uid)和组id(gid),以防止使用它们进行标识的脚本或服务出现问题。如果gpadmin用户在不同的Segment主机上具有不同的uid或gid,则将Greenplum数据库备份到某些网络文件系统或存储设备时可能会失败。创建gpadmin组和用户时,可以使用groupadd -g选项指定gid,使用useradd -u选项指定uid。使用命令id gpadmin查看当前主机上gpadmin用户的uid和gid。
groupadd -r -g 1001 gpadmin
useradd gpadmin -r -m -g gpadmin -u 1001
passwd gpadmin
chown -R gpadmin:gpadmin /data
chown -R gpadmin:gpadmin /data1
chown -R gpadmin:gpadmin /data2
2. 生成SSH**对
切换到gpadmin用户并为gpadmin用户生成SSH**对。在提示输入passphrase时按会车,以便SSH连接不需要输入密码短语。
su gpadmin
ssh-****** -t rsa -b 4096
3. 授予gpadmin用户sudo访问权限
执行visudo命令,去掉下行的注释:
# %wheel ALL=(ALL) NOPASSWD: ALL
将gpadmin用户添加到wheel组:
usermod -aG wheel gpadmin
4.3.6 安装JDK(可选)
# 查找yum资源库中的java包
yum search java | grep -i --color JDK
# 安装Java 1.8
yum install -y java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
# 验证安装
java -version
重启主机使所有配置生效。
4.4 安装Greenplum软件
本节说明如何在构成Greenplum集群的所有主机上安装Greenplum数据库软件二进制文件,如何为gpadmin用户启用免密SSH,以及如何验证安装。
4.4.1 安装Greenplum软件包
在所有主机用root用户执行以下步骤。
1. 下载安装包
wegt https://github.com/greenplum-db/gpdb/releases/download/6.14.1/open-source-greenplum-db-6.14.1-rhel7-x86_64.rpm
2. 安装
yum -y install ./open-source-greenplum-db-6.14.1-rhel7-x86_64.rpm
3. 修改安装目录的属主和组
chown -R gpadmin:gpadmin /usr/local/greenplum*
chgrp -R gpadmin /usr/local/greenplum*
在RHEL/CentOS系统上,可以使用带有--prefix选项的rpm命令将Greenplum安装到非默认目录(而不是在/usr/local下)。但是使用rpm不会自动安装Greenplum数据库依赖项,所以必须手动将依赖项安装到每个主机系统。要将Greenplum安装到指定目录,在所有主机用root用户执行以下步骤。
# 手动安装依赖
yum install apr apr-util bash bzip2 curl krb5 libcurl libevent libxml2 libyaml zlib openldap openssh openssl openssl-libs perl readline rsync R sed tar zip
# 使用带有--prefix选项的rpm命令指定安装目录
rpm --install ./open-source-greenplum-db-6.14.1-rhel7-x86_64.rpm
# 修改安装目录的属主和组
chown -R gpadmin:gpadmin <directory>/greenplum*
4.4.2 配置免密SSH
在Greenplum集群中的任何主机上的gpadmin用户,必须能够通过SSH免密连接到集群中的任何主机。如果启用了从Master主机到集群中其他每台主机的免密SSH(“1-n免密SSH”),则可以使用Greenplum的gpssh exkeys命令行实用程序启用从每台主机到其他每台主机的免密SSH(“n-n免密SSH”)。
在mdw主机用gpadmin用户执行以下步骤。
1. 设置Greenplum环境
source /usr/local/greenplum-db/greenplum_path.sh
2. 启用1-n 免密SSH
# 将当前用户的公钥拷贝到集群中其他主机的authorized_hosts文件中
ssh-copy-id mdw
ssh-copy-id smdw
ssh-copy-id sdw3
3. 在gpadmin用户主目录创建名为all_host的文件,内容为所有Greenplum主机名。
mdw
smdw
sdw3
4. 启用n-n 免密SSH
gpssh-exkeys -f all_host
4.4.3 确认软件安装
要确保Greenplum软件已正确安装和配置,在mdw主机执行以下确认步骤。如有必要,在继续执行下一项任务之前纠正所有问题。
su - gpadmin
gpssh -f all_host -e 'ls -l /usr/local/greenplum-db-6.14.1'
如果安装成功,应该能够在没有密码提示的情况下登录到所有主机。所有主机都应该显示Greenplum安装目录中有相同的内容,并且这些目录的属主都是gpadmin用户。
Greenplum安装目录下包含以下文件或目录:
- greenplum_path.sh:此文件包含greenplum数据库的环境变量。
- bin:此目录包含Greenplum数据库管理实用程序,还包含PostgreSQL客户端和服务器程序,其中大多数程序也用于Greenplum。
- docs/cli_help:此目录包含Greenplum命令行实用程序的帮助文件。
- docs/cli_help/gpconfigs:此目录包含示例gpinitsystem配置文件和主机文件,可在安装和初始化Greenplum数据库系统时修改和使用这些文件。
- ext:一些Greenplum数据库实用程序使用的捆绑程序(如Python)。
- include:C头文件。
- lib:Greenplum和PostgreSQL库文件。
- sbin:支持/内部脚本和程序。
- share:Greenplum数据库的共享文件。
4.5 初始化Greenplum数据库系统
4.5.1 创建数据存储区
1. 在Master和Standby Master主机创建数据存储区
Master主机和Standby Master主机上需要一个数据存储区来存储Greenplum数据库系统数据,如目录数据和其他系统元数据。Master类实例的数据目录位置不同于Segment类,前者不存储任何用户数据,只有系统目录表和元数据,因此不需要指定与Segment上相同的存储空间。创建或选择用作数据存储区域的目录,此目录应有足够的磁盘空间存放数据,并且其属主为gpadmin。
在mdw主机用gpadmin用户执行以下命令:
# Master
mkdir -p /data/master
chown gpadmin:gpadmin /data/master
source /usr/local/greenplum-db/greenplum_path.sh
# Standby Master
gpssh -h smdw -e 'mkdir -p /data/master'
gpssh -h smdw -e 'chown gpadmin:gpadmin /data/master'
2. 在Segment主机创建数据存储区
在mdw主机用gpadmin用户执行以下命令,一次在所有Segment主机上创建Primary和Mirror数据目录。注意因为本实验环境中只有三台主机,其中有两台扮演双重角色。
source /usr/local/greenplum-db/greenplum_path.sh
gpssh -f all_host -e 'mkdir -p /data1/primary'
gpssh -f all_host -e 'mkdir -p /data1/mirror'
gpssh -f all_host -e 'mkdir -p /data2/primary'
gpssh -f all_host -e 'mkdir -p /data2/mirror'
gpssh -f all_host -e 'chown -R gpadmin /data1/*'
gpssh -f all_host -e 'chown -R gpadmin /data2/*'
4.5.2 验证系统
Greenplum提供了一个名为gpcheckperf的管理实用程序,可用于识别集群主机上的硬件和系统级问题。gpcheckperf在指定主机上启动会话,并运行以下性能测试:
- 网络性能(gpnetbench*)
- 磁盘I/O性能(dd测试)
- 内存带宽(stream测试)
在使用gpcheckperf之前,必须在性能测试涉及的主机之间设置免密SSH。gpcheckperf调用gpssh和gpscp,因此这些Greenplum实用程序必须位于$PATH中。
1. 验证网络性能
通过gpcheckperf命令的-r n、-r N或-r M参数来测试网络性能,-r n是串行对测试,-r N是并行对测试,-r M是全矩阵交叉测试。从指定的参与测试的主机列表,按照顺序进行配对。比如-r n,第一个向第二个发包,完成后第二个向附一个发包,然后第三个和第四个配对,顺序相互发包,依次测试直到所有主机测试完。若果是-r N,匹配的顺序和-r n一致,不同的是所有分组测试同时开始相互发包。如果是奇数个主机,最后一个会和第一个再组成一组,对于-r N测试,可能会影响最终结果。-r M则是每个主机都向其他主机发包,形成全矩阵交叉测试。-r n和-r N能够体现网卡之间的独立性能,而-r M则更能体现实际生产使用时的网络负载能力,是真实的工作模式。
gpcheckperf运行一个网络基准测试程序,将5秒的数据流从当前主机传输到测试中包含的每个远程主机。默认情况下,数据并行传输到每个远程主机,最小、最大、平均和中值网络传输速率以每秒兆字节(MB/s)为单位报告。如果传输速率低于预期(小于100 MB/s),则可以使用-r n选项连续运行网络测试以获得每台主机的结果。
在mdw主机用gpadmin用户执行以下步骤,结果应该大于100 MB/s。
(1)设置Greenplum环境
source /usr/local/greenplum-db/greenplum_path.sh
(2)检查点对点网络传输速度
# 双向同时发包,适合偶数个主机的情况
gpcheckperf -f all_host -r N -d /tmp > subnet.out
# 单向顺序发包,适合奇数个主机的情况
gpcheckperf -f all_host -r n -d /tmp > subnet.out
(3)检查全矩阵多对多网络传输速度
gpcheckperf -f all_host -r M -d /tmp > subnet.out
Greenplum的大多数系统都配置有多个网卡(network interface cards,NIC),每个网卡位于自己的子网中。在测试网络性能时,单独测试每个子网非常重要。例如,考虑如表4-6所示的主机网络配置。
Segment主机 |
子网1 |
子网2 |
Segment1 |
sdw1-1 |
sdw1-2 |
Segment2 |
sdw2-1 |
sdw2-2 |
Segment3 |
sdw3-1 |
sdw3-2 |
表4-6 每个Segment主机配置两个子网
需要创建两个主机文件用于gpcheckperf网络测试,如表4-7所示。
hostfile_gpchecknet_ic1 |
hostfile_gpchecknet_ic2 |
sdw1-1 |
sdw1-2 |
sdw2-1 |
sdw2-2 |
sdw3-1 |
sdw3-2 |
表4-7 用于gpcheckperf网络测试的主机文件
然后每个子网运行一次gpcheckperf。如果测试奇数台主机,则以串行对测试模式运行:
$ gpcheckperf -f hostfile_gpchecknet_ic1 -r n -d /tmp > subnet1.out
$ gpcheckperf -f hostfile_gpchecknet_ic2 -r n -d /tmp > subnet2.out
如果要测试的主机数量为偶数,则可以在并行测试模式(-r N)下运行。
2. 验证磁盘IO和内存带宽性能
要测试磁盘和内存带宽性能,使用 -r ds 选项运行gpcheckperf。磁盘测试使用dd命令(标准UNIX实用程序)测试逻辑磁盘或文件系统的顺序吞吐量性能。内存测试使用stream基准程序来测量可持续内存带宽。结果以每秒MB为单位显示。使用 -d 选项指定要在每个主机上测试的文件系统目录,必须对这些目录具有写访问权限。需要测试所有Primary和Mirror的目录位置。
在mdw主机用gpadmin用户执行以下步骤。
(1)设置Greenplum环境
source /usr/local/greenplum-db/greenplum_path.sh
(2)检查磁盘I/O(dd)和内存带宽(stream)性能
gpcheckperf -f all_host -r ds -D -d /data1/primary -d /data2/primary -d /data1/mirror -d /data2/mirror > io.out
程序需要执行一段时间,因为它会在主机之间复制大文件。测试完成后,将在输出中看到磁盘读写和流测试的汇总结果。
4.5.3 初始化数据库
Greenplum数据库是分布式的,因此其初始化过程涉及多个单独的PostgreSQL数据库实例,即在Greenplum中的Segment实例。包括Master和所有Segment在内的每个数据库实例都必须在系统中的所有主机上进行初始化,以便它们可以作为一个统一的DBMS一起工作。Greenplum提供了自己的initdb版本,称为gpinitsystem,它负责在Master和每个Segment实例上初始化数据库,并以正确的顺序启动每个实例。初始化并启动Greenplum数据库系统后,就可以通过Master连接到Greenplum,就像在PostgreSQL中一样创建和管理数据库。
在mdw主机用gpadmin用户执行以下步骤进行Greenplum初始化。
1. 设置Greenplum环境
source /usr/local/greenplum-db/greenplum_path.sh
2. 创建Greenplum数据库配置文件
(1)复制Greenplum数据库配置文件
cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config /home/gpadmin/gpinitsystem_config
(2)编辑/home/gpadmin/gpinitsystem_config文件内容如下
# Greenplum系统名称
ARRAY_NAME="Greenplum Data Platform"
# 段数据目录名的前缀
SEG_PREFIX=gpseg
# Primary的起始端口号
PORT_BASE=6000
# Primary段数据目录所在的文件系统位置
# 列表中的位置数决定了在每台物理主机上创建的Primary段数
# 这些Primary段将在所有Segment主机中均匀分布
declare -a DATA_DIRECTORY=(/data1/primary /data1/primary /data1/primary /data2/primary /data2/primary /data2/primary)
# Master主机的操作系统主机名或IP地址
MASTER_HOSTNAME=mdw
# Master实例数据目录所在的文件系统位置
MASTER_DIRECTORY=/data/master
# Master实例端口号
MASTER_PORT=5432
# 用于连接远程主机的shell程序
TRUSTED_SHELL=ssh
# WAL检查点最多可以等待的WAL个数,如无必要不要修改
# 增加该参数的值,检查点频发度会降低,但崩溃后恢复时间会延长
# 初始化后可通过checkpoint_segments参数修改配置
CHECK_POINT_SEGMENTS=8
# 服务器端缺省字符集编码
ENCODING=UNICODE
# Mirror的起始端口号
MIRROR_PORT_BASE=7000
# Mirror段数据目录的文件系统位置,个数必须等于DATA_DIRECTORY参数中指定的Primary段的数量。
declare -a MIRROR_DATA_DIRECTORY=(/data1/mirror /data1/mirror /data1/mirror /data2/mirror /data2/mirror /data2/mirror)
(3)执行初始化
cd ~
cp all_host seg_host
gpinitsystem -c gpinitsystem_config -h seg_host -s smdw -S /data/master/ -O config_template
gpinitsystem程序将使用配置文件中定义的值创建Greenplum数据库系统,-c指定配置文件名,-h指定Segment主机文件,-s指定Standby Master主机名,-S指定Standby Master的数据目录,-O指定输出的配置文件名。
gpinitsystem应用程序将验证系统配置,确保可以连接到每个主机并访问配置中指定的数据目录。如果所有检查都成功,程序将提示确认配置,例如:
=> Continue with Greenplum creation? Yy/Nn
键入y开始执行初始化。安装成功结束时,程序将启动Greenplum数据库系统,应该看到:
=> Greenplum Database instance successfully created.
如果出现类似以下的错误:
20210308:13:18:39:082622 gpinitstandby:vvml-z2-greenplum:gpadmin-[INFO]:-Validating environment and parameters for standby initialization...
20210308:13:18:39:082622 gpinitstandby:vvml-z2-greenplum:gpadmin-[ERROR]:-Parent directory does not exist on host smdw
20210308:13:18:39:082622 gpinitstandby:vvml-z2-greenplum:gpadmin-[ERROR]:-This directory must be created before running gpactivatestandby
20210308:13:18:39:082622 gpinitstandby:vvml-z2-greenplum:gpadmin-[ERROR]:-Failed to create standby
20210308:13:18:39:082622 gpinitstandby:vvml-z2-greenplum:gpadmin-[ERROR]:-Error initializing standby master: Parent directory does not exist
单独初始化Standby Master实例:
gpinitstandby -s smdw
成功初始化后,可以执行gpstate命令检查Greenplum系统状态:
# 整体状态
gpstate
# Segment状态
gpstate -e
# Standby Master状态
gpstate -f
(4)排错
如果初始化过程中遇到任何错误,整个过程将失败,并且可能留下一个部分创建的系统。此时应查看错误消息和日志,以确定故障原因以及故障发生的位置。日志文件在~/gpAdminLogs中创建。
根据发生错误的时间,可能需要进行清理,然后重试gpinitsystem程序。例如,如果创建了一些Segment实例,但有些失败,则可能需要停止postgres进程,并从数据存储区域中删除任何由gpinitsystem创建的数据目录。如果需要,将创建一个backout脚本来帮助清理。
如果gpinitsystem程序失败,并且系统处于部分安装状态,将会创建以下备份脚本:
~/gpAdminLogs/backout_gpinitsystem_<user>_<timestamp>
可以使用此脚本清理部分创建的Greenplum数据库系统。此回退脚本将删除任何gpinitsystem创建的数据目录、postgres进程和日志文件。更正导致gpinitsystem失败的错误并运行backout脚本后,重新初始化Greenplum数据库。
4.5.4 设置Greenplum环境变量
必须为Master主机和Standby Master主机上的Greenplum管理员用户(缺省为gpadmin)设置环境变量。安装目录中提供了greenplum_path.sh文件,其中包含Greenplum数据库的环境变量设置。Greenplum数据库管理实用程序还要求设置MASTER_DATA_DIRECTORY环境变量,指向Master数据目录位置中由gpinitsystem实用程序创建的目录。
在mdw主机用gpadmin用户执行以下步骤。
1. 编辑资源文件~/.bashrc,在文件中添加如下环境变量
source /usr/local/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/master/gpseg-1
export PGPORT=5432
export PGUSER=gpadmin
export PGDATABASE=postgres
export LD_PRELOAD=/lib64/libz.so.1 ps
2. 使配置生效
source ~/.bashrc
3. 将环境文件复制到standby master
cd ~
scp .bashrc smdw:`pwd`
4.6 允许客户端连接
Greenplum系统初始安装后,数据库包含一个预定义的超级用户。这个用户和安装Greenplum的操作系统用户具有相同的名字,叫做gpadmin。缺省时,系统只允许使用gpadmin用户从本地连接至数据库。为了允许任何其他其他用户从本地或远程主机连接数据库,需要配置Greenplum允许此类连接。
Greenplum从代码级可以追溯到PostgreSQL。它的客户端访问与认证,是由标准的PostgreSQL基于主机的认证文件pg_hba.conf所控制。Master和每个Segment的数据目录下都存在一个pg_hba.conf文件。在Greenplum中,Master实例的pg_hba.conf文件控制客户端对Greenplum系统的访问和认证,而Segment的pg_hba.conf文件,作用只是允许每个Segment作为Master节点主机的客户端连接数据库,而Segment本身并不接受其它其他客户端的连接。正因如此,不要修改Segment实例的pg_hba.conf文件。
pg_hba.conf的格式是普通文本,其中每行一条记录,表示一个认证条目,Greenplum忽略空行和任何#注释字符后面的文本。一行记录由四个或五个以空格或tab符分隔的字段构成。如果字段值中包含空格,则需要用双引号引起来,并且记录不能跨行。与很多其他数据库系统类似,Greenplum也接受TCP连接和本地的UNIX套接字连接。
每个TCP连接客户端的访问认证记录具有以下格式:
host|hostssl|hostnossl <database> <role> <CIDR-address>|<IP-address>,<IP-mask> <authentication-method>
本地UNIX域套接字的访问记录具有下面的格式:
local <database> <role> <authentication-method>
表4-8描述了每个字段的含义。
字段 |
描述 |
local |
匹配使用UNIX域套接字的连接请求。如果没有此种类型的记录,则不允许UNIX域套接字连接 |
host |
匹配使用TCP/IP的连接请求。除非在服务器启动时使用了适当的listen_addresses服务器配置参数(缺省值为“*”,允许所有IP连接),否则不能远程TCP/IP连接 |
hostssl |
匹配使用SSL加密的TCP/IP连接请求。服务器启动时必须通过设置ssl配置参数启用SSL |
hostnossl |
匹配不使用SSL的TCP/IP的连接请求 |
<database> |
指定匹配此行记录的数据库名。值“all”表示允许连接所有数据库。多个数据库名用逗号分隔。也可以指定一个包含数据库名的文件,在文件名前加“@” |
<role> |
指定匹配此行记录的数据库角色名。值“all”表示所有角色。如果指定的角色是一个组并且想包含所有的组成员,在角色名前面加一个“+”。多个角色名可以通过逗号分隔。也可以指定一个包含角色名的文件,在文件名前加“@” |
<CIDR-address> |
指定此行记录匹配的客户端主机的IP地址范围。它包含一个以标准点分十进制记法表示的IP地址,以及一个CIDR掩码长度。IP地址只能用数字表示,不能是域名或主机名。掩码长度标识客户端IP地址必须匹配的高位数。在IP地址、斜杠和CIDR掩码长度之间不能有空格。CIDR地址典型的例子有,单一主机如192.0.2.2/32,小型网络如192.0.2.0/24,大型网络如192.0.0.0/16。指定单一主机时,IPv4的CIDR掩码是32,Ipv6的是128。网络地址不要省略尾部的零 |
<IP-address>, <IP-mask> |
这个字段是另一种IP地址表示方法,用掩码地址替换掩码长度。例如,255.255.255.255对应的CIDR掩码长度是32。此字段用于host、hostssl和hostnossl记录 |
<authentication-method> |
指定连接认证时使用的方法。Greenplum支持PostgreSQL 9.0所支持的认证方法,如信任认证、口令认证、Kerberos 认证、基于Ident的认证、PAM 认证等 |
表4-8 pg_hba.conf文件中的字段含义
编辑mdw和smdw的/data/master/gpseg-1/pg_hba.conf文件,添加如下客户端IP或网段,允许任意地址访问。
host all all 0.0.0.0/0 md5
保存并关闭文件,然后执行下面的命令重载pg_hba.conf文件的配置,使修改生效:
gpstop -u
pg_hba.conf中的条目会按顺序进行匹配。当某个登录被前面的记录匹配,将不会继续匹配后面的记录。所以,一定要避免记录之间存在相互包含的关系,否则不容易发现登录失败的原因。通用原则是越靠前的条目匹配条件越严格,但认证方法越弱;越靠后的条目匹配条件越松散,但认证方法越强。本地socket连接使用ident认证方式。
编辑这个文件时一定要注意保证输入的正确性,避免Window隐藏符号等特殊不可见字符的出现,也不能随意修改初始化时自动生成的记录。错误的修改可能会导致数据库无法访问,甚至出现无法执行gpstop等尴尬情况,那时只能使用pg_ctl或kill -9才能停库,这是不应该发生的。
4.7 修改Greenplum配置参数
到目前为止,实验环境的Greenplum集群已经启动,并能够接受客户端连接,但所有服务器参数都使用的缺省值。应该根据具体硬件配置和应用需求修改某些重要的可配置参数,以使集群达到更好的性能。因为Greenplum的底层是多个PostgreSQL实例,可以参考PGTune - calculate configuration for PostgreSQL based on the maximum performance for a given hardware configuration来调整相关参数。
建议使用gpconfig命令来统一修改,命令主要选项说明如下:
- -s <参数名称>:显示服务器参数在Master和Segment上的当前值。
- -c <参数名称>:指定要配置的服务器参数。
- -v <参数值>:指定配置的服务器参数值。缺省该值将应用于集群中的所有数据库实例,包括Primary、Mirror、Master和Standby Master。
- -m <参数值>:参数值只应用于Master和Standby Master实例。该选项必须与 -v 选项一起使用。
本实验环境修改Greenplum配置参数的命令如下:
gpconfig -c max_connections -v 2500 -m 500
gpconfig -c max_prepared_transactions -v 500
gpconfig -c shared_buffers -v 5GB -m 32GB
gpconfig -c effective_cache_size -v 16GB -m 96GB
gpconfig -c maintenance_work_mem -v 1280MB -m 2GB
gpconfig -c log_statement -v none
gpconfig -c gp_enable_global_deadlock_detector -v on
gpconfig -c gp_workfile_compression -v on
gpconfig -c gp_max_partition_level -v 1
gpconfig -c gp_vmem_protect_limit -v 19660
gpconfig -c gp_resqueue_priority_cpucores_per_segment -v 5.3 -m 64
max_connections服务器参数限制对Greenplum数据库系统的并发访问数量,6.14版本的默认值Master为250,Segment为750。这是一个本地化参数,就是说需要把Master、Standby Master以及所有Segment都修改。建议Segment的值是Master的5-10倍,不过这个规律并非总是如此,在max_connections较大时通常没有这么高的倍数,2-3倍也是允许的,但Segment上的值不能小于Master。增加此参数值可能会导致Greenplum数据库请求更多的共享内存。
max_prepared_transactions设置同时处于准备状态的事务数,6.14版本的默认值为250。Greenplum内部使用准备事务保证跨Segment的数据完整性。该参数值必须大于等于max_connections,并且在Master和Segment上应该设置成相同的值。
shared_buffers设置一个Segment实例用于共享内存缓冲区的内存量,至少为128KB与16KB * max_connections的较大者,6.14版本的默认为125MB。如果连接Greenplum时发生共享内存分配错误,可以尝试增加SHMMAX或SHMALL操作系统参数的值,或者降低shared_buffers或者max_connections参数的值解决此类问题。
effective_cache_size参数告诉PostgreSQL的优化器有多少内存可以被用来缓存数据,以及帮助决定是否应该使用索引,6.14版本的默认值为16GB。这个数值越大,优化器使用索引的可能性也越大,因此这个数值应该设置成shared_buffers加上可用操作系统缓存两者的总量。通常这个数值会超过系统内存总量的50%,并且是32K的倍数。此参数仅用于估算目的,不影响Greenplum服务器实例分配的共享内存大小。
maintenance_work_mem指定VACUUM、CREATE INDEX等维护操作使用的最大内存量,6.14版本默认为16MB。较大的设置可能会提高VACUUM、CREATE INDEX或还原数据库dump的性能。
log_statement参数控制日志中记录哪些SQL语句,6.14版本的可选值为NONE、DDL、MOD、ALL,默认值为ALL。DDL记录所有数据定义命令,如CREATE、ALTER和DROP命令。MOD记录所有DDL语句,以及INSERT、UPDATE、DELETE、TRUNCATE和COPY FROM,还会记录PREPARE和EXPLAIN ANALYZE语句。
gp_enable_global_deadlock_detector控制是否启用Greenplum数据库全局死锁检测器来管理堆表上的并发更新和删除操作,以提高性能,默认设置为off,全局死锁检测器被禁用。启用全局死锁检测器允许并发更新,全局死锁检测器确定何时存在死锁,并通过取消与所涉及的最年轻事务关联的一个或多个后端进程来打破死锁。
gp_workfile_compression用于控制溢出文件是否进行压缩,6.14版本的默认值为off,一般建议配置为on。如果Greenplum数据库使用SATA磁盘驱动器,启用压缩可能有助于避免I/O操作导致磁盘子系统过载。
gp_max_partition_level指定最大分区层次。设置为1不允许创建多级分区。多级分区很容易导致很多叶子分区实际上存储的数据量很小甚至是空表,未必带来性能提升,反而会为分区维护带来异常的复杂度。
gp_vmem_protect_limit参数用于限制,在开启资源队列的情况下,一个Segment实例使用的最大内存总量,6.14版本默认值为8192MB。如果该值设置过大,将会出现操作系统内存不足的报错,设置过小又会导致内存利用不足。建议配置为:物理内存 * 0.9 / (primary+mirror数量),单位MB。例如,256G内存,6个primary,6个mirror,设置为19660。
gp_resqueue_priority_cpucores_per_segment设置每个Segment实例使用的CPU核数,6.14版本默认值为4。建议专用Master、Standby Master主机上设置为CPU核数,Segment主机上设置为CPU核数/(primary+mirror数量)。仅当使用基于资源队列时,才会强制执行该配置参数。
4.8 后续步骤
4.8.1 创建临时表空间
可以选择将临时文件或事务文件移动到一个特定的表空间从而改善数据库的查询、备份或数据读写的性能。Greenplum通过temp_tablespaces参数来控制用于Hash Agg、Hash Join、排序操作等临时溢出文件的存储位置。在6.14版本中,这个目录缺省为<data_dir>/base/pgsql_tmp。当使用create命令创建临时表和临时表上的索引时,如果没有明确指定表空间,temp_tablespaces所指向的表空间将存储这些对象的数据文件。
使用temp_tablespaces时需要注意:
- 只能为临时文件或事务文件指定一个临时表空间,该表空间还可以用作存储其他数据库对象的表空间。
- 如果被用于临时表空间,该表空间将不能被删除。
通过create tablespace来创建表空间,例如:
create tablespace tmptbs location '/data/tmptbs';
可以查询pg_tablespace系统表获取表空间的信息:
select oid,* from pg_tablespace;
表空间必须由superuser才可以创建,不过创建好之后可以允许普通数据库用户来使用该表空间。用superuser执行以下SQL命令为所有数据库用户指定临时表空间:
alter role all set temp_tablespaces='tmptbs';
4.8.2 创建用户
Greenplum采用基于角色的访问控制机制,简化了用户域权限的关联性。角色既可以代表一个数据库用户,又可以代表一组权限。角色所拥有的预定义的系统权限是通过角色属性实现的。
使用create role命令创建一个角色时,必须授予login系统属性(类似于Oracle的connect角色),使得该角色可以连接数据库。一个数据库角色有很多属性,用以定义该角色可以在数据库中执行的任务,或者具有的系统权限。表4-9描述了有效的角色属性。
属性 |
描述 |
SUPERUSER | NOSUPERUSER |
确定一个角色是否是超级用户。只有超级用户才能创建新的超级用户。缺省值为NOSUPERUSER |
CREATEDB | NOCREATEDB |
确定角色是否被允许创建数据库。缺省值为NOCREATEDB |
CREATEROLE | NOCREATEROLE |
确定角色是否被允许创建和管理其他角色。缺省值为NOCREATEROLE |
INHERIT | NOINHERIT |
确定角色是否从其所在的组继承权限。具有INHERIT属性的角色可以自动使用所属组已经被授予的数据库权限,无论角色是组的直接成员还是间接成员。缺省值为INHERIT |
LOGIN | NOLOGIN |
确定角色是否可以登录。具有LOGIN属性的角色可以将角色作为用户登录。没有此属性的角色被用于管理数据库权限(即用户组)。缺省值为NOLOGIN |
CONNECTION LIMIT connlimit |
如果角色能够登录,此属性指定角色可以建立多少个并发连接。缺省值为-1,表示没有限制 |
PASSWORD ‘password’ |
设置角色的口令。如果不使用口令认证,可以忽略此选项。如果没有指定口令,口令将被设置为null,此时该用户的口令认证总是失败。一个null口令也可以显示的写成PASSWORD NULL |
ENCRYPTED | UNENCRYPTED |
控制口令是否加密存储在系统目录中。缺省行为由password_encryption配置参数所决定,当前设置是MD5,如果要改为SHA-256加密,设置此参数为password。如果给出的口令字符串已经是加密格式,那么它被原样存储,而不管指定ENCRYPTED还是UNENCRYPTED。这种设计允许在dump/restore时重新导入加密的口令 |
VALID UNTIL ‘timestamp’ |
设置一个日期和时间,在该时间点后角色的口令失效。如果忽略此选项,口令将永久有效 |
RESOURCE QUEUE queue_name |
赋予角色一个命名的资源队列用于负载管理。角色发出的任何语句都受到该资源队列的限制。注意,这个RESOURCE QUEUE属性不会被继承,必须在每个用户级(登录)角色设置 |
DENY {deny_interval | deny_point} |
在此时间区间内禁止访问 |
表4-9 角色属性
现在Greenplum数据库只有gpadmin一个超级用户。执行下面的SQL命令创建一个用户:
create role dwtest with password '123456' login createdb;
测试登录:
psql -U dwtest -h mdw
超级用户只应该用于执行特定的系统管理任务,如故障处理、备份恢复、升级扩容等。一般的数据库访问不要使用gpadmin用户,ETL等生产系统也不应该使用gpadmin用户。后面的实践部分除非限制都用dwtest用户连接数据库。
4.9 Greenplum升级
最后简单介绍一下Greenplum 6的小版本升级过程。按照Greenplum的版本规则,6系列是一个大版本。在大版本内的升级全部属于小版本升级,主要是替换软件包。除此之外,还可能会有一些函数或者功能的修补,这些都会在官方的版本发布文档中有详细说明。
4.9.1 升级条件
检查运行Greenplum的主机硬件环境,以确保其符合Greenplum数据库的运行要求。实际上这个操作不仅仅是在升级之前要做,在日常运行中,也应该每几个月做一次巡检,根据每次的检查结果进行纵向比对,以便发现硬件性能的变化。可以通过gpcheckperf命令进行硬件的性能测试。
如果需要执行gpcheckcat命令,应该在准备升级前几周的一个维护时间窗口执行,因为gpcheckcat命令最好是在Restrict模式下进行。如果发现了Catalog问题,需要在升级之前进行修复。gpcheckcat命令位于$GPHOME/bin目录下,在执行该命令时,如果数据库不在Restrict模式下,可能会得到不准确的结果。
如果gpcheckcat命令检查出了Catalog的不一致,可以尝试通过-g参数生成修复不一致的SQL脚本,不过并不是任何Catalog不一致都可以自动生成修复脚本。在执行了修复SQL脚本之后,应该再次执行gpcheckcat命令并生成SQL脚本,以确保不再有Catalog不一致的情况。
4.9.2 升级步骤
事先下载新版软件包文件,并将其复制到构成Greenplum集群的所有主机的相同目录下,然后使用gpadmin操作系统用户在Master主机执行以下脚本进行升级,例如从6.17.2升级到6.18.0。
# 切换到gpadmin用户
su - gpadmin
# 停库
gpstop -af
# 升级软件包,all_host文件中包含构成Greenplum集群的所有主机名
gpssh -f all_host -v -e 'sudo yum -y upgrade /home/gpadmin/open-source-greenplum-db-6.18.0-rhel7-x86_64.rpm'
# 启库
gpstart
升级完成后,应尽快确认所有功能都可以正常工作。
小结
- 在准备安装部署Greenplum软件前,要确认所依赖的软硬件平台和网络环境。这些基础设施对Greenplum的性能、可用性和稳定性至关重要。建议生产环境使用Redhat或CentOS 7.3以上的64位版本的操作系统,文件系统使用XFS。硬件至少128 CPU核,256GB内存,数据目录使用SSD硬盘。网络至少两块万兆网卡,采用mode4的bond。所有主机软硬件环境一致。
- 生产环境建议部署Standby Master和Mirror Segment,不要等出现问题停服了才追悔莫及。
- 使用RAID 5,部署Mirror的前提下,用户数据实际容量估算公式为:磁盘大小 * (磁盘总数 - RAID数量 - Hotspare数量) * 0.9 * 0.7 * 3/7
- 操作系统需要适当配置以适应Greenplum使用。包括:禁用SELinux和防火墙、设置主机名、配置共享内存和内存溢出策略、Greenplum可用的端口号范围、套接字读写缓冲区大小、用户资源限制、设置XFS文件系统mount选项、设置预读值、设置磁盘IO调度策略、禁用透明大页面、禁止IPC对象删除、设置SSH连接数阈值、确认或配置时区、配置时钟同步、创建Greenplum管理员账号和主机间的免密SSH等。
- 按步骤执行Greenplum数据库系统初始化:创建数据存储区、执行gpcheckperf测试硬件和网络、准备好Greenplum数据库配置文件、执行gpinitsystem初始化数据库、设置Greenplum环境变量。
- 配置Master和Standby Master主机的pg_hba.conf文件以允许客户端连接。
- 为达到最佳性能修改Greenplum配置参数。
- 创建独立临时表空间提升性能。
- 创建单独的数据库用户而不要使用gpadmin执行应用代码。
- Greenplum的小版本升级步骤主要是停库、替换所有主机的软件包、启库。