第八章 Greenplum 線上環境部署

本章開始講解如何搭建一個高性能、安全可靠、可擴展、可管理的 Greenplum 集羣。

8.1 服務器硬件選型

數據庫服務器硬件選型應該遵循以下幾個原則:

(1)高性能原則

保證所選購的服務器,不僅能夠滿足現有應用的需要,而且能夠滿足一定時期內業務量增長的需要。對於數據庫而言,數據庫性能依賴於硬件的性能和各種硬件資源的均衡,CPU、內存、磁盤、網絡這幾個關鍵組件在系統中都很關鍵,如果過分突出某一方面硬件資源則會造成大量的資源浪費,而任何一個硬件性能差都會成爲系統的瓶頸,故在硬件選擇的時候,需要根據應用需求在預算中做到平衡。

(2)可靠性原則

不僅要考慮服務器單個節點的可靠性或穩定性,而且要考慮服務器與相關輔助系統之間連接的整體可靠性。

(3)可擴展性原則

需要服務器能夠在相應時間根據業務發展的需要對其自身進行相應的升級,如 CPU 型號升級、內存擴大、硬盤擴大、更換網卡等。

(4)可管理型原則

需要服務器的軟硬件對標準的管理系統提供支持。

8.1.1 CPU

CPU 選擇主要考慮以下兩個方面:

  • Interl 還是 AMD
  • 更快的處理器還是更多的處理器

Intel 作爲單核運算速度方面的領導者,其 CPU 及相關組件相對較貴,而 AMD 在多核處理技術方面表現優異,仍不失爲一個較好的選擇。

如果僅有較少進程運行在單個處理器上,則可以考慮配置更快的 CPU。相反,如果大量併發進程運行在所有處理器上,則考慮配備更多的核。

一臺服務器上 CPU 的數量決定部署到機器上的 gp 數據庫 Segment 實例的數量,比如一個 CPU 配置一個主 Segment。

8.1.2 內存

內存是計算機中重要的部件之一,它是與 CPU 進行溝通的橋樑。計算機中所有程序運行都是在內存中進行的,因此內存的性能對計算機的影響非常大。內存的選擇總體上來說是越大越好。

對於處理像數據庫這樣的海量數據,並且內存遠小於數據存儲的情況,如歌內存已經夠用,通過增加內存來獲取性能的提升則非常細微。對於 gp ,磁盤的吞吐量決定 gp 的性能,磁盤吞吐量越高性能越好

8.1.3 磁盤及硬盤接口

硬盤分爲固態硬盤(SSD)和機械硬盤(HDD),SSD 採用閃存顆粒來存儲,HDD 採用磁性碟片來存儲。

硬盤接口主要有如下幾類:

(1)ATA(Advanced Technology Attachment)

是用傳統的 40-pin 並口數據線連接主板與硬盤的。外部接口速度最大爲 133MB/s。因爲並口線的抗干擾性太差,且排線佔空間,不利計算機散熱,將逐漸被 SATA 所取代。

(2)IDE(Integrated Drive Electonices)

即電子集成驅動器,是把“硬盤控制器”與“盤體”集成在一起的硬盤驅動器。

(3)SCSI 小型計算機系統接口

同 IDE 和 ATA 完全不同的接口,IDE 接口是普通 PC的標準接口,而 SCSI 並不是專門爲硬盤設計的接口,是一種廣泛應用於小型機上的高速數據上傳輸技術。SCSI 接口具有應用範圍廣、任務多、帶寬大、CPU 佔用率低,以及熱插拔等優點,但較高的價格

(4)SATA(Serial Advanced Technology Attachment)

串行高級技術附件,一種基於行業標準的串行硬件驅動器接口,是由Intel、IBM、Dell、APT、Maxtor 和 Seagate 公司共同提出的硬盤接口規範。

(5)SAS(Serial Attached SCSI,串行連接SCSI)

是新一代的 SCSI 技術。同 SATA 都採用串行技術以獲得更高的傳輸速度,並通過縮短連接線改善內部空間等。

(6)SSD(Solid State Disk)

即固態硬盤。

表8-1

在選擇硬盤和硬盤控制器時,確認選擇的硬盤控制器能夠包括硬盤帶寬之和。假如有20個 70Mb/s 內部帶寬的硬盤,爲了獲得硬盤最佳性能,需要最少支持 1.4Gb/s 的硬盤控制器。

要提升服務器 I/O 吞吐量、可用性及存儲容量,常見的方法是做 RAID,即獨立冗餘磁盤陣列(Redundant Array of Independent Disk,RAID)。

幾種常見的 RAID 技術如下:

(1)RAID 0

從嚴格意義上說,RAID 0 不是 RAID,因爲它沒有數據冗餘和校驗。RAID0 技術只是實現了條帶化,具有很高的數據傳輸率,最高的存儲利用率,但是 RAID中硬盤數越多,安全性越低。

(2)RAID 1

通常稱爲 RAID 鏡像。RAID 1 主要是通過數據鏡像實現數據冗餘,在兩對分離的磁盤上產生互爲備份的數據,因此 RAID 1 具有很高的安全性。但是 RAID空間利用率低,磁盤控制器負載大,因此只有當系統需要極高的可靠性時,才選擇 RAID 1

(3)RAID 1+0

RAID 0+1 至少需要 4 塊硬盤纔可以實現,不過它綜合 RAID 0 和 RAID 1 的特點,獨立磁盤配置成 RAID 0,兩套完整的 RAID 0 互相鏡像。它的讀寫性能出色,安全性也較高。但是構建 RAID 0+1 陣列的成本投入大,數據空間利用率只有 50%,因此還不能稱爲經濟高效的方案

(4)RAID 5

RAID 5 是目前應用最廣泛的 RAID 技術。各塊獨立硬盤進行條帶化分隔,相同的條帶區進行奇偶校驗(異或運算),校驗數據平均分佈在每塊硬盤上。RAID 5 具有數據安全、讀寫速度快、空間利用率高等優點,應用非常廣泛。但是不足之處是,如果1塊硬盤出現故障,整個系統的性能將大大降低。

8.1.4 網絡

gp 數據庫互聯的性能與 Segment 上網卡的網絡負載有關,所以 gp 服務器一般由一組多個網卡的硬件組成。爲了達到最好性能,gp 建議爲 Segment 機器上的每一個機器上的每一個主 Segment 配置一個千兆網卡,或者配置每臺機器都有萬兆網卡。

如果 gp 數據庫網絡集羣中有多個網絡交換機,那麼交換機之間均衡地分配子網較爲理想,比如每個機器上的網卡1和2用其中一個交換機,網卡3和4使用另一個交換機。

8.2 服務器系統參數調整

對於不同的應用場景,每一種硬件都有不同的參數配置,通過參數調整,可以極大地提高讀寫性能。對於 OLTP 數據庫而言,關注的是磁盤的隨機讀寫,提高單次讀寫的性能;而對於 OLAP 數據庫而言,最關注的是磁盤的順序讀寫,重點在於提高每次磁盤讀寫的吞吐量。

GP 目前支持的操作系統有以下幾種:

  • SUSE Linux SLES 10.2 or higher
  • CentOS 5.0 or higher
  • RedHat Enterprise Linux 5.0 or higher
  • Oracle Unbreakable Linux 5.5
  • Solaris x86 v10 update 7

一般情況下,需要在操作系統中修改以下三種類型的參數:

(1)共享內存

gp 只有在操作系統中內存大小配置適當的時候才能正常工作。大部分操作系統的共享內存設置太小,不適合 gp 的場景,因爲這樣可以避免進程因爲內存佔用過高被操作系統停止。

(2)網絡

gp 的數據分佈在各個節點上,因此在計算過程中經常需要將數據移動到其他節點上進行計算,這是,合理的網絡配置就顯得格外的重要。

(3)系統對用戶的限制

操作系統在默認情況下會對用戶進行一下資源的限制,以避免某個用戶佔用太多資源導致其他用戶資源不可用。對於數據庫來說,只會有一個操作系統用戶,這些限制都必須取消掉,例如 gp 會同時打開很多文件句柄,而操作系統默認的文件句柄一般很小。

8.2.1 Solaris 參數修改

8.2.2 Linux 參數修改

在 Linux,對應共享內存,網絡、用戶限制的參數修改如下。

  • /etc/sysctl.conf,修改共享內存及網絡 ipv4 的配置:
kernel.sem = 250 64000 100 512
kernel.shmmax = 5000000000
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 250 64000 100 512
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_max_syn_backlog=4096
net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.default.arp_filter = 1
nete.core.net.netdev_max_backlog=10000
vm.overcommit_memory=2
  • 修改文件數,進程數的限制
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072

8.2.3 系統參數及性能驗證

gp 中提供了 gpcheck 腳本對系統參數進行校驗,確保配置合理,同時還提高了 gpcheckperf 對機器進行性能測試,包括網絡性能測試、磁盤 I/O 吞吐測試、內存帶寬測試等。

(1)使用 gpcheck 腳本對系統參數進行驗證,命令如下:

[root@test /] # gpcheck -h dw-greenplum-l

gpcheck

這個腳本會配置一些需要校驗的參數,在 $GPHOME/etc/gpcheck.cnf 文件中,如如果參數配置與 gpcheck.cnf 中的不一致,則會報出一條 ERROR。例如在上面這個例子中,錯誤顯示在 /etc/project 中沒有誒之相應的參數。

(2)網絡測試

利用 gp 自帶的 gpcheckperf 工具可以很方便地測試各節點間網絡連通情況。

網絡測試的機器名列表如下(host.1 文件中)

host.1

運行 gpcheckperf 進行測試:

[gpadmin@dw-greenplum-3 /export/home/gpadmin]# gpcheckperf -d /storagepool/upload -r N -f host.1 
/opt/greenplum/greenplum-db-4.1.1.1/bin/gpcheckperf -d /storagepool/upload -r N -f host.1

gpcheckperf

(3)文件系統性能驗證

利用 gp 自帶的 gpcheckperf 工具可以很方便地測試文件系統的讀寫性能,示例代碼如下:

[gpadmin@greenplum-3 /export/home/gpadmin]# gpcheckperf -d /storagepool/gptempp1 -d /storagepool/gptempp2 -d /storagepool/gptempp3 -d /storagepool/gptempp4 -d /storagepool/gptempm1 -d /storagepool/gptempm2 -d /storagepool/gptempm3 -d /storagepool/gptempm4 -r ds -D -f host.1 /opt/greenplum/greenplum-db-4.1.1.1/bin/gpcheckperf -d /storagepool/gptempp1 -d /storagepool/gptempp2 -d /storagepool/gptempp3 -d /storagepool/gptempp4 -d /storagepool/gptempm1 -d /storagepool/gptempm2 -d /storagepool/gptempm3 -d /storagepool/gptempm4 -r ds -D -f host.1

8.3 計算節點分配技巧

如果配置了 mirror 節點,其會分佈在所有 Segment 節點上,在默認情況下同一服務器上主節點對應的所有備節點會分配在一臺服務器上(這種方式稱爲 Grouped Mirror),這樣一旦某一臺計算節點死機,所有備節點會在同一臺服務器上,致使性能降低 50%,且不利於數據恢復。在初始化數據庫時,可以指定 -S 參數,將同一服務器上主節點對應的備節點打散至集羣不同服務器上(這種方式稱爲 Spread Mirror)

8.4 數據庫參數介紹

數據庫優化主要從兩個方面着手:

  • 提升 CPU、內存、磁盤、網絡等集羣服務器的硬件配置
  • 優化提交到數據庫的語句

簡單介紹一下影響數據庫性能的參數及其他常用的配置參數:

(1)shared_buffers

數據距離 CPU 越近效率就越高,而離 CPU 由近到遠的主要設備有寄存器、CPU cache、RAM、Disk Drives 等。CPU 的寄存器和 cache 是沒辦法直接優化的。爲了避免磁盤訪問,只能儘可能將更多有用信息存放在 RAM 中。gp 數據庫的 RAM 主要用於存放如下信息:

  • 執行程序
  • 程序數據和堆棧
  • postgreSQL shared buffer cache
  • kernel disk buffer cache
  • kernel

因此最大化地保持數據庫信息在內存中而不影響其他區域纔是最佳的調優方式。

pgsql 並非直接在磁盤上進行數據修改,而是將數據讀入 shared buffercache,進而 pgsql 後臺進程修改 cache 中的數據塊,最終再寫回磁盤。後臺進程如果在 cache 中找到相關數據,則直接進行操作,如果沒找到,則需要從 kernel disk buffer cache 或者磁盤中讀入。pgsql 默認的 shared buffer 較小,將此 cache 調大則可降低昂貴的磁盤訪問。但前面提到,修改此參數時一定要避免 swap 發生,因爲內存不僅僅用於 shared buffer cache。剛開始可以設置一個較小的值,比如總內存的15%,然後逐漸增加,過程中監控性能提升和swap 的情況。

(2)effective_cache_size

設置優化器假設磁盤高速緩存的大小用於查詢語句的執行計劃判斷,主要用於判斷使用索引的成本,此參數越大越有機會選擇索引掃描,越小越傾向於選擇順序掃描,此參數只會影響執行計劃的選擇。

(3)work_mem

當 pgsql 對大表進行排序時,數據庫會按照此參數指定大小進行分片排序,將中間結果存放在臨時文件中,這些中間結果的臨時文件最終會再次合併排序,所以增加此參數可以減少臨時文件個數進而提升排序效率。如果設置過大,會導致 swap 的發生,所以設置此參數是仍然需要謹慎。同樣剛開始仍可設置爲總內存的5%。

(4)temp_buffers

temp_buffers 即臨時緩衝區,用於數據庫訪問臨時表數據,gp 默認值爲 1M。可以在單獨的 session 中對該參數進行設置,在訪問比較大的臨時表時,對性能提升有很大幫助。

(5)client_encoding

設置客戶端字符集,默認和數據庫 encoding 相同

(6)client_min_messages

控制發送至客戶端的信息級別,每個級別包括更低級別的消息,越是低的消息級別發送至客戶端的信息越少。此參數主要用於錯誤調試。

(7)cpu_index_tuple_cost

設置執行計劃評估每一個索引行掃描的 CPU 成本。同類參數還包括 cpu_operator_cost、cpu_tuple_cost、cursor_tuple_fraction。

(8)debug_assertions

打開各種斷言檢查,這是調試助手。如果遇到了奇怪的問題或數據庫崩潰,那麼可以將這個參數打開,便於分析錯誤原因。

(9)debug_print_parse

當需要查看查詢語句是分析樹時,可以設置開啓此參數,默認off

(10)debug_print_plan

當需要查看查詢語句的執行計劃時,可以設置開啓此參數,默認爲 off。同類參數包括 debug_print_prelim_plan、debug_print_rewritten、debug_print_slice_table。

(11)default_tablespace

指定創建對象時的默認表空間

(12)dynamic_library_path

在創建函數或者加載命令時,如果未指定目錄,將會從這個路徑搜索需要的文件。

(13)enable_bitmapscan

表示是否允許位圖索引掃描,類似的參數還有 enable_groupagg、enable_hashagg、enable_hashjoin、enable_indexscan、enable_mergejoin、enable_nestloop、enable_seqscan、enable_sort、enable_tidscan。這些參數主要用於控制執行計劃。

(14)gp_autostats_mode

指定觸發自動蒐集統計信息的條件。當此值爲 on_no_stats 時,create table as select 會自動蒐集統計信息,如果 insert 和 copy 操作的表沒有統計信息,也會自動觸發統計信息蒐集。當此值爲 on_change 時,如果變化量超過 gp_autostats_on_threshold 參數設置的值,會自動觸發統計信息蒐集。此參數還可設爲 none 值,即不自動觸發統計信息蒐集。

(15)gp_enable_gpperfmon

要使用 Greenplum Performance Monitor 工具,必須開啓此參數。

(16)gp_enable_max_segs

設置外部表數據掃描可用 Segment 數目

(17)gp_fts_probe_interval

設置 ftsprobe 進程對 Segment failure 檢查的間隔時間

(18)gp_fts_probe_threadcount

設置 ftsprobe 線程數,此參數建議大於等於每臺服務器 Segments 的數目

(19)gp_fts_probe_timeout

設置 ftsprobe 進程用於標識 Segment down 的連接 Segment 的超時時間。

(20)gp_hashjoin_tuples_per_bucket

此參數越小,hash tables 越大,可提升 join 性能,相關參數還有 gp_interconnect_hash_multiplier、gp_interconnect_hash_multiplier、gp_interconnect_depth。

(21)gp_interconnect_setup_timeout

此參數在負載較大的集羣中,應該設置較大的值。

(22)gp_interconnect_type

可選值爲 TCP、UDP,用於設置連接協議。TCP 最大隻允許 1000 個節點實例。

(23)gp_log_format

設置服務器日誌文件格式。可選值爲 csv 和 text。

(24)gp_max_database

設置服務器允許的最大數據庫數,相關參數還有gp_max_filespaces、gp_max_packet_size、gp_maxa_tablespaces

(25)gp_resqueue_memory_policy

此參數允許 none 和 auto 這兩個值,當設置 none 時,gp 4.1 版本以前的策略一致;設置 auto 時,查詢內存使用受 statement_mem 和資源隊列的內存限制,而 work_mem、max_work_mem 和 maintenance_work_mem 這三個參數將失效。

(26)gp_resqueue_priority_cpucores_per_segment

指定每個 Segment 可用的 CPU 單元

(27)gp_segment_connect_timeout

設置網絡連接超時時間

(28)gp_set_proc_affinity

設置進程是否綁定到 CPU

(29)gp_set_read_only

設置數據庫是否允許寫

(30)gp_vmem_idle_resource_timeout

設置數據庫會話超時時間,超過此參數值會話將釋放系統資源。此參數越小,集羣併發度支持越高

(31)gp_vmem_protect_limit

設置服務器中 postgres 進程可用的總內存,建議設置爲 (X * physical_memory ) / primary_segments,其中 X 可設置爲 1.0 和 1.5 之間的數字,當 X=1.5 時容易引發 swap,但是會減少因內存不足而失敗的查詢數。

(32)log_min_duration_statement

當查詢語句執行時間超過此值時,將會記錄日誌,相關參數參考 log_開頭的所有參數。

(33)maintenance_work_mem

設置用於維護的操作可用的內存數,比如 vacuum、create index 等操作將受到這個參數的影響。

(34)max_appendonly_tables

最大可併發處理的 appendonly 表的數目

(35)max_connections

最大連接數,Segment 建議設置 Master 的5-10倍。

(36)max_statement_mem

設置單個查詢語句的最大內存限制,相關參數是 max_work_mem

(37)random_page_cost

設置隨機掃描的執行計劃評估成本,此值越大越傾向於選擇順序掃描,越小越傾向於選擇索引掃描

(38)search_path

設置未指定 schema 時,按照這個順序選擇對象的 schema

(39)statement_timeout

設置語句終止執行的超時時間,0表示永不終止

8.5 數據庫集羣基準測試

在集羣搭建完成正式應用上線之前,對集羣整體性能做一個基準測試是很有必要的,比如驗證數據庫參數設置是否恰當、集羣穩定性如何等。

TPC-H(商業智能計算測試),主要用於 ad-hoc、決策支持等系統的基準測試。

(1)TPC_H 下載即安裝

http://www.tpc.org/tpch/default.asp 下載 tpch-queries.tgz 包,解壓後準備 Makefile 文件(可以將文件夾中的 makefile.suite 作爲模板),Makefile 文件的第 109 行左右有項要適當的修改,如 CC=gcc、DATABASE=TDAT、MACHINE=LINUX、WORKLOAD=TPCH,修改完成之後,運行 make 命令進行編譯即可

(2)測試數據生成

(以下略)

(3)測試表創建

(4)測試數據導入

(5)測試腳本準備

(6)運行基準測試腳本

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章