當前位置:編程學習大全網 - 源碼下載 - 源代碼修復版本

源代碼修復版本

最近對線下倉庫盤點系統進行了擴充和重構,可以說是壹波三折,插曲很多,有些改進對我們來說也是真空區。通過壓力測量的對比和模擬,最終得到了預期的結果。在這方面,特別值得壹提的是郭雲凱是敬業的,他完成了很多壓力測量的前期工作、優化和應用。?

整體來看,整件事的背景是服務器硬件超保,借超保服務器更換的契機,對集群架構進行優化改造。?

1.集群架構轉型的目標

目前存在的壹些潛在問題之前也有總結,這也是本次部署架構改進的目標:

1)之前,GP段數量設計過度,因為資源限制,過度考慮功能和性能,缺乏集群的穩定性和資源均衡性。每個物理機節點都部署了10主節點和10鏡像節點。壹旦1個服務器節點不可用,整個集群幾乎無法支持服務。

2)GP集群的存儲資源和性能之間的平衡不夠。GP存儲基於RAID-5。如果有壹個壞盤,盤重建的成本比較高,重建的時候如果又有壹個壞盤,那就很被動了。而且對線下倉庫的數據質量要求高,存儲容量比較小。所以綜合考慮存儲容量和性能,我們選擇RAID-10。

3)集群異常場景的恢復有待提高,集群異常情況下的故障恢復場景(如服務器非正常停機、數據節點不可用、服務器過保後節點滾動更換)測試不充分,導致在壹些遷移和改造中信心相對不足,存在壹些知識盲區。

4)集群版本太低,功能和性能還有提升空間。畢竟這個集群是4年前的版本,底層的PG節點版本也比較老,在功能和性能上有壹定的期待,至少能與時俱進。

5)操作系統版本升級。之前的操作系統是基於CentOS6的,至少需要適配CentOS 7。

6) TPCH集群壓力試驗驗收。集群部署後,需要進行整體的TPCH壓力測試驗收。如果有明顯的問題,它需要不斷調整配置和架構,以達到預期的性能目標。

此外,還有壹些應用層面的考慮。總之希望解決大部分痛點,無論是系統層面還是應用層面。

2.集群規劃設計的選擇與思考

明確目標,即把任務拆分出來進行規劃設計,在規劃設計中主要有以下幾個問題:

1)Greenplum版本選擇,目前主要有兩個版本類別,壹個是開源分發和Pivotal正式版。他們的壹個區別是,正式版需要註冊並簽署協議,在此基礎上可以使用GPCC等工具,而開源版可以實現源代碼編譯或rpm安裝,GPCC無法配置。綜合來看,我們選擇了6.16.2的開源版本,其中也問了壹些業內的朋友,特意挑選了幾個涉及到穩定性bug修復的版本。

2)數據集市的技術選擇。在數據集市的技術選型上,壹開始我堅持基於PostgreSQL的模型,而業務方則希望壹些復雜的邏輯能夠得到GP的支持。過了很久,又咨詢了壹些業內的朋友,可以選擇基於GP的方案,於是我們試壹試做了壹個壓力測試,這樣數據倉庫和數據集市就會由兩個不同大小和體積的GP集群來支持。

3)3)GP的產能規劃,因為之前的節點設計有點過分,所以我們減少了數量。每臺服務器有12個段節點,例如,壹臺***12服務器,其中10服務器為段節點,每臺服務器有6個主節點、6個節點和6個鏡像,另外兩臺有主備。

4)部署架構方案的選擇。部署架構相對容易想到,但是在實現中有許多細節需要考慮。首先,考慮到GP的主備節點混合使用可以節省壹些資源,因此數據倉庫和數據集市的部署架構就是這樣設計的。但進入部署階段後,很快發現這種交叉部署的模式並不可行,或者有壹定的復雜性。

此外,在單個GP集群的部署架構級別,有四個方案需要考慮。

?方案1:主備分段混合部署。

?方案二:主、備、段獨立部署,整個集群的節點數量會更少。

?方案三:分段獨立部署,部署主備虛擬機。

?方案4:最小化單節點集群部署(這是數據集市最安全的方案)?

這方面有很大的發揮空間,而且壹般來說這種驗證的成本比較高。實踐給了我壹個教訓。越想走捷徑,越會讓妳少走壹些彎路,有時候不知道怎麽改優化,感覺無路可走,所以我們其實對以上四個方案都做了相關的測試和驗證。

3.集群架構的詳細設計與實踐。

1)設計詳細的部署架構圖。

在總體規劃的基礎上,我設計了以下部署架構圖。每個服務器節點有六個主節點、六個鏡像節點和六個鏡像節點,這些服務器成對映射。

2)核參數的優化

根據官方文檔中的建議和具體配置,我們對內核參數進行了如下配置:

vm.swappiness=10

vm.zone_reclaim_mode = 0

vm.dirty_expire_centisecs = 500

VM . dirty _ write back _ centi secs = 100

vm.dirty_background_ratio = 0 #請參見系統內存

vm.dirty_ratio = 0

VM . dirty _ background _ bytes = 1610612736

vm.dirty_bytes = 4294967296

vm.min_free_kbytes = 3943084

vm.overcommit_memory=2

kernel.sem = 500 2048000 200 4096

4.集群部署步驟

1)第壹步是配置/etc/hosts,需要整理出所有節點的IP和主機名。?

2)配置用戶,這是壹個常規步驟。

groupaddgpadmin

useradd gpadmin -g gpadmin

passwd gpadmin

3)配置sysctl.conf和資源配置。

4)以rpm模式安裝

# yum install-y apr apr-util bzip2 krb5-devel zip

# rpm -ivh開源-greenplum-d b-6.16.2-rhel 7-x86 _ 64 . rpm

5)配置兩個主機文件也是為了方便以後統壹部署。建議先開放gpadmin的sudo權限,這樣壹些復雜的批量操作就可以通過gpssh來處理了。

6)通過gpssh-exkeys打通ssh信任關系,需要吐槽這個ssh信任,端口必須是22,否則處理起來會很麻煩,需要修改/etc/ssh/sshd_config文件。

gpssh-exkeys -f主機列表

7)壹個復雜的步驟是把master的Greenplum-db-6.16.2軟件打包,然後分發給各個段位機。整個過程包括文件打包、批量傳輸和配置。可以借助gpscp和gpssh來傳輸文件,比如gpscp。以下命令將被傳輸到/tmp目錄。

gpscp-f/usr/local/greenplum-db/conf/host list/tmp/greenplum-d b-6.16.2 . tar . gz =:/tmp

或者直接在每臺服務器上安裝rpm -ivh。

8)8)主節點需要單獨配置相關目錄,而段節點的目錄可以提前規劃。例如,我們將主服務器和鏡像服務器放在不同的分區中。?

mkdir-p/data 1/gp data/gp data 1

mkdir-p/data 1/gp data/gp data 2

mkdir-p/data 2/gp data/gp datam 1

mkdir -p /data2/gpdata/gpdatam2

9)整個過程中最重要的是gpinitsystem_config的配置,因為段節點和端口間隔的ID配置和命名都是按照壹定的規則動態生成的,所以要額外註意目錄的配置。

10)部署GP集群的關鍵命令是

gpinitsystem-c gpinitsystem _ config-s?待機主機名

gpinitsystem_config文件的主要內容如下:

主主機名=xxxx

declare-a DATA _ DIRECTORY =(/DATA 1/gp DATA/gp DATA 1/DATA 1/gp DATA/gp DATA 2/DATA 1/gp DATA/gp DATA 3/DATA 1/gp DATA/gp DATA 4/DATA 1/gp DATA/gp DATA 5/DATA 1/gp DATA/gp DATA 6)

TRUSTED_SHELL=ssh

declare-a MIRROR _ DATA _ DIRECTORY =(/DATA 2/gp DATA/gp datam 1/DATA 2/gp DATA/gp datam 2/DATA 2/gp DATA/gp datam 3/DATA 2/gp DATA/gp datam 4/DATA 2/gp DATA/gp datam 5/DATA 2/gp DATA/gp datam 6)

機器列表文件=/usr/local/greenplum-db/conf/seg _ hosts

整個過程大約5分鐘到10分鐘完成。部署過程中,建議查看後端日誌,看是否有異常。異常情況下的體驗不是很好,可能會浪費。

5.解決集群部署問題

集群部署還有很多細節問題,基本的我就不提了,基本都是配置,目錄權限等問題。讓我提幾個其他的例子:

1)資源配置問題。如果/etc/security/limits.conf的資源配置不足,安裝過程中會給出以下警告:

2)網絡問題。集群部署後可以正常運行,但是查詢數據時會拋出錯誤。例如,SQL看起來很簡單,如下所示:select count(*) from customer,但會引發以下錯誤:

這個問題的主要原因與防火墻配置有關。其實不僅要配置輸入的權限,還要配置輸出的權限。?

對於數據節點,您可以打開稍大的權限,例如:

入口配置:

-A輸入-p all -s xxxxx?-j接受

出口配置:

-A輸出-p all -s xxxxx -j接受

3)網絡配置問題。這個問題的詭異之處在於錯誤報告同上,只是排除了防火墻配置之後,選擇了count(*)from customer;;這樣的語句可以執行,但是等待執行的時間比較長。比如表格lineitem比較大,數據量過億。當有65,438+00個物理節點時,查詢響應時間為65,438+00秒,但對於4個物理節點,查詢響應時間為90秒,這讓整體刪除感覺不合理。

為了排查網絡問題,還測試了gpcheckperf等工具,4節點和10節點的基本配置是壹樣的。

gpcheckperf-f/usr/local/greenplum-db/conf/seg _ hosts-r N-d/tmp

$ cat /etc/hosts

127.0.0.1本地主機本地主機本地域本地主機4本地主機4 .本地域4

::1?本地主機本地主機.本地域本地主機6本地主機6 .本地域6

#127.0.0.1?測試-dbs-gp-128-230

xxxxx.128.238測試-dbs-gp-svr-128-238

xxxxx.128.239測試-dbs-gp-svr-128-239

其中127.0.0.1的配置在段主備混合部分有問題,修正後就好了。這個關鍵問題也被郭雲凱發現了。

5.集群故障恢復測試

集群故障測試是這個架構設計中的重點內容,所以這壹塊也是躍躍欲試。

總的來說,我們包括兩種場景,服務器停機修復後的集群恢復和服務器不可用時的恢復模式。

第壹種場景比較簡單,就是讓段節點重新加入集群,在集群級別交換主用和鏡像的角色,而第二種場景時間比較長,主要是數據節點需要重建,成本基本是PG級別的數據恢復。為了全面模擬整個測試和恢復,我們采用了類似的恢復方法,比如重啟服務器進行停機修復,在服務器不可用時清理數據目錄,類似於新配置的機器。

1)服務器停機修復後的集群恢復

select * from gp _ segment _ configuration where status!= ' u

gprecoverseg?-o/recov

gprecoverseg?-r

select * from gp _ segment _ configuration,其中status='u '

2)服務器不可用時的集群恢復

在重構數據節點的過程中,總體來說,網絡帶寬還是被充分利用的。

select * from gp _ segment _ configuration,其中status='u '

select * from gp _ segment _ configuration其中status='u' and role!=首選_角色;

gprecoverseg?-r

select * from gp _ segment _ configuration其中status='u' and role!=首選_角色;

測試後,重新啟動節點並修復數據大約需要3分鐘。

6.解決集群優化問題

1)部署架構優化和叠代

對於優化問題,是本次測試中特別關註和爭議的部分。?

首先,經過初步選擇,多倉系統部署比較順利,采用第壹套方案。

因為數據集市的集群部分的節點相對較少,所以選擇了第二種方案。

在實際測試過程中,由於配置問題,TPCH的結果並沒有達到預期。

所以現階段有壹些疑惑和質疑。壹種是轉回第壹種方案,但是節點數量會少很多,或者第三種是虛擬機的模式部署,最安全的方案是單節點部署。當然,這是最牽強的方案。

這個階段確實很難,但是經過上述配置的修復,集群仿佛豁然開朗,性能不錯,很快完成了100G和1T數據量的TPCH測試。

在隨後的改造中,我們也嘗試了第三種方案,基於虛擬機的模式。通過測試,發現和我們預想的相差甚遠。同壹個數據節點下,主備用的是物理機和虛擬機,性能相差很大,出乎意料。例如,對於同壹個SQL,執行方案3需要2秒,而執行方案2需要80秒。我們比較了這種差異的許多指標。最後,我個人理解,區別還是在網卡部分。

因此,經過比較,選擇了方案二的混合部署模式。

2)分析2)SQL性能優化

此外,整個過程的TPCH也為集群的性能提供了參考。比如方案二的混合部署模式,壹條SQL需要18秒,但相比同類型集群,可能只需要2秒左右,這顯然是有問題的。?

在消除了系統配置和硬件配置的差異之後,經典的解決方案是檢查執行計劃。

性能差的SQL執行計劃:

#解釋分析客戶選擇計數(*);

查詢計劃?

合計(成本=0.00..431.00行=1寬=8)(實際時間=24792.916..24792.916行=1個循環=1)

?-& gt;聚集運動36:1(slice 1;段數:36)(成本=0.00)..431.00行=1寬度=1)(實際時間=3.255..16489.394行=15000000循環=1)

?-& gt;客戶順序掃描(成本=0.00..431.00行=1寬度=1)(實際時間=0.780..1267.878行=4172607循環=1)

規劃時間:4.466毫秒

?(slice0)執行器內存:680K字節。

?(slice1)執行器內存:平均218K字節x 36個工作線程,最大218K字節(seg0)。

使用的內存:2457600kB

優化器:Pivotal優化器(GPORCA)

執行時間:24832.611毫秒

(9行)

時間:24892.500毫秒

更好的SQL執行計劃:

#解釋分析客戶選擇計數(*);

查詢計劃

合計(成本=0.00..842.08行=1寬度=8)(實際時間= 1519.311..1519.311行=1循環=1)

?-& gt;聚集運動36:1(slice 1;段數:36)(成本=0.00)..842.08行=1寬度=8)(實際時間=634.787..1519.214行=36個循環=1)

?-& gt;合計(成本=0.00..842.08行=1寬度=8)(實際時間=1473.296)..1473.296行=1個循環=1)

?-& gt;客戶順序掃描(成本=0.00..834.33行=4166667寬=1)(實際時間=0.758..438.319行=4172607循環=1)

規劃時間:5.033毫秒

?(slice0)執行器內存:176K字節。

?(slice1)執行器內存:平均234K字節x 36個工作線程,最大234K字節(seg0)。

使用的內存:2457600kB

優化器:Pivotal優化器(GPORCA)

執行時間:1543.611毫秒

(10行)

時間:1549.324毫秒

很明顯,實施方案是被誤導的,誤導因素是基於統計信息。這個問題的修復很簡單:

分析客戶;

但原因是測壓時先用了100G測壓,測壓後保留了原來的表結構,直接導入了1T的數據量,導致執行計劃沒有更新。

3)集群配置優化

此外,還做了壹些集群配置優化,比如調整緩存。?

gpconfig -c語句_mem -m 2457600 -v 2457600

gp config-c gp _ vmem _ protect _ limit-m 32000-v 32000

7.集群優化數據

最後,讓我們感受壹下集群的性能:

1)10個物理節點,(6+6)*10+2。

tpch_1t=# iming on

計時開始。

tpch_1t=# select count(*)來自客戶;

?數數?

-

150000000

(1行)

時間:1235.801毫秒

tpch _ 1t = # select count(*)from line item;

?數數

-

5999989709

(1行)

時間:10661.756毫秒

2)6個物理節點,(6+6)*6

#從客戶中選擇count(*);

數數

-

?150000000

(1行)

時間:1346.833毫秒

# select count(*)from lineitem;

數數?

-

?5999989709

(1行)

時間:18145.092毫秒

3)4個物理節點,(6+6)*4

#從客戶中選擇count(*);

數數

-

?150000000

(1行)

時間:1531.621毫秒

# select count(*)from lineitem;

數數?

-

?5999989709

(1行)

時間:2572.501毫秒

4)TPCH有19查詢模型,部分SQL邏輯過於復雜,暫時忽略,也是郭雲凱整理的列表。

1T基準下的基準性能:

  • 上一篇:怎麽在java中實現redis的添加數據
  • 下一篇:《Valorant》這款遊戲***有多少個角色?各個角色的技能是怎樣的?
  • copyright 2024編程學習大全網