作者:周雷皓 ,百度外卖大数据工程师,本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅《程序员》
本文介绍了大数据引擎Greenplum的架构和部分技术特点。从GPDB基本背景开始,在架构的层面上讲解GPDB系统内部各个模块的概貌,然后围绕GPDB的自身特性、并行执行和运维等技术细节,阐述了为什么选择Greenplum作为下一代的查询引擎解决方案。
Greenplum(以下简称GPDB)是一款开源数据仓库,基于开源的PostgreSQL改造而来,主要用来处理大规模数据分析任务。相比Hadoop,Greenplum更适合做大数据的存储、计算和分析引擎。
GPDB是典型的Master/Slave架构,在Greenplum集群中,存在一个Master节点和多个Segment节点,每个节点上可以运行多个数据库。Greenplum采用shared nothing架构(MPP),典型的Shared Nothing系统汇集了数据库、内存Cache等存储状态的信息,不在节点上保存状态的信息。节点之间的信息交互都是通过节点互联网络实现的。通过将数据分布到多个节点上来实现规模数据的存储,再通过并行查询处理来提高查询性能。每个节点仅查询自己的数据,所得到的结果再经过主节点处理得到最终结果。通过增加节点数目达到系统线性扩展。
图1为GPDB的基本架构,客户端通过网络连接到gpdb,其中Master Host是GP的主节点(客户端的接入点),Segment Host是子节点(连接并提交SQL语句的接口),主节点不存储用户数据,子节点存储数据并负责SQL查询,主节点负责相应客户端请求并将请求的SQL语句进行转换,转换之后调度后台的子节点进行查询,并将查询结果返回客户端。
Master只存储系统元数据,业务数据全部分布在Segments上。其作为整个数据库系统的入口,负责建立与客户端的连接,SQL的解析并形成执行计划,分发任务给Segment实例,并且收集Segment的执行结果。正因为Master不负责计算,所以Master不会成为系统的瓶颈。
Master节点的高可用类似Hadoop的NameNode HA,如图2,Standby Master通过synchronization process,保持与Primary Master的catalog和事务日志一致,当Primary Master出现故障时,Standby Master承担Master的全部工作。
Greenplum中可以存在多个Segment,Segment主要负责业务数据的存储和存取(图3),用户查询SQL的执行时,每个Segment会存放一部分用户数据,但是用户不能直接访问Segment,所有对Segment的访问都必须经过Master。进行数据访问时,所有的Segment先并行处理与自己有关的数据,如果需要关联处理其他Segment上的数据,Segment可以通过Interconnect进行数据的传输。Segment节点越多,数据就会打的越散,处理速度就越快。因此与Share All数据库集群不同,通过增加Segment节点服务器的数量,Greenplum的性能会成线性增长。
每个Segment的数据冗余存放在另一个Segment上,数据实时同步,当Primary Segment失效时,Mirror Segment将自动提供服务。当Primary Segment恢复正常后,可以很方便地使用gprecoverseg -F工具来同步数据。
Interconnect是Greenplum架构中的网络层(图4),也是GPDB系统的主要组件,它默认使用UDP协议,但是Greenplum会对数据包进行校验,因此可靠性等同于TCP,但是性能上会更好。在使用TCP协议的情况下,Segment的实例不能超过1000,但是使用UDP则没有这个限制。
前面介绍了GPDB的基本架构,让读者对GPDB有了初步了解。下面对GPDB的部分特性进行了描述,可以很好地理解为什么选择GPDB作为新的解决方案。
对比开源社区中其他项目在运维上面临的困难,GPDB提供了丰富的管理工具和图形化的web监控页面,帮助管理员更好地管理集群,监控集群本身以及所在服务器的运行状况。
最近的公有云集群迁移过程中,impala总查询段达到100的时候,系统开始变得极不稳定,后来在外援的帮助下发现是系统内核本身的问题,在恶补系统内核参数的同时,发现GPDB的工具也变相填充了我们的短板,比如提供了gpcheck和gpcheckperf等命令,用于检测GPDB运行所需的系统配置是否合理以及对相关硬件做性能测试。如下,执行gpcheck命令后,检测sysctl.conf中参数的设置是否符合要求,如果对参数的含义感兴趣,可以自行搜索学习。
1. [gpadmin@gzns-waimai-do-hadoop280 greenplum]$ gpcheck --host mdw
2. variable not detected in /etc/sysctl.conf: 'net.ipv4.tcp_max_syn_backlog'
3. variable not detected in /etc/sysctl.conf: 'kernel.sem'
4. variable not detected in /etc/sysctl.conf: 'net.ipv4.conf.all.arp_filter'
5. /etc/sysctl.conf value for key 'kernel.shmall' has value '4294967296' and expects '4000000000'
6. variable not detected in /etc/sysctl.conf: 'net.core.netdev_max_backlog'
7. /etc/sysctl.conf value for key 'kernel.sysrq' has value '0' and expects '1'
8. variable not detected in /etc/sysctl.conf: 'kernel.shmmni'
9. variable not detected in /etc/sysctl.conf: 'kernel.msgmni'
10. /etc/sysctl.conf value for key 'net.ipv4.ip_local_port_range' has value '10000 65535' and expects '1025 65535'
11. variable not detected in /etc/sysctl.conf: 'net.ipv4.tcp_tw_recycle'
12. hard nproc not found in /etc/security/limits.conf
13. soft nproc not found in /etc/security/limits.conf
另外在安装过程中,用其提供的gpssh-exkeys命令打通所有机器免密登录后,可以很方便地使用gpassh命令对所有的机器批量操作,如下演示了在master主机上执行gpssh命令后,在集群的五台机器上批量执行pwd命令。
1. [gpadmin@gzns-waimai-do-hadoop280 greenplum]$ gpssh -f hostlist
2. => pwd
3. [sdw3] /home/gpadmin
4. [sdw4] /home/gpadmin
5. [sdw5] /home/gpadmin
6. [ mdw] /home/gpadmin
7. [sdw2] /home/gpadmin
8. [sdw1] /home/gpadmin
9. =>
诸如上述的工具GPDB还提供了很多,比如恢复segment节点的gprecoverseg命令,比如切换主备节点的gpactivatestandby命令等。这类工具让集群的维护变得很简单,当然我们也可以基于强大的工具包开发自己的管理后台,让集群的维护更加傻瓜化。
查询计划包括了一些传统的操作,比如扫表、关联、聚合、排序等。另外,GPDB有一个特定的操作:移动(motion)。移动操作涉及到查询处理期间在Segment之间移动的数据。
下面的SQL是TPCH中Query 1的简化版,用来简单描述查询计划。
1. explain select
2. o_orderdate,
3. o_shippriority
4. from
5. customer,
6. orders
7. where
8. c_mktsegment = 'MACHINERY'
9. and c_custkey = o_custkey
10. and o_orderdate < date '1995-03-20'
11. LIMIT 10;
12.
13. QUERY PLAN
14. ----------------------------------------------------------------------------------------------------------
15. Limit (cost=98132.28..98134.63 rows=10 width=8)
16. -> Gather Motion 10:1 (slice2; segments: 10) (cost=98132.28..98134.63 rows=10 width=8)
17. -> Limit (cost=98132.28..98134.43 rows=1 width=8)
18. -> Hash Join (cost=98132.28..408214.09 rows=144469 width=8)
19. Hash Cond: orders.o_custkey = customer.c_custkey
20. -> Append-only Columnar Scan on orders (cost=0.00..241730.00 rows=711519 width=16)
21. Filter: o_orderdate < '1995-03-20'::date
22. -> Hash (cost=60061.92..60061.92 rows=304563 width=8)
23. -> Broadcast Motion 10:10 (slice1; segments: 10) (cost=0.00..60061.92 rows=304563 width=8)
24. -> Append-only Columnar Scan on customer (cost=0.00..26560.00 rows=30457 width=8)
25. Filter: c_mktsegment = 'MACHINERY'::bpchar
26. Settings: enable_nestloop=off
27. Optimizer status: legacy query optimizer
执行计划从下至上执行,可以看到每个计划节点操作的额外信息。
Segment节点扫描各自所存储的customer表数据,按照过滤条件生成结果数据,并将自己生成的结果数据依次发送到其他Segment;每个Segment上,orders表的数据和收到的rs做join,并把结果数据返回给master。
上面的执行过程可以看出,GPDB将结果数据给每个含有orders表数据的节点都发了一份。为了最大限度地实现并行化处理,GPDB会将查询计划分成多个处理步骤。在查询执行期间,分发到Segment上的各部分会并行地执行一系列处理工作,并且只处理属于自己部分的工作。重要的是,可以在同一个主机上启动多个postgresql数据库进行更多表的关联以及更复杂的查询操作,单台机器的性能得到更加充分的发挥。
如果一个查询表现出很差的性能,可以通过查看执行计划找到可能的问题点。
• 计划中是否有一个操作花费时间超长?
• 规划期的评估是否接近实际情况?
• 选择性强的条件是否较早出现?
• 规划期是否选择了最佳的关联顺序?
• 规划其是否选择性的扫描分区表?
• 规划其是否合适的选择了Hash聚合与Hash关联操作?
前面提到,Greenplum的Master节点只负责客户端交互和其他一些必要的控制,而不承担任何的计算任务。在加载数据的时候,会先进行数据分布的处理工作,为每个表指定一个分发列,接下来所有的节点同时读取数据,根据选定的Hash算法,将当前节点数据留下,其他数据通过interconnect传输到其他节点上去,保证了高性能的数据导入。通过结合外部表和gpfdist服务,GPDB可以做到每小时导入2TB数据,在不改变ETL流程的情况下,可以从impala快速导入计算好的数据为消费提供服务。
使用gpfdist的优势在于其可以确保再度去外部表的文件时,GPDB系统的所有Segment可以完全被利用起来,但是需要确保所有Segment主机可以具有访问gpfdist的网络。
GPDB支持LDAP认证,这一特性的支持,让我们可以把目前Impala的角色权限控制无缝迁移到GPDB;
GPDB基于Postgresql 8.2开发,通过psql命令行工具可以访问GPDB数据库的所有功能,另外支持JDBC、ODBC等访问方式,产品接口层只需要进行少量的适配即可使用GPDB提供服务;
GPDB支持基于资源队列的管理,可以为不同类型工作负载创建资源独立的队列,并且有效地控制用户的查询以避免系统超负荷运行。比如,可以为VIP用户、ETL生产、任性和adhoc等创建不同的资源队列。同时支持优先级的设置,在并发争用资源时,高优先级队列的语句将可以获得比低优先级资源队列语句更多的资源。
最近在对GPDB做调研和测试,过程中用TPCH做性能的测试。通过和网络上其他服务的对比发现在5个节点的情况下已经有了很高的查询速度,但是由于测试环境服务器问题,具体的性能数据还要在接下来的新环境中得出,不过GPDB基于postgresql开发,天生支持丰富的统计函数,支持横向的线性扩展,内部容错机制,有很多功能强大的运维管理命令和代码。相比impala而言,显然在SQL的支持、实时性和稳定性上更胜一筹。
本文只是对Greenplum的初窥,接下来更深入的剖析以及在工作中的实践经验分享也请关注DA的wiki。更多关于Greenplum基本的语法和特性,也可以参考PostgreSQL的官方文档。
参考:Pivotal Greenplum® Database 4.3.9.1 Documentation
SDCC 2017•上海站将于2017年3月17-19日登陆申城,三大技术峰会和24位嘉宾,汇聚国内知名的互联网公司CTO、架构师、技术总监,畅谈运维、数据库和架构的热门话题和技术热点,遇见精益运维发起人&优维科技CEO王津银、MongoDB大中华区首席架构师唐建法等大牛,五人团购报名立减1500元,详情点击注册参会。