在Greenplum避坑指南系列的上一篇《「個人SQL跑了很長時間沒有結果怎麼辦?》中,咱們介紹瞭解決SQL卡住和運行時間長的緣由和解決方案。今天,咱們將爲你們講一講Greenplum用戶在剛開始接觸GP時常常會問的一個問題「Greenplum如何搭建?」以及一些避免掉坑的注意事項。html
Greenplum 是基於postgresql 技術研發的分佈式數據庫,相較於傳統型數據庫,分佈式設計能帶來較大的性能收益。正常安裝須要多臺節點,可是從學習和測試角度,咱們也能夠在單節點上安裝GPDB。Greenplum在不斷的迭代版本,目前已經發布了v4.3.x, v5.x, v6.x 。關於這幾個版本的區別,主要在於底層的postgresql 版本不一樣,而且每一個大版本,Greenplum都有發佈不少新的特性。具體能夠參考對應版本的產品說明(release note):git
GPDB版本 | Postgresql 版本 | 產品說明 |
---|---|---|
4.3.x | 8.2.15 | 傳送門 |
5.x | 8.3.23 | 傳送門 |
6.x | 9.4.20 | 傳送門 |
關於安裝步驟,已經有很多的研究成果能夠直接使用,能夠參考Greenplum中文社區網站上的文章:github
https://greenplum.cn/2019/11/30/how-to-set-up-greenplum-6-1-cluster/sql
https://greenplum.cn/2019/04/29/greenplum-compile-install/docker
CSDN,簡書等渠道上也有很多相關文章:數據庫
https://blog.csdn.net/qq_15758463/article/details/75305138segmentfault
https://www.jianshu.com/p/5df4b37f4d5ccentos
https://www.lagou.com/lgeduarticle/70026.html
https://gitop.cc/posts/install-greenplum-in-docker/
https://www.jianshu.com/p/1d07d3a703b8bash
須要強調的是,不管哪一個版本安裝,都建議和相應的官方文檔進行覈對,以確保使用正確的操做系統參數配置: session
對於在單節點上運行GPDB的用戶,在運行gpinitsystem 的時候,能夠添加一個參數 --max_connections=20,這會相應下降Greenplum對系統資源的佔用。當設置master 實例最大鏈接數爲20時,運行gpinitsystem時,Greenplum也會自動下降對應的segment 實例上的最大鏈接數。官方建議segment 實例的最大鏈接數爲master 實例的3-5倍。
gpconfig -s max_connections
Values on all segments are consistent
GUC: max_connections
Master value: 20
Segment value: 60
若是須要後期對這個參數進行調整,可使用如下命令:
gpconfig -c max_connections -v 300 -m 60 (segment 300, master 50,重啓後生效)
當運行gpinitsystem 成功後,爲了下次訪問更方便,咱們還須要設置一下環境變量。一個典型的環境設置以下:
source /usr/local/greenplum-db-x.x.x.x/greenplum_path.sh (GPDB庫文件的所在地) export MASTER_DATA_DIRECTORY=/xxx/xxx/gpseg-xxx (主目錄) export PGPORT=xxxx (master 實例的訪問端口,不設就默認5432) export PGDATABASE=xxxx (默認鏈接的數據庫,這個無關緊要)
若是這一個環境裏只有一個集羣,能夠將以上信息寫入~/.bashrc 中。若是一個環境裏有多個集羣,每次會手動選擇啓動須要的集羣,那麼能夠分別建立不一樣的環境變量文件。確保是文本文件便可。而後每次啓動GPDB前,先載入對應的設置,好比:
source env_5100
source env_600
系統啓動後,就可使用了。Greenplum 是一個分佈式的數據庫系統,用戶數據都保存在各個子節點上。若是但願調查數據分佈狀況,可使用Greenplm 自帶的gp_dist_random() 函數。示例以下:
gpadmin=# select count(1), gp_segment_id from gp_dist_random('pg_class') group by 2; count | gp_segment_id -------+--------------- 440 | 9 440 | 14 440 | 19 440 | 3 gpadmin=# select oid,relname,gp_segment_id from gp_dist_random('pg_class') where relname='gp_pgdatabase_invalid'; oid | relname | gp_segment_id -------+-----------------------+--------------- 11968 | gp_pgdatabase_invalid | 11 11968 | gp_pgdatabase_invalid | 12 11968 | gp_pgdatabase_invalid | 13 11968 | gp_pgdatabase_invalid | 14
另外若是但願單獨鏈接到一個子實例上進行調查,能夠用如下命令:
gpadmin=# select * from gp_segment_configuration where content=1 and role='p'; dbid | content | role | preferred_role | mode | status | port | hostname | address | replication_port ------+---------+------+----------------+------+--------+-------+----------+---------+------------------ 3 | 1 | p | p | s | u | 20134 | sdw3 | sdw3 | 24322 (1 row)
[gpadmin@mdw ~]$ gpstart -?|grep PG PGOPTIONS='-c gp_session_role=utility' psql
[gpadmin@mdw ~]$ PGOPTIONS='-c gp_session_role=utility' psql -h sdw3 -p 20134 gpadmin psql (8.3.23) Type "help" for help.
Master:
gpadmin=# select count(1) from test2; count ------- 9999 (1 row)
Segment (子實例):
gpadmin=# select count(1) from test2; count ------- 402 (1 row)
由於Greenplum 數據庫也繼承了很大部分的postgresql數據庫的特性,日誌系統也是如此。正常使用中,GPDB會分別在master 日誌和各個segment 主實例中寫入對應的日誌。日誌就保存在各個實例的pg_log/目錄下。若是須要集中獲取全部節點的segment 實例路徑,能夠經過如下語句完成:
gpadmin=# select e.fsedbid "segment id", e.fselocation "segment location",c.hostname "segment server" from pg_filespace_entry e, gp_segment_configuration c where e.fsedbid=c.dbid; segment id | segment location | segment server ------------+-------------------------------+---------------- 1 | /data/master_519/gpseg_519_-1 | mdw 2 | /data1/primary/gpseg_519_0 | sdw3 8 | /data1/primary/gpseg_519_6 | sdw4
通常出現問題,咱們能夠先去master 實例的pg log 中查找PANIC /FATAL/ WARNING/ ERROR這些關鍵字。若是發現master 中提到了某個實例沒法鏈接或者再也不響應,那麼咱們就須要再到對應的segment 實例去查看日誌信息。
說到日誌,就不得不提日誌等級。GPDB也使用log_min_messages 參數來控制pg log中產生日誌的詳細程度。默認這個參數設爲WARNING,意思是WARNING 等級以上的錯誤纔會記錄下。若是須要更詳細的信息,能夠設爲「INFO」。若是設到更高的DEBUG1 - DEBUG5 等級,那麼日誌文件中的信息就成倍增長。須要當心使用。
在segment 節點上的日誌,每每會有不少重複出現的信息,咱們能夠手動過濾一下,最標準的就是gpperfmon相關的日誌。
cat gpdb-xxx.csv |grep -v perfmon |less
若是要調查primary 或者mirror 實例掉線的緣由,能夠查找關鍵字 filerep 就會特別有效。
cat gpdb-xxx.csv |grep -v perfmon |grep filerep |less
拿到日誌後,就能夠分析錯誤緣由了。由於Greenplum 不只繼承了許多postgresql 的特性,也包括了一部分bug。雖然在各個版本中在不斷修復,可是也不能保證全部postgresql 的bug 都修復了。若是在日誌中發現一些錯誤,可是又沒法理解,那麼就能夠經過如下途徑嘗試或者自助支持:
關於做者
鄢柯(Shawn), Greenplum 產品支持專家。一直致力於協助全球Greenplum用戶解決各種產品問題。