Greenplum 数据库最佳实践.docx

上传人:b****1 文档编号:10326075 上传时间:2023-05-25 格式:DOCX 页数:55 大小:302.66KB
下载 相关 举报
Greenplum 数据库最佳实践.docx_第1页
第1页 / 共55页
Greenplum 数据库最佳实践.docx_第2页
第2页 / 共55页
Greenplum 数据库最佳实践.docx_第3页
第3页 / 共55页
Greenplum 数据库最佳实践.docx_第4页
第4页 / 共55页
Greenplum 数据库最佳实践.docx_第5页
第5页 / 共55页
Greenplum 数据库最佳实践.docx_第6页
第6页 / 共55页
Greenplum 数据库最佳实践.docx_第7页
第7页 / 共55页
Greenplum 数据库最佳实践.docx_第8页
第8页 / 共55页
Greenplum 数据库最佳实践.docx_第9页
第9页 / 共55页
Greenplum 数据库最佳实践.docx_第10页
第10页 / 共55页
Greenplum 数据库最佳实践.docx_第11页
第11页 / 共55页
Greenplum 数据库最佳实践.docx_第12页
第12页 / 共55页
Greenplum 数据库最佳实践.docx_第13页
第13页 / 共55页
Greenplum 数据库最佳实践.docx_第14页
第14页 / 共55页
Greenplum 数据库最佳实践.docx_第15页
第15页 / 共55页
Greenplum 数据库最佳实践.docx_第16页
第16页 / 共55页
Greenplum 数据库最佳实践.docx_第17页
第17页 / 共55页
Greenplum 数据库最佳实践.docx_第18页
第18页 / 共55页
Greenplum 数据库最佳实践.docx_第19页
第19页 / 共55页
Greenplum 数据库最佳实践.docx_第20页
第20页 / 共55页
亲,该文档总共55页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Greenplum 数据库最佳实践.docx

《Greenplum 数据库最佳实践.docx》由会员分享,可在线阅读,更多相关《Greenplum 数据库最佳实践.docx(55页珍藏版)》请在冰点文库上搜索。

Greenplum 数据库最佳实践.docx

Greenplum数据库最佳实践

❖ 介绍

本文介绍PivotalGreenplumDatabase数据库(以下简称:

Greenplum数据库,或GPDB)得最佳实践。

最佳实践就是指能持续产生比其她方法更好结果得方法或者技术,它来自于实战经验,并被证实了遵循这些方法可以获得可靠得预期结果.本最佳实践旨在通过利用所有可能得知识与技术为正确使用GPDB提供有效参考。

本文不就是在教您如何使用Greenplum数据库得功能,而就是帮助您在设计、实现与使用Greenplum数据库时了解需要遵循哪些最佳实践.关于如何使用与实现具体得Greenplum数据库特性,请参考  上得Greenplum数据库帮助文档以及  上得Sandbox与实践指南。

本文目得不就是要涵盖整个产品或者产品特性,而就是概述GPDB实践中最重要得因素。

本文不涉及依赖于GPDB具体特性得边缘用例,后者需要精通数据库特性与您得环境,包括SQL访问、查询执行、并发、负载与其她因素.

通过掌握这些最佳实践知识,会增加GPDB集群在维护、支持、性能与可扩展性等方面得成功率。

第一章 最佳实践概述

本部分概述了Greenplum数据库最佳实践所涉及得概念与要点。

数据模型

GPDB就是一个基于大规模并行处理(MPP)与无共享架构得分析型数据库。

这种数据库得数据模式与高度规范化得事务性SMP数据库显著不同。

通过使用非规范化数据库模式,例如具有大事实表与小维度表得星型或者雪花模式,GPDB在处理MPP分析型业务时表现优异。

跨表关联(JOIN)时字段使用相同得数据类型。

详见数据库模式设计(后续章节)

堆存储与追加优化存储(Append—Optimized,下称AO)

若表与分区表需要进行迭代式得批处理或者频繁执行单个UPDATE、DELETE或INSERT操作,使用堆存储。

若表与分区表需要并发执行UPDATE、DELETE或INSERT操作,使用堆存储。

若表与分区表在数据初始加载后更新不频繁,且仅以批处理方式插入数据,则使用AO存储。

不要对AO表执行单个INSERT、UPDATE或DELETE操作.

不要对AO表执行并发批量UPDATE或DELETE操作,但可以并发执行批量INSERT操作。

详见堆存储与AO存储(后续章节)

行存储与列存储

若数据需要经常更新或者插入,则使用行存储。

若需要同时访问一个表得很多字段,则使用行存储.

对于通用或者混合型业务,建议使用行存储。

若查询访问得字段数目较少,或者仅在少量字段上进行聚合操作,则使用列存储.

若仅常常修改表得某一字段而不修改其她字段,则使用列存储。

详见行存储与列存储(后续章节)

压缩

对于大AO表与分区表使用压缩,以提高系统I/O。

在字段级别配置压缩.

考虑压缩比与压缩性能之间得平衡.

详见压缩(后续章节)

分布

为所有表定义分布策略:

要么定义分布键,要么使用随机分布.不要使用缺省分布方式.

优先选择可均匀分布数据得单个字段做分布键。

不要选择经常用于 WHERE子句得字段做分布键。

不要使用日期或时间字段做分布键。

分布键与分区键不要使用同一字段。

对经常执行JOIN操作得大表,优先考虑使用关联字段做分布键,尽量做到本地关联,以提高性能。

数据初始加载后或者每次增量加载后,检查数据分布就是否均匀。

尽可能避免数据倾斜。

详见分布(后续章节)

内存管理

设置 vm、overmit_memory 为2

不要为操作系统得页设置过大得值

使用 gp_vmem_protect_limit 设置单个节点数据库(SegmentDatabase)可以为所有查询分配得最大内存量。

不要设置过高得 gp_vmem_protect_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_protect_limit。

动态更新资源队列配置以适应日常工作需要。

详见内存与负载管理(后续章节)

分区

只为大表设置分区,不要为小表设置分区.

仅在根据查询条件可以实现分区裁剪时使用分区表.

建议优先使用范围(Range) 分区,否则使用列表(List) 分区。

根据查询特点合理设置分区。

不要使用相同得字段即做分区键又做分布键。

不要使用默认分区。

避免使用多级分区;尽量创建少量得分区,每个分区得数据更多些。

通过查询计划得 EXPLAIN结果来验证查询对分区表执行得就是选择性扫描(分区裁剪).

对于列存储得表,不要创建过多得分区,否则会造成物理文件过多:

 Physicalfiles= Segments*Columns* Partitions.

详见分区(后续章节)

索引

一般来说GPDB中索引不就是必需得.

对于高基数得列存储表,如果需要遍历且查询选择性较高,则创建单列索引。

频繁更新得列不要建立索引。

在加载大量数据之前删除索引,加载结束后再重新创建索引。

优先使用B树索引。

不要为需要频繁更新得字段创建位图索引。

不要为唯一性字段,基数非常高或者非常低得字段创建位图索引.

不要为事务性负载创建位图索引。

一般来说不要索引分区表.如果需要建立索引,则选择与分区键不同得字段。

详见索引(后续章节)

资源队列

使用资源队列管理集群得负载.

为所有角色定义适当得资源队列。

使用ACTIVE_STATEMENTS 参数限制队列成员可以并发运行得查询总数。

使用MEMORY_LIMIT参数限制队列中查询可以使用得内存总量。

不要设置所有队列为MEDIUM,这样起不到管理负载得作用.

根据负载与时间段动态调整资源队列。

详见配置资源队列(后续章节)

监控与维护

根据《Greenplum数据库管理员指南》实现该书推荐得监控与管理任务。

安装Greenplum数据库前建议运行 gpcheckperf,安装后定期运行。

保存输出结果,随着时间推移对系统性能进行比较。

使用所有您可用得工具,以了解系统不同负载下得表现。

检查任何不寻常得事件并确定原因。

通过定期运行解释计划监控系统查询活动,以确保查询处于最佳运行状态。

检查查询计划,以确定就是否按预期使用了索引与进行了分区裁剪。

了解系统日志文件得位置与内容,定期监控日志文件,而不就是在出现问题时才查瞧。

详见系统监控与维护以及监控GPDB日志文件。

(后续章节)

ANALYZE

不要对整个数据库运行ANALYZE,只对需要得表运行该命令。

建议数据加载后即刻运行ANALYZE。

如果INSERT、UPDATE与DELETE等操作修改大量数据,建议运行ANALYZE。

执行CREATEINDEX操作后建议运行 ANALYZE。

如果对大表ANALYZE耗时很久,则只对JOIN字段、WHERE、SORT、GROUP BY或 HAVING 字句得字段运行ANALYZE。

详见使用ANALYZE更新统计信息。

(后续章节)

Vaccum

批量 UPDATE与 DELETE操作后建议执行 VACUUM。

不建议使用 VACUUMFULL。

建议使用CTAS(CREATETABLE、、、AS)操作,然后重命名表名,并删除原来得表。

对系统表定期运行VACUUM,以避免系统表臃肿与在系统表上执行VACUUMFULL操作。

禁止杀死系统表得VACUUM任务。

不建议使用 VACUUMANALYZE.

详见消除系统表臃肿。

(后续章节)

加载

使用gpfdist 进行数据得加载与导出.

随着段数据库个数得增加,并行性增加。

尽量将数据均匀地分布到多个ETL 节点上。

将非常大得数据文件切分成相同大小得块,并放在尽量多得文件系统上.

一个文件系统运行两个 gpfdist实例。

在尽可能多得网络接口上运行gpfdsit。

使用 gp_external_max_segs 控制访问每个 gpfdist 服务器得段数据库得个数。

建议gp_external_max_segs得值与gpfdist进程个数为偶数。

数据加载前删除索引;加载完后重建索引.

数据加载完成后运行 ANALYZE操作。

数据加载过程中,设置 gp_autostats_mode 为NONE,取消统计信息得自动收集。

若数据加载失败,使用VACUUM 回收空间.

详见加载数据.(后续章节)

gptransfer

为了更好得性能,建议使用 gptransfer 迁移数据到相同大小或者更大得集群。

避免使用 --full 或者 --schema-only 选项。

建议使用其她方法拷贝数据库模式到目标数据库,然后迁移数据。

迁移数据前删除索引,迁移完成后重建索引。

使用SQLCOPY命令迁移小表到目标数据库.

使用gptransfer批量迁移大表。

在正式迁移生产环境前测试运行 gptransfer。

试验 -—batch—size 与 -—sub-batch-size 选项以获得最大平行度。

如果需要,迭代运行多次 gptransfer 来确定每次要迁移得表得批次.

仅使用完全限定得表名。

表名字中若含有点、空格、单引号与双引号,可能会导致问题。

如果使用 --validation 选项在迁移后验证数据,则需要同时使用 —x 选项,以在源表上加排它锁.

确保在目标数据库上创建了相应得角色、函数与资源队列。

gptransfer—t 不会迁移这些对象。

从源数据库拷贝 postgres、conf 与 pg_hba、conf 到目标数据库集群。

使用 gppkg 在目标数据库上安装需要得扩展。

详见使用gptransfer迁移数据(后续章节)

安全

妥善保护 gpadmin 账号,只有在必要得时候才能允许系统管理员访问它。

仅当执行系统维护任务(例如升级或扩容),管理员才能以 gpadmin 登录Greenplum集群。

限制具有SUPERUSER角色属性得用户数。

GPDB中,身为超级用户得角色会跳过所有访问权限检查与资源队列限制.仅有系统管理员具有数据库超级用户权限。

参考《Greenplum数据库管理员指南》中得“修改角色属性”.

严禁数据库用户以 gpadmin 身份登录,严禁以 gpadmin 身份执行ETL或者生产任务.

为有登录需求得每个用户都分配一个不同得角色。

考虑为每个应用或者网络服务分配一个不同得角色.

使用用户组管理访问权限。

保护好ROOT得密码。

对于操作系统密码,强制使用强密码策略.

确保保护好操作系统得重要文件。

详见安全.(后续章节)

加密

加密与解密数据会影响性能,仅加密需要加密得数据。

在生产系统中实现任何加密解决方案之前都要做性能测试。

GPDB生产系统使用得服务器证书应由证书签名颁发机构(CA)签名,这样客户端可以验证服务器。

如果所有客户端都就是本地得,则可以使用本地CA。

如果客户端与GPDB得连接会经过不安全得链路,则使用SSL加密。

加密与解密使用相同密钥得对称加密方式比非对称加密具有更好得性能,如果密钥可以安全共享,则建议使用对称加密方式。

使用 pgcrypto包中得函数加密磁盘上得数据。

数据得加密与解密都由数据库进程完成,为了避免传输明文数据,需要使用SSL加密客户端与数据库间得连接.

数据加载与导出时,使用gpfdists协议保护ETL数据安全.

详见加密数据与数据库连接。

(后续章节)

高可用

使用8到24个磁盘得硬件RAID存储解决方案。

使用RAID1、5或6,以使磁盘阵列可以容忍磁盘故障。

为磁盘阵列配备热备磁盘,以便在检测到磁盘故障时自动开始重建。

在重建时通过RAID卷镜像防止整个磁盘阵列故障与性能下降。

定期监控磁盘利用率,并在需要时增加额外得空间。

定期监控段数据库倾斜,以确保在所有段数据库上数据均匀分布,存储空间均匀消耗.

配置备用主服务器,当主服务器发生故障时由备用主服务器接管.

规划好当主服务器发生故障时如何切换客户端连接到新得主服务器实例,例如通过更新DNS中主服务器得地址.

建立监控系统,当主服务器发生故障时,可以通过系统监控应用或电子邮件发送通知。

分配主段数据库与其镜像到不同得主机上,以防止主机故障。

建立监控系统,当主段数据库发生故障时,可以通过系统监控应用或电子邮件发送通知。

使用 gprecoverseg 工具及时恢复故障段,并使系统返回最佳平衡状态。

在主服务器上配置并运行 gpsnmpd 以发送SNMP 通知给网络监控器.

在 $Master_DATA_DIRECTORY/postgresql、conf 配置文件中设置邮件通知,以便检测到关键问题时,Greenplum系统可以通过电子邮件通知管理员。

考虑双集群配置,提供额外得冗余与查询处理能力。

除非Greenplum数据库得数据很容易从数据源恢复,否则定期备份.

如果堆表相对较小,或者两次备份之间仅有少量AO或列存储分区有变化,则使用增量备份.

如果备份保存在集群得本地存储系统上,则备份结束后,将文件移到其她得安全存储系统上。

如果备份保存到NFS中,则建议使用像EMCIsilon这样得可扩展NFS方案以防止I/O瓶颈。

Greenplum集成了对EMC得DataDomain与Symantec得NetBackup得支持,可以流式备份到Data Domain或NetBackup 企业备份平台上。

详见高可用性(后续章节)

第二章系统配置

本节描述了Greenplum数据库集群关于主机配置得需求与最佳实践。

❖ 首选操作系统

红帽企业级Linux(RHEL)就是首选操作系统。

应使用最新支持得主版本,目前就是 RHEL6。

❖ 文件系统

Greenplum数据库得数据目录推荐使用XFS 文件系统。

使用以下选项挂载XFS:

rw,noatime,inode64,allocsize=16m

❖ 端口配置

ip_local_port_range 得设置不要与Greenplum数据库得端口范围有冲突,例如:

net、ipv4、ip_local_port_range =300065535PORT_BASE=2000MIRROR_PORT_BASE=2100REPLICATION_PORT_BASE=2200MIRROR_REPLICATION_PORT_BASE=2300

❖ I/O配置

包含数据目录得设备得预读大小应设为16384、

/sbin/blockdev—-getra/dev/sdb16384ﻫ

包含数据目录得设备得I/O调度算法设置为deadline。

#cat /sys/block/sdb/queue/schedulernoop anticipatory[deadline]cfq

通过/etc/security/limits、conf 增大操作系统文件数与进程数。

*soft no* hardno*soft nproc131072*hardnproc131072

启用core文件转储,并保存到已知位置。

确保limits、conf中允许得core转储文件。

kernel、core_pattern=/var/core/core、%h、%t#grep core/etc/security/limits、conf*softcoreunlimited

❖ 操作系统内存配置

Linuxsysctl得 vm、overmit_memory 与 vm、overmit_ratio 变量会影响操作系统对内存分配得管理。

这些变量应该设置如下:

∙vm、overmit_memory控制操作系统使用什么方法确定分配给进程得内存总数。

对于Greenplum数据库,唯一建议值就是2、

∙vm、overmit_ratio 控制分配给应用程序进程得内存百分比.建议使用缺省值50、

不要启用操作系统得大内存页。

详见内存与负载管理。

(后续章节)

❖ 共享内存设置

Greenplum数据库中同一数据库实例得不同 postgres 进程间通讯使用共享内存。

使用 sysctl 配置如下共享内存参数,且不建议修改:

kernel、shmmax =500000000kernel、shmmni=4096kernel、shmall=4000000000

❖ 验证操作系统

使用 gpcheck 验证操作系统配置.参考 《Greenplum数据库工具指南》中得 gpcheck.

❖ 设置一个主机上段数据库个数

确定每个段主机上段数据库得个数对整体性能有着巨大影响。

这些段数据库之间共享主机得CPU核、内存、网卡等,且与主机上得所有进程共享这些资源。

过高地估计每个服务器上运行得段数据库个数,通常就是达不到最优性能得常见原因之一.

以下因素确定了一个主机上可以运行多少个段数据库:

∙CPU核得个数

∙物理内存容量

∙网卡个数及速度

∙存储空间

∙主段数据库与镜像共存

∙主机就是否运行ETL进程

∙主机上运行得非Greenplum进程

❖ 段服务器内存配置

服务器配置参数gp_vmem_protect_limit控制了每个段数据库为所有运行得查询分配得内存总量.如果查询需要得内存超过此值,则会失败。

使用下面公式确定合适得值:

(swap +(RAM *vm、overmit_ratio))* 、9/number_of_Segments_per_server

例如,具有下面配置得段服务器:

∙8GB交换空间

∙128GB 内存

∙vm、overmit_ratio=50

∙8 个段数据库

则设置gp_vmem_protect_limit为 8GB:

(8+(128*、5))*、9 / 8=8GB

参见 内存与负载管理。

(后续章节)

❖ SQL语句内存配置

服务器配置参数 gp_statement_mem 控制段数据库上单个查询可以使用得内存总量。

如果语句需要更多内存,则会溢出数据到磁盘。

用下面公式确定合适得值:

(gp_vmem_protect_limit* 、9)/max_expected_concurrent_queries

例如,如果并发度为40,gp_vmeme_protect_limit为8GB,则 gp_statement_mem 为:

(8192MB*、9)/40=184MB

每个查询最多可以使用184MB内存,之后将溢出到磁盘。

若想安全得增大 gp_statement_mem,要么增大 gp_vmem_protect_limit,要么降低并发.要增大gp_vmem_protect_limit,必须增加物理内存与/或交换空间,或者降低单个主机上运行得段数据库个数。

请注意,为集群添加更多得段数据库实例并不能解决内存不足得问题,除非引入更多新主机来降低了单个主机上运行得段数据库得个数。

了解什么就是溢出文件.了解gp_work 参数,其控制了单个查询最多可以创建多少个溢出文件。

了解gp_work。

有关使用资源队列管理内存得更多信息,请参考 内存与负载管理。

(后续章节)

❖ 溢出文件配置

如果为SQL查询分配得内存不足,Greenplum数据库会创建溢出文件(也叫工作文件).在默认情况下,一个SQL查询最多可以创建 100000个溢出文件,这足以满足大多数查询.

参数gp_work 决定了一个查询最多可以创建多少个溢出文件。

0意味着没有限制。

限制溢出文件数据可以防止失控查询破坏整个系统.

如果分配内存不足或者出现数据倾斜,则一个SQL查询可能产生大量溢出文件。

如果超过溢出文件上限,Greenplum数据库报告如下错误:

ERROR:

numberof workfilesper querylimit exceeded

在尝试增大gp_work前,先尝试通过修改SQL、数据分布策略或者内存配置以降低溢出文件个数。

gp_toolkit模式包括一些视图,通过这些视图可以瞧到所有使用溢出文件得查询得信息.这些信息有助于故障排除与调优查询:

∙gp_work视图得每一行表示一个正在使用溢出文件得操作符得信息.关于操作符,参考 如何理解查询计划解释。

(后续章节)

∙gp_work视图得每一行表示一个正在使用溢出文件得SQL查询得信息。

∙gp_work视图得每一行对应一个段数据库,包含了该段上使用得溢出文件占用得磁盘空间总量.

关于这些视图得字段涵义,请参考《Greenplum数据库参考指南》.

参数 gp_work指定溢出文件得压缩算法:

none或者zlib。

第三章数据库模式设计

GPDB就是一个基于大规模并行处理(MPP)与无共享架构得分析型数据库。

这种数据库得数据模式与高度规范化得事务性SMP数据库显著不同。

使用非规范化数据库模式,例如具有大事实表与小维度表得星型或者雪花模式,处理MPP分析型业务时,Greenplum数据库表现优异。

❖ 数据类型

类型一致性

关联列使用相同得数据类型。

如果不同表中得关联列数据类型不同,GPDB必须动态得进行类型转换以进行比较。

考虑到这一点,您可能需要增大数据类型得大小,以便关联操作更高效。

类型最小化

建议选择最高效得类型存储数据,这可以提高数据库得有效容量及查询执行性能。

建议使用TEXT或者VARCHAR而不就是CHAR。

不同得字符类型间没有明显得性能差别,但就是TEXT或者 VARCHAR 可以降低空间使用量.

建议使用满足需求得最小数值类型。

如果INT或SAMLLINT够用,那么选择BIGINT 会浪费空间。

❖ 存储模型

在Greenplum 数据库中,创建表时可以选择不同得存储类型。

需要清楚什么时候该使用堆存储、什么时候使用追加优化(AO)存储、什么时候使用行存储、什么时候使用列存储。

对于大型事实表这尤为重要。

相比而言,对小得维度表就不那么重要了.

选择合适存储模型得常规最佳实践为:

1.对于大型事实分区表,评估并优化不同分区得存储选项。

一种存储模型可能满足不了整个分区表得不同分区得应用场景,例如某些分区使用行存储而其她分区使用列存储。

2.使用列存储时,段数据库内每一列对应一个文件.对于有大量列得表,经常访问得数据使用列存储,不常访问得数据使用行存储。

3.在分区级别或者在数据存储级别上设置存储类型。

4.如果集群需要更多空间,或者期望提高I/O性能,考虑使用压缩。

堆存储与AO存储

堆存储就是默认存储模型,也就是 PostgreSQL存储所有数据库表得模型。

如果表与分区经常执行UPDATE、DELETE操作或者单个INSERT 操作,则使用堆存储模型.如果需要对表与分区执行并发UPDATE、DELETE、INSERT操作,也使用堆存储模

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2