最佳實(shí)踐概要
?
數(shù)據(jù)模型
Greenplum數(shù)據(jù)庫(kù)是一種shared nothing的分析型MPP數(shù)據(jù)庫(kù)。這種模型與高度規(guī)范化的/事務(wù)型的SMP數(shù)據(jù)庫(kù)有顯著區(qū)別。Greenplum數(shù)據(jù)庫(kù)使用非規(guī)范化的模式設(shè)計(jì)會(huì)工作得最好,非規(guī)范化的模式適合于MPP分析型處理,例如帶有大型事實(shí)表和較小維度表的星形模式或者雪花模式。
對(duì)表中用于連接的列使用相同的數(shù)據(jù)類型。
堆存儲(chǔ) vs. 追加優(yōu)化存儲(chǔ)
對(duì)將會(huì)接收迭代批量或者單一UPDATE、DELETE以及INSERT操作的表和分區(qū)使用堆存儲(chǔ)。
對(duì)將會(huì)接收并發(fā)UPDATE、DELETE以及INSERT操作的表和分區(qū)使用堆存儲(chǔ)。
對(duì)于在初始裝載后很少更新并且只會(huì)在大型批處理操作中進(jìn)行后續(xù)插入的表和分區(qū),使用追加優(yōu)化存儲(chǔ)。
絕不在追加優(yōu)化表上執(zhí)行單個(gè)INSERT、UPDATE或者DELETE操作。
絕不在追加優(yōu)化表上執(zhí)行并發(fā)的批量UPDATE或DELETE操作。可以執(zhí)行并發(fā)的批量INSERT操作。
行存 vs. 列存
如果負(fù)載中有要求更新并且頻繁執(zhí)行插入的迭代事務(wù),則對(duì)這種負(fù)載使用行存。
在對(duì)寬表選擇時(shí)使用行存。
為一般目的或混合負(fù)載使用行存。
選擇面很窄(很少的列)和在少量列上計(jì)算數(shù)據(jù)聚集時(shí)使用列存。
如果表中有單個(gè)列定期被更新而不修改行中的其他列,則對(duì)這種表使用列存。
壓縮
在大型追加優(yōu)化和分區(qū)表上使用壓縮以改進(jìn)系統(tǒng)范圍的I/O。
在數(shù)據(jù)位于的級(jí)別上設(shè)置列壓縮設(shè)置。
在較高的壓縮級(jí)別和壓縮解壓數(shù)據(jù)所需的時(shí)間和CPU周期之間做出平衡。
分布
為所有的表顯式定義一個(gè)列分布或者隨機(jī)分布。不要使用默認(rèn)值。
使用將在所有Segment間均勻分布的單列。
不要在查詢的WHERE子句中用到的列上進(jìn)行分布。
不要在日期或時(shí)間戳上分布。
不要在同一列上分布并且分區(qū)表。
在常被連接起來的大型表的相同列上進(jìn)行分布以顯著地改進(jìn)本地連接。
在初始裝載數(shù)據(jù)以及增量裝載數(shù)據(jù)之后驗(yàn)證數(shù)據(jù)被均勻分布。
根本上確保沒有數(shù)據(jù)傾斜!
內(nèi)存管理
把vm.overcommit_memory設(shè)置為2。
不要配置OS使用大頁(yè)。
使用gp_vmem_protect_limit設(shè)置實(shí)例可以為每個(gè)Segment數(shù)據(jù)庫(kù)中執(zhí)行的所有工作分配的最大內(nèi)存。
通過下面的計(jì)算為gp_vmem_protect_limit設(shè)置值:
gp_vmem – Greenplum數(shù)據(jù)庫(kù)可用的總內(nèi)存

其中 SWAP是該主機(jī)的交換空間(以GB為單位),RAM是該主機(jī)的RAM(以GB為單位)
max_acting_primary_segments – 當(dāng)鏡像Segment由于主機(jī)或者Segment失效而被激活時(shí),能在一臺(tái)主機(jī)上運(yùn)行的最主Segment的最大數(shù)量
gp_vmem_protect_limit

轉(zhuǎn)換成MB來設(shè)置配置參數(shù)的值。
在有大量工作文件被生成的場(chǎng)景下用下面的公式計(jì)算將工作文件考慮在內(nèi)的gp_vmem因子:

絕不將gp_vmem_protect_limit設(shè)置得過高或者比系統(tǒng)上的物理RAM大。
使用計(jì)算出的gp_vmem值來計(jì)算操作系統(tǒng)參數(shù)vm.overcommit_ratio的設(shè)置:

使用statement_mem來分配每個(gè)Segment數(shù)據(jù)庫(kù)中用于一個(gè)查詢的內(nèi)存。
使用資源隊(duì)列設(shè)置活動(dòng)查詢的數(shù)目(ACTIVE_STATEMENTS)以及隊(duì)列中查詢所能利用的內(nèi)存量(MEMORY_LIMIT)。
把所有的用戶都與一個(gè)資源隊(duì)列關(guān)聯(lián)。不要使用默認(rèn)的隊(duì)列。
設(shè)置PRIORITY以匹配用于負(fù)載以及實(shí)際情況的隊(duì)列的實(shí)際需要。
確保資源隊(duì)列的內(nèi)存分配不會(huì)超過gp_vmem_protect_limit的設(shè)置。
動(dòng)態(tài)更新資源隊(duì)列設(shè)置以匹配日常操作流。
分區(qū)
只對(duì)大型表分區(qū)。不要分區(qū)小表。
只有能基于查詢條件實(shí)現(xiàn)分區(qū)消除(分區(qū)剪枝)時(shí)才使用分區(qū)。
選擇范圍分區(qū)而舍棄列表分區(qū)。
基于查詢謂詞對(duì)表分區(qū)。
不要在同一列上對(duì)表進(jìn)行分布和分區(qū)。
不要使用默認(rèn)分區(qū)。
不要使用多級(jí)分區(qū),創(chuàng)建較少的分區(qū)讓每個(gè)分區(qū)中有更多數(shù)據(jù)。
通過檢查查詢的EXPLAIN計(jì)劃驗(yàn)證查詢有選擇地掃描分區(qū)表(分區(qū)被消除)。
不要用列存儲(chǔ)創(chuàng)建太多分區(qū),因?yàn)槊總€(gè)Segment上的物理文件總數(shù):物理文件數(shù) = Segment數(shù) x 列數(shù) x 分區(qū)數(shù)
索引
通常在Greenplum數(shù)據(jù)庫(kù)中無需索引。
對(duì)高基數(shù)的表在列式表的單列上創(chuàng)建索引用于鉆透目的要求查詢具有較高的選擇度。
不要索引被頻繁更新的列。
總是在裝載數(shù)據(jù)到表之前刪除索引。在裝載后,重新為該表創(chuàng)建索引。
創(chuàng)建具有選擇性的B-樹索引。
不要在被更新的列上創(chuàng)建位圖索引。
不要為唯一列、基數(shù)非常高或者非常低的數(shù)據(jù)使用位圖索引。
不要為事務(wù)性負(fù)載使用位圖索引。
通常不要索引分區(qū)表。如果需要索引,索引列必須與分區(qū)列不同。
資源隊(duì)列
使用資源隊(duì)列來管理集群上的負(fù)載。
將所有的角色都與一個(gè)用戶定義的資源隊(duì)列關(guān)聯(lián)。
使用ACTIVE_STATEMENTS參數(shù)限制特定隊(duì)列的成員能并發(fā)運(yùn)行的活動(dòng)查詢數(shù)量。
使用MEMORY_LIMIT參數(shù)控制通過隊(duì)列運(yùn)行的查詢所能利用的總內(nèi)存量。
不要把所有隊(duì)列都設(shè)置為MEDIUM,因?yàn)檫@實(shí)際上沒有對(duì)負(fù)載進(jìn)行管理。
動(dòng)態(tài)修改資源隊(duì)列以匹配負(fù)載以及現(xiàn)狀。
監(jiān)控和維護(hù)
實(shí)現(xiàn)Greenplum數(shù)據(jù)庫(kù)管理員指南中的"推薦的監(jiān)控和維護(hù)任務(wù)"。
安裝時(shí)運(yùn)行g(shù)pcheckperf并且在之后定期運(yùn)行該工具,保存其輸出用來比較系統(tǒng)性能隨時(shí)間的變化。
使用手頭的所有工具來理解系統(tǒng)在不同負(fù)載下的表現(xiàn)。
檢查任何異常事件以判斷成因。
通過定期運(yùn)行解釋計(jì)劃監(jiān)控查詢活動(dòng)以確保查詢被以最優(yōu)的方式運(yùn)行。
檢查計(jì)劃以判斷索引是否被使用以及分區(qū)消除是否按照預(yù)期發(fā)生。
了解系統(tǒng)日志文件的位置和內(nèi)容并且定期監(jiān)控它們,而不是只在問題出現(xiàn)時(shí)才去檢查日志。
ANALYZE
不要在整個(gè)數(shù)據(jù)庫(kù)上運(yùn)行ANALYZE。需要時(shí),有選擇地在表級(jí)別上運(yùn)行ANALYZE。
在裝載后總是運(yùn)行ANALYZE。
在顯著改變底層數(shù)據(jù)的INSERT、UPDATE以及DELETE操作之后總是運(yùn)行ANALYZE。
在CREATE INDEX操作之后總是運(yùn)行ANALYZE。
如果在非常大的表上運(yùn)行ANALYZE需要太長(zhǎng)時(shí)間,可以只在用于連接條件、WHERE子句、SORT子句、GROUP BY子句或者HAVING子句的列上運(yùn)行ANALYZE。
清掃
在大型UPDATE和DELETE操作后運(yùn)行VACUUM。
不要運(yùn)行VACUUM FULL。而是運(yùn)行一個(gè)CREATE TABLE...AS操作,然后重命名并且刪掉原始表。
頻繁地在系統(tǒng)目錄上運(yùn)行VACUUM以避免目錄膨脹以及在目錄上運(yùn)行VACUUM FULL的需要。
絕不要?dú)⒌裟夸洷砩系腣ACUUM。
不要運(yùn)行VACUUM ANALYZE。
裝載
使用gpfdist在Greenplum數(shù)據(jù)庫(kù)中裝載或者卸載數(shù)據(jù)。
隨著Segment數(shù)目增加最大化并行性。
在盡可能多的ETL節(jié)點(diǎn)上均勻散布數(shù)據(jù)。
把非常大型的數(shù)據(jù)文件分割成相等的部分,并且把數(shù)據(jù)散布在盡可能多的文件系統(tǒng)上。
每個(gè)文件系統(tǒng)運(yùn)行兩個(gè)gpfdist實(shí)例。
在盡可能多的接口上運(yùn)行g(shù)pfdist。
使用gp_external_max_segs以控制每個(gè)gpfdist服務(wù)的Segment數(shù)量。
總是保持gp_external_max_segs和gpfdist進(jìn)程的數(shù)量為偶因子。
在裝載到現(xiàn)有表之前總是刪除索引并且在裝載之后重建索引。
總是在對(duì)表裝載之后運(yùn)行ANALYZE。
在裝載期間通過設(shè)置gp_autostats_mode為NONE禁用自動(dòng)統(tǒng)計(jì)信息收集。
在裝載錯(cuò)誤之后運(yùn)行VACUUM以重新獲得空間。
gptransfer
為了最快的傳輸率,使用gptransfer傳輸數(shù)據(jù)到尺寸相同或者更大的目標(biāo)數(shù)據(jù)庫(kù)。
避免使用--full或--schema-only選項(xiàng)。而是使用不同的方法將模式復(fù)制到目標(biāo)數(shù)據(jù)庫(kù)中,然后傳輸表數(shù)據(jù)。
在傳輸表之前刪除索引并且在傳輸完成后重建它們。
使用SQL的COPY命令傳輸較小的表到目標(biāo)數(shù)據(jù)庫(kù)。
使用gptransfer批量傳輸較大的表。
在執(zhí)行生產(chǎn)遷移之前,先測(cè)試運(yùn)行g(shù)ptransfer。用--batch-size和--sub-batch-size選項(xiàng)進(jìn)行實(shí)驗(yàn)以得到最大并行性。為迭代運(yùn)行g(shù)ptransfer確定合適的表批次。
只使用完全限定的表名稱。表名中的點(diǎn)號(hào)(.)、空格、引號(hào)(')和雙引號(hào)(")都可能造成問題。
如果使用--validation選項(xiàng)在傳輸后驗(yàn)證數(shù)據(jù),確定也使用-x選項(xiàng)在源表上放置排他鎖。
確保在目標(biāo)數(shù)據(jù)庫(kù)上創(chuàng)建每一個(gè)角色、函數(shù)和資源隊(duì)列。當(dāng)使用gptransfer -t選項(xiàng)時(shí),這些對(duì)象不會(huì)被會(huì)傳輸。
將postgres.conf和pg_hba.conf配置文件從源集群拷貝到目標(biāo)集群。
在目標(biāo)數(shù)據(jù)庫(kù)中用gppkg安裝所需的擴(kuò)展。
安全性
保護(hù)gpadmin用戶ID并且只允許對(duì)它進(jìn)行必需的系統(tǒng)管理員訪問。
在執(zhí)行特定的系統(tǒng)維護(hù)任務(wù)(例如升級(jí)或者擴(kuò)張)時(shí),管理員只應(yīng)作為gpadmin登入到Greenplum。
限制具有SUPERUSER角色屬性的用戶。成為超級(jí)用戶的角色能繞過Greenplum數(shù)據(jù)庫(kù)中的所有訪問特權(quán)檢查以及資源隊(duì)列。只有系統(tǒng)管理員應(yīng)該被給予超級(jí)用戶的權(quán)力。請(qǐng)見Greenplum數(shù)據(jù)庫(kù)管理員指南中的“修改角色屬性”。
數(shù)據(jù)庫(kù)用戶絕不應(yīng)該以gpadmin登錄,且ETL或者生產(chǎn)負(fù)載也絕不應(yīng)該以gpadmin運(yùn)行。
為每個(gè)登入的用戶分派一個(gè)不同的角色。
對(duì)于應(yīng)用或者Web服務(wù),考慮為每個(gè)應(yīng)用或服務(wù)創(chuàng)建一個(gè)不同的角色。
使用組管理訪問特權(quán)。
保護(hù)root口令。
為操作系統(tǒng)口令強(qiáng)制一種強(qiáng)口令策略。
確保重要的操作系統(tǒng)文件受到保護(hù)。
加密
加密和解密數(shù)據(jù)需要性能作為代價(jià),只加密需要加密的數(shù)據(jù)。
在生產(chǎn)系統(tǒng)中實(shí)現(xiàn)任何加密方案之前,先執(zhí)行性能測(cè)試。
生產(chǎn)Greenplum數(shù)據(jù)庫(kù)系統(tǒng)中的服務(wù)器證書應(yīng)該由一個(gè)數(shù)字證書認(rèn)證機(jī)構(gòu)(CA)簽發(fā),這樣客戶端可以認(rèn)證該服務(wù)器。如果客戶端都是機(jī)構(gòu)中的本地客戶端,CA可以是本地的。
只要客戶端到Greenplum數(shù)據(jù)庫(kù)的連接會(huì)通過不安全的鏈接,就應(yīng)該對(duì)其使用SSL加密。
對(duì)稱加密方案(加密和解密使用同樣的密鑰)具有比非對(duì)稱方案更好的性能,因此在密鑰能被安全共享時(shí)應(yīng)當(dāng)使用對(duì)稱加密方案。
使用pgcrypto包中的函數(shù)來加密磁盤上的數(shù)據(jù)。數(shù)據(jù)在數(shù)據(jù)庫(kù)進(jìn)程中被加密和解密,因此有必要用SSL保護(hù)客戶端連接以避免傳輸未加密數(shù)據(jù)。
在ETL數(shù)據(jù)被裝載到數(shù)據(jù)庫(kù)中或者從數(shù)據(jù)庫(kù)中卸載時(shí),是用gpfdists協(xié)議加密它。
高可用性
使用帶有8至24個(gè)磁盤的硬件RAID存儲(chǔ)方案。
使用RAID 1、5或6,這樣磁盤陣列能容忍一個(gè)失效的磁盤。
在磁盤陣列中配置一個(gè)熱后備以允許在檢測(cè)到磁盤失效時(shí)自動(dòng)開始重建。
通過鏡像RAID卷防止重建時(shí)整個(gè)磁盤陣列失效和退化。
定期監(jiān)控磁盤使用并且在需要時(shí)增加額外的空間。
監(jiān)控Segment傾斜以確保數(shù)據(jù)被平均地分布并且在所有Segment上存儲(chǔ)被平均地消耗。
設(shè)置一個(gè)后備Master以便在主Master失效后接管。
規(guī)劃當(dāng)失效發(fā)生時(shí),如何把客戶端切換到新的Master實(shí)例,例如,通過更新DNS中的Master地址。
設(shè)置監(jiān)控機(jī)制以便在主Master失效時(shí)在系統(tǒng)監(jiān)控應(yīng)用中或者通過email發(fā)出通知。
為所有的Segment設(shè)置鏡像。
將主Segment和它們的鏡像放置在不同的主機(jī)上以預(yù)防主機(jī)失效。
設(shè)置監(jiān)控機(jī)制以便在主Segment失效時(shí)在系統(tǒng)監(jiān)控應(yīng)用中或者通過email發(fā)出通知。
迅速地使用gprecoverseg工具失效的Segment,以便恢復(fù)冗余并且讓系統(tǒng)回到最佳平衡。
配置Greenplum數(shù)據(jù)庫(kù)發(fā)送SNMP通知給網(wǎng)絡(luò)監(jiān)控器。
在$MASTER_DATA_DIRECTORY/postgresql.conf配置文件中設(shè)置email通知,這樣Greenplum系統(tǒng)可以在檢測(cè)到嚴(yán)重問題時(shí)用email通知管理員。
考慮雙集群配置以提供額外層次上的冗余以及額外的查詢處理吞吐。
除非數(shù)據(jù)庫(kù)可以很容易地從來源恢復(fù),定期備份Greenplum數(shù)據(jù)庫(kù)。
如果堆表相對(duì)較小并且兩次備份之間只有很少的追加優(yōu)化或列存分區(qū)被修改,使用增量備份。
如果備份被保存到本地集群存儲(chǔ)上,在備份完成后將這些文件移動(dòng)到一個(gè)安全的、不在集群上的位置。
如果備份被保存到NFS掛載點(diǎn),使用例如Dell EMC Isilon之類的橫向擴(kuò)展NFS方案以避免IO瓶頸。
考慮使用Greenplum集成將備份流式傳送給Dell EMC Data Domain或者 Veritas NetBackup企業(yè)級(jí)備份平臺(tái)。
京ICP備09015132號(hào)-996 | 違法和不良信息舉報(bào)電話:4006561155
© Copyright 2000-2026 北京哲想軟件有限公司版權(quán)所有 | 地址:北京市海淀區(qū)西三環(huán)北路50號(hào)豪柏大廈C2座11層1105室
北京哲想軟件集團(tuán)旗下網(wǎng)站:哲想軟件 | 哲想動(dòng)畫