1. 程式人生 > >greenplum 集群故障(Sorry,too many clients already )排查:

greenplum 集群故障(Sorry,too many clients already )排查:

設置 actions nts -m max sorry resources activity 鏈接

故障現象:
1:所有業務調度任務執行失敗;
2:手動測試無法連接數據庫;
3:並沒有收到集群的異常告警;

處理步驟:

1:首先登陸 gpcc 查看集群狀態;
 發現所有greenplum 節點及服務都正常,但是屏幕打印報錯信息 :Sorry,too many clients already (alert)

2:在master節點通過gpstate -s和查看/usr/local/gpdata/gpmaster/gpseg-1/pg_log/gpdbxxxxxx.csv日誌,都可以看到以下報錯信息

"ERROR","58M01","failed to acquire resources on one or more segments","FATAL: sorry, too many clients already.

Performance Monitor - failed to connect to gpperfmon database: FATAL:  sorry, too many clients already.

登陸服務器查看集群狀態:

gpstate -b =》 顯示簡要狀態 

gpstate -f =》 顯示備用主機詳細信息  

gpstate -m =》 顯示鏡像實例同步狀態  

gpstate -Q =》 快速檢查主機狀態  

確認集群節點無異常!

調整集群最大連接數

此時基本確定集群連接數過多導致,準備使用殺掉連接解決問題,但是數據庫集群已經無法連接,使用gpconfig 命令修改;

主要修改參數如下:

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

查看現有配置值:
gpconfig -s max_connections

GUC : max_connections
Master value: 250
Segment value: 750

#### 修改配置
gpconfig -c max_connections -v 2000 -m 500
max_prepared_transactions
這個參數只有在啟動數據庫時,才能被設置。它決定能夠同時處於prepared狀態的事務的最大數目(參考PREPARE TRANSACTION命令)。如果它的值被設為0。則將數據庫將關閉prepared事務的特性。它的值通常應該和max_connections的值一樣大。每個事務消耗600字節(b)共享內存。

查看現有配置值:
gpconfig -s max_prepared_transactions
Values on all segments are consistent
GUC          : max_prepared_transactions
Master  value: 250
Segment value: 250
修改配置
gpconfig -c max_prepared_transactions  -v 500

修改參數後,重啟數據庫生效

關閉數據庫 :gpstop -M fast  -a
快速啟動:   gpstart -a 

驗證配置是否生效:

gpconfig -s max_connections
gpconfig -s max_prepared_transactions

數據啟動後,已經可以正常使用!此時涉及的數據庫沒有涉及在線業務,所有直接重啟了。

使用超級用戶登陸,處理步驟參考:

# su - gpadmin
psql -d postgres

查看所有的連接;
postgres=# SELECT * FROM pg_stat_activity;

執行以下命令查看當前的總連接數:

psql -d postgres -c "select count(*) from pg_stat_activity"

查看第2步檢查到的報錯庫的連接數:

psql -d postgres -c "select count(*) from pg_stat_activity where datname = ‘pt_roi‘"

通過以下命令來斷開報錯的庫的連接,釋放資源:

SELECT pg_terminate_backend(pg_stat_activity.procpid) FROM pg_stat_activity WHERE pg_stat_activity.datname = ‘ $(DATABASES)‘ AND procpid <> pg_backend_pid();

問題的原因分析:

1:新業務服務沒有經過測試就上線,產生大量的異常鏈接,導致數據庫鏈接被沾滿;
2:數據庫連接沒有做監控告警,導致連接被占滿後才知道,需要添加連接數監控告警,大於正常數出發告警,提前處理;
3:調整數據庫任務、網絡鏈接超時時間,防止大量網絡連接不能斷開;

greenplum 集群故障(Sorry,too many clients already )排查: