【GP常見問題】Greenplum 環境搭建和基本查錯

在 Greenplum 避坑指南系列的上一篇 中,我們介紹瞭解決SQL卡住和運行時間長的原因和解決方案。今天,我們將為大家講一講 Greenplum 用戶在剛開始接觸GP時經常會問的一個問題“Greenplum如何搭建?”以及一些避免掉坑的注意事項。

Greenplum 是基於 postgresql 技術研發的分佈式數據庫,相較於傳統型數據庫,分佈式設計能帶來較大的性能收益。正常安裝需要多臺節點,但是從學習和測試角度,我們也可以在單節點上安裝 GPDB。Greenplum 在不斷的迭代版本,目前已經發布了 v4.3.x, v5.x, v6.x 。關於這幾個版本的區別,主要在於底層的 postgresql 版本不同,並且每個大版本,Greenplum 都有發佈很多新的特性。具體可以參考對應版本的產品說明(release note):

【GP常見問題】Greenplum 環境搭建和基本查錯

關於安裝步驟,已經有不少的研究成果可以直接使用,可以參考 Greenplum中文社區網站上的文章:

CSDN、簡書 等渠道上也有不少相關文章:

  • CentOS7 安裝 Greenplum 詳細步驟( https://blog.csdn.net/qq_15758463/article/details/75305138
  • Centos 7.x 單機版安裝 greenplum 6.0( https://www.jianshu.com/p/5df4b37f4d5c

Docker 環境安裝 Greenplum:

  1. https://www.lagou.com/lgeduarticle/70026.html
  2. https://gitop.cc/posts/install-greenplum-in-docker/
  3. https://www.jianshu.com/p/1d07d3a703b8

需要強調的是,無論哪個版本安裝,都建議和相應的官方文檔進行核對,以確保使用正確的操作系統參數配置:

  1. GPDB v4.3.x ( https://gpdb.docs.pivotal.io/43330/install_guide/prep_os_install_gpdb.html )
  2. GPDB v5.x ( https://gpdb.docs.pivotal.io/5250/install_guide/prep_os_install_gpdb.html )
  3. GPDB v6.x ( https://gpdb.docs.pivotal.io/6-4/install_guide/prep_os.html )

對於在單節點上運行GPDB的用戶,在運行 gpinitsystem 的時候,可以添加一個參數 –max_connections=20,這會相應降低 Greenplum 對系統資源的佔用。當設置 master 實例最大連接數為 20 時,運行 gpinitsystem 時,Greenplum 也會自動降低對應的 segment 實例上的最大連接數。官方建議 segment 實例的最大連接數為 master 實例的3-5倍。

<code>gpconfig -s max_connections
Values on all segments are consistent
GUC: max_connections
Master value: 20
Segment value: 60/<code>

如果需要後期對這個參數進行調整,可以使用以下命令:

<code>gpconfig -c max_connections -v 300 -m 60   (segment 300, master 50,重啟後生效)/<code>

當運行 gpinitsystem 成功後,為了下次訪問更方便,我們還需要設置一下環境變量。一個典型的環境設置如下:

<code>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 (默認連接的數據庫,這個可有可無)/<code>

如果這一個環境裡只有一個集群,可以將以上信息寫入 ~/.bashrc 中。如果一個環境裡有多個集群,每次會手動選擇啟動需要的集群,那麼可以分別創建不同的環境變量文件。確保是文本文件即可。然後每次啟動GPDB前,先載入對應的設置,比如:

<code>source env_5100
source env_600/<code>

系統啟動後,就可以使用了。Greenplum 是一個分佈式的數據庫系統,用戶數據都保存在各個子節點上。如果希望調查數據分佈情況,可以使用 Greenplm 自帶的 gp_dist_random() 函數。示例如下:

<code>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/<code>

另外如果希望單獨連接到一個子實例上進行調查,可以用以下命令:

  • 先查詢所需要連接實例的主機名和端口信息
<code>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)/<code>
  • 獲取連接命令
<code>[gpadmin@mdw ~]$ gpstart -?|grep PG
PGOPTIONS='-c gp_session_role=utility' psql/<code>
  • 最後進行連接:
<code>[gpadmin@mdw ~]$ PGOPTIONS='-c gp_session_role=utility' psql -h sdw3 -p 20134 gpadmin
psql (8.3.23)
Type "help" for help./<code>
  • 我們可以查詢一張表,來看看從master 實例進行查詢和在子實例進行查詢的不同結果

Master:

<code>gpadmin=# select count(1) from test2;
count
-------
9999
(1 row)/<code>

Segment (子實例):

<code>gpadmin=# select count(1) from test2;
count
-------

402
(1 row)/<code>

因為 Greenplum 數據庫也繼承了很大部分的 postgresql 數據庫的特性,日誌系統也是如此。正常使用中,GPDB會分別在master 日誌和各個segment 主實例中寫入對應的日誌。日誌就保存在各個實例的pg_log/目錄下。如果需要集中獲取所有節點的segment 實例路徑,可以通過以下語句完成:

<code>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/<code>

一般出現問題,我們可以先去master 實例的pg log 中查找 PANIC/FATAL/WARNING/ERROR 這些關鍵字。如果發現 master 中提到了某個實例無法連接或者不再響應,那麼我們就需要再到對應的 segment 實例去查看日誌信息。

說到日誌,就不得不提日誌等級。GPDB也使用 log_min_messages 參數來控制 pg_log 中產生日誌的詳細程度。默認這個參數設為WARNING,意思是WARNING 等級以上的錯誤才會記錄下。如果需要更詳細的信息,可以設為“INFO”。如果設到更高的DEBUG1 – DEBUG5 等級,那麼日誌文件中的信息就成倍增加。需要小心使用。

在segment 節點上的日誌,往往會有很多重複出現的信息,我們可以手動過濾一下,最標準的就是gpperfmon相關的日誌。

<code>cat gpdb-xxx.csv |grep -v perfmon |less/<code>

如果要調查 primary 或者 mirror 實例掉線的原因,可以查找關鍵字 filerep 就會特別有效。

<code>cat gpdb-xxx.csv |grep -v perfmon |grep filerep |less/<code>

拿到日誌後,就可以分析錯誤原因了。因為Greenplum 不僅繼承了許多postgresql 的特性,也包括了一部分bug。雖然在各個版本中在不斷修復,但是也不能保證所有postgresql 的bug 都修復了。如果在日誌中發現一些錯誤,但是又無法理解,那麼就可以通過以下途徑嘗試或者自助支持:

  1. Greenplum 中文社區:https://greenplum.cn;Greenplum 英文社區:https://greenplum.org/ 這裡有大量的技術博文可供參考;
  2. Greenplum 中文問答網站:https://ask.greenplum.cn/;這是 Greenplum中文社區為用戶和開發者提供的問答和交流專區,在這裡,Greenplumer可以提出、解答問題,並沉澱優質問答內容,幫助社區成員的學習和進步;英文社區:https://community.pivotal.io/s/topic/0TO0P000000IKdLWAW/pivotal-greenplum。這裡有大量的Greenplum 用戶的英文版提問和解答;
  3. Github 站點 :https://github.com/greenplum-db/gpdb。對於能力較強的用戶,也可以直接訪問Greenplum 的github 站點,這裡有大量的Greenplum已公開的代碼,以及問題討論;
  4. Greenplum技術群組,這裡有很多的技術大牛,掃描文章底部的二維碼,或者搜索gp_assistant,將有專人拉你入群;
  5. Postgresql 社區。無論中文或者英文社區,postgresql 龐大的用戶量和代碼開源,都吸引力大量的用戶。往往我們使用搜索引擎,就能找到很多需要的答案。




鄢柯(Shawn), Greenplum 產品支持專家。一直致力於協助全球 Greenplum 用戶解決各類產品問題。


分享到:


相關文章: