《Greenplum大数据库最佳实践》由会员分享,可在线阅读,更多相关《Greenplum大数据库最佳实践(47页珍藏版)》请在金锄头文库上搜索。
1、word介绍本文介绍Pivotal Greenplum Database数据库以下简称:Greenplum数据库,或GPDB的最优实践。最优实践是指能持续产生比其他方法更好结果的方法或者技术,它来自于实战经验,并被证实了遵循这些方法可以获得可靠的预期结果。本最优实践旨在通过利用所有可能的知识和技术为正确使用GPDB提供有效参考。本文不是在教您如何使用Greenplum数据库的功能,而是帮助您在设计、实现和使用Greenplum数据库时了解需要遵循哪些最优实践。关于如何使用和实现具体的Greenplum数据库特性,请参考gpdb.docs.pivotal.io上的Greenplum数据库帮助文档
2、以与greenplum.org上的Sandbox和实践指南。本文目的不是要涵盖整个产品或者产品特性,而是概述GPDB实践中最重要的因素。本文不涉与依赖于GPDB具体特性的边缘用例,后者需要精通数据库特性和您的环境,包括SQL访问、查询执行、并发、负载和其他因素。通过掌握这些最优实践知识,会增加GPDB集群在维护、支持、性能和可扩展性等方面的成功率。第一章最优实践概述本局部概述了Greenplum数据库最优实践所涉与的概念与要点。数据模型GPDB 是一个基于大规模并行处理(MPP)和无共享架构的分析型数据库。这种数据库的数据模式与高度规X化的事务性SMP数据库显著不同。通过使用非规X化数据库模式
3、,例如具有大事实表和小维度表的星型或者雪花模式,GPDB在处理MPP分析型业务时表现优异。跨表关联(JOIN)时字段使用一样的数据类型。详见数据库模式设计后续章节)堆存储和追加优化存储(Append-Optimized,下称AO)假如表和分区表需要进展迭代式的批处理或者频繁执行单个UPDATE、DELETE或INSERT操作,使用堆存储。假如表和分区表需要并发执行UPDATE、DELETE或INSERT操作,使用堆存储。假如表和分区表在数据初始加载后更新不频繁,且仅以批处理方式插入数据,如此使用AO存储。不要对AO表执行单个INSERT、UPDATE或DELETE操作。不要对AO表执行并发批量
4、UPDATE或DELETE操作,但可以并发执行批量INSERT操作。详见堆存储和AO存储后续章节)行存储和列存储假如数据需要经常更新或者插入,如此使用行存储。假如需要同时访问一个表的很多字段,如此使用行存储。对于通用或者混合型业务,建议使用行存储。假如查询访问的字段数目较少,或者仅在少量字段上进展聚合操作,如此使用列存储。假如仅常常修改表的某一字段而不修改其他字段,如此使用列存储。详见行存储和列存储后续章节)压缩对于大AO表和分区表使用压缩,以提高系统I/O。在字段级别配置压缩。考虑压缩比和压缩性能之间的平衡。详见压缩后续章节)分布为所有表定义分布策略:要么定义分布键,要么使用随机分布。不要使
5、用缺省分布方式。优先选择可均匀分布数据的单个字段做分布键。不要选择经常用于 WHERE 子句的字段做分布键。不要使用日期或时间字段做分布键。分布键和分区键不要使用同一字段。对经常执行JOIN操作的大表,优先考虑使用关联字段做分布键,尽量做到本地关联,以提高性能。数据初始加载后或者每次增量加载后,检查数据分布是否均匀。尽可能防止数据倾斜。详见分布后续章节)内存管理设置vm.overmit_memory为 2不要为操作系统的页设置过大的值使用gp_vmem_protect_limit设置单个节点数据库Segment Database可以为所有查询分配的最大内存量。不要设置过高的gp_vmem_pr
6、otect_limit值,也不要大于系统的物理内存。gp_vmem_protect_limit的建议值计算公式为: (SWAP + (RAM * vm.overmit_ratio) * 0.9 / number_Segments_per_server使用statement_mem控制节点数据库为单个查询分配的内存量。使用资源队列设置队列允许的当前最大查询数ACTIVE_STATEMENTS和允许使用的内存大小MEMORY_LIMIT。不要使用默认的资源队列,为所有用户都分配资源队列。根据负载和时间段,设置和队列实际需求相匹配的优先级PRIORITY。保证资源队列的内存配额不超过gp_vmem_
7、protect_limit。动态更新资源队列配置以适应日常工作需要。详见内存和负载管理后续章节)分区只为大表设置分区,不要为小表设置分区。仅在根据查询条件可以实现分区裁剪时使用分区表。建议优先使用X围 (Range) 分区,否如此使用列表 (List) 分区。根据查询特点合理设置分区。不要使用一样的字段即做分区键又做分布键。不要使用默认分区。防止使用多级分区;尽量创建少量的分区,每个分区的数据更多些。通过查询计划的 EXPLAIN 结果来验证查询对分区表执行的是选择性扫描 分区裁剪。对于列存储的表,不要创建过多的分区,否如此会造成物理文件过多: Physical files = Segment
8、s * Columns * Partitions。详见分区后续章节)索引一般来说GPDB中索引不是必需的。对于高基数的列存储表,如果需要遍历且查询选择性较高,如此创建单列索引。频繁更新的列不要建立索引。在加载大量数据之前删除索引,加载完毕后再重新创建索引。优先使用 B 树索引。不要为需要频繁更新的字段创建位图索引。不要为唯一性字段,基数非常高或者非常低的字段创建位图索引。不要为事务性负载创建位图索引。一般来说不要索引分区表。如果需要建立索引,如此选择与分区键不同的字段。详见索引后续章节)资源队列使用资源队列管理集群的负载。为所有角色定义适当的资源队列。使用 ACTIVE_STATEMENTS
9、参数限制队列成员可以并发运行的查询总数。使用 MEMORY_LIMIT 参数限制队列中查询可以使用的内存总量。不要设置所有队列为 MEDIUM,这样起不到管理负载的作用。根据负载和时间段动态调整资源队列。详见配置资源队列后续章节)监控和维护根据Greenplum数据库管理员指南实现该书推荐的监控和管理任务。安装Greenplum数据库前建议运行gpcheckperf,安装后定期运行。保存输出结果,随着时间推移对系统性能进展比拟。使用所有您可用的工具,以了解系统不同负载下的表现。检查任何不寻常的事件并确定原因。通过定期运行解释计划监控系统查询活动,以确保查询处于最优运行状态。检查查询计划,以确定
10、是否按预期使用了索引和进展了分区裁剪。了解系统日志文件的位置和内容,定期监控日志文件,而不是在出现问题时才查看。详见系统监控和维护以与监控GPDB日志文件。后续章节)ANALYZE不要对整个数据库运行 ANALYZE,只对需要的表运行该命令。建议数据加载后即刻运行 ANALYZE。如果INSERT、UPDATE 和 DELETE 等操作修改大量数据,建议运行 ANALYZE。执行 CREATE INDEX 操作后建议运行 ANALYZE。如果对大表ANALYZE耗时很久,如此只对JOIN字段、WHERE、SORT、GROUP BY 或 HAVING 字句的字段运行 ANALYZE。详见使用AN
11、ALYZE更新统计信息。后续章节)Vaccum批量 UPDATE 和 DELETE 操作后建议执行 VACUUM。不建议使用 VACUUM FULL。建议使用 CTASCREATE TABLE.AS 操作,然后重命名表名,并删除原来的表。对系统表定期运行 VACUUM,以防止系统表臃肿和在系统表上执行 VACUUM FULL 操作。禁止杀死系统表的 VACUUM 任务。不建议使用 VACUUM ANALYZE。详见消除系统表臃肿。后续章节)加载使用 gpfdist 进展数据的加载和导出。随着段数据库个数的增加,并行性增加。尽量将数据均匀地分布到多个 ETL 节点上。将非常大的数据文件切分成一样
12、大小的块,并放在尽量多的文件系统上。一个文件系统运行两个 gpfdist 实例。在尽可能多的网络接口上运行 gpfdsit。使用gp_external_max_segs控制访问每个 gpfdist 服务器的段数据库的个数。建议gp_external_max_segs的值 和 gpfdist 进程个数为偶数。数据加载前删除索引;加载完后重建索引。数据加载完成后运行 ANALYZE 操作。数据加载过程中,设置gp_autostats_mode为 NONE,取消统计信息的自动收集。假如数据加载失败,使用 VACUUM 回收空间。详见加载数据。后续章节)gptransfer为了更好的性能,建议使用gp
13、transfer迁移数据到一样大小或者更大的集群。防止使用-full或者-schema-only选项。建议使用其他方法拷贝数据库模式到目标数据库,然后迁移数据。迁移数据前删除索引,迁移完成后重建索引。使用 SQL COPY 命令迁移小表到目标数据库。使用 gptransfer 批量迁移大表。在正式迁移生产环境前测试运行gptransfer。试验-batch-size和-sub-batch-size选项以获得最大平行度。如果需要,迭代运行屡次gptransfer来确定每次要迁移的表的批次。仅使用完全限定的表名。表名字中假如含有点、空格、单引号和双引号,可能会导致问题。如果使用-validatio
14、n选项在迁移后验证数据,如此需要同时使用-x选项,以在源表上加排它锁。确保在目标数据库上创建了相应的角色、函数和资源队列。gptransfer -t不会迁移这些对象。从源数据库拷贝postgres.conf和pg_hba.conf到目标数据库集群。使用gppkg在目标数据库上安装需要的扩展。详见使用 gptransfer 迁移数据后续章节)安全妥善保护gpadmin账号,只有在必要的时候才能允许系统管理员访问它。仅当执行系统维护任务例如升级或扩容,管理员才能以gpadmin登录Greenplum集群。限制具有 SUPERUSER 角色属性的用户数。GPDB中,身为超级用户的角色会跳过所有访问权
15、限检查和资源队列限制。仅有系统管理员具有数据库超级用户权限。参考Greenplum数据库管理员指南中的“修改角色属性。严禁数据库用户以gpadmin身份登录,严禁以gpadmin身份执行ETL或者生产任务。为有登录需求的每个用户都分配一个不同的角色。考虑为每个应用或者网络服务分配一个不同的角色。使用用户组管理访问权限。保护好 ROOT 的密码。对于操作系统密码,强制使用强密码策略。确保保护好操作系统的重要文件。详见安全。后续章节)加密加密和解密数据会影响性能,仅加密需要加密的数据。在生产系统中实现任何加密解决方案之前都要做性能测试。GPDB生产系统使用的服务器证书应由证书签名颁发机构CA签名,这样客户端可以验证服务器。如果所有客户端都是本地的,如此可以使用本地CA。如果客户端与GPDB的连接会经过不安全的链路,如此使用 SSL 加密。加密和解密使用一样密钥的对称加密方式比非对称加密