好消息,從Hologres V0.10.25版本開始,Hologres的默認連接數增加一倍啦!這就意味著,同等規格實例將會擁有更多的連接數,業務上也可以增加更多的應用去連接Hologres,無需再為連接數不夠而擔心啦!
下面我們來康康現在新版本的連接數和實例規格的映射關係吧:
實例規格 |
最大總連接數(個) ① |
Superuser預留總連接數 |
32Core |
256(128*2) |
6 |
64Core |
512(128*4) |
6 |
96Core |
768(128*6) |
6 |
128Core |
1024(128*8) |
9 |
160Core |
1280(128*10) |
12 |
192Core |
1536(128*12) |
15 |
256Core |
2048(128*16) |
18 |
400Core |
3200(128*25) |
30 |
512Core |
4096(128*32) |
36 |
Hologres運行時的資源包括用於元數據管理的進程資源、用於查詢服務的計算資源、用於優化數據寫入的導入鏈路資源以及緩存服務。所有服務基於容器技術,通過多個並行的容器計算節點實現高性能並行計算能力。
Hologres基於實例的資源規格提供默認的最大連接數是針對大多數場景,經過調校和優化的默認配置。最大連接數不可修改,系統擴容或者縮容時,最大連接數同時調整為對應規格的默認連接數。
但是默認連接數的增加,並不意味著業務上可以無限制隨便使用,因此,本文除了帶來以上好消息外,還為大家準備了關於連接數使用的最佳實踐,以下內容全是實操乾貨,建議收藏本文並反覆閱讀,以幫助業務更好的使用Hologres。
實踐1:查看實例連接數相關信息
1.查看實例默認連接數
當您創建實例並連接開發工具之後,可以執行如下SQL語句查看當前實例版本的最大連接數
show max_connections;
說明:
1)以上SQL語句的執行結果展示的是單個Frontend節點最大連接數,最大總連接數=單Frontend節點最大連接數*Frontend節點數,上面映射表中最大連接數的括號中為具體每個節點的規格。
2)舊實例版本的查詢結果還是會跟之前一致,若有需求可以提工單或者找對應技術支持升級至最新版本,連接數將會默認增加一倍。
2.查看DB連接數
可以通過如下命令查看當前DB的連接數
SELECT datname ,COUNT(1) AS COUNT FROM pg_stat_activity WHERE backend_type = 'client backend' AND application_name != 'hologres' AND usename != 'holo_admin' GROUP BY datname;
3.查看連接數狀態
通過查詢pg_stat_activity視圖來獲取所有JDBC或PSQL連接的狀態。
select * from pg_stat_activity where backend_type = 'client backend' and state = '<statename>';
其中statename是需要填寫的狀態參數名,包括以下幾種:例如,您可以執行如下命令查詢當前實例的空閒連接。
- idle:空閒連接,表示進程在等待新的客戶端命令。
- active:活躍連接,表示進程正在執行查詢操作。
- idle in transaction:表示進程處於一個事務中,但是當前沒有執行查詢操作。
- idle in transaction (aborted):表示進程處於一個事務中,該事務存在語句錯誤,並且進程當前沒有執行查詢操作。
示例查看空閒連接:
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';
Holoweb等Hologres周邊組件會通過JDBC的方式佔用一定的連接數,如果您的連接數滿足需求,無需關心此類連接數的佔用。當SQL連接數長期接近或達到max_connections時,意味著您需要檢查您的應用是否存在連接數洩漏情況,需要在應用端合理設置連接池大小,或者您也可以釋放空閒連接。
注意:若是您的賬號是superuser,則可以查看到當前實例下的所有連接,但是若您的賬號不是superuser,則只能看到自己賬號的相關連接。
實踐2:管理員預留連接
Hologres會為Superuser預留連接,不同的實例規格預留的連接數不同,具體預留關係可以參考上表。
Superuser預留連接用於在連接數達到最大時對連接進行管理操作(如終止idle連接),普通用戶的連接數最大為max_connections減去預留連接。
在實踐中,不建議普通用戶使用Superuser賬號操作數據庫,否則會導致連接全部佔滿,且無法通過管理渠道釋放連接。(敲黑板,重點!重點!)
實踐3:單個用戶預留連接
Hologres支持為單個用戶設置連接數上限,以防止某個用戶佔用過多連接造成資源浪費。
1.限制單個用戶連接數。
ALTER ROLE "雲賬號ID" CONNECTION LIMIT <number>;
使用示例:
如下示例限制RAM用戶283813xxxx,最多隻有一個1連接。
ALTER ROLE "p4_283813xxxx" CONNECTION LIMIT 1;
2.查看用戶的限制連接數
您可以執行如下語句查看當前已經為實例用戶設置的限制連接數。
SELECT rolname, rolconnlimit FROM pg_roles WHERE rolconnlimit <> -1;
查詢示例結果如下:
rolname | rolconnlimit ---------------+-------------- p4_283813xxxx | 1 (1 row)
實踐4:終止連接
如果您遇到如下情況,則說明系統連接數已經達到上限:
- 連接數達到甚至超出max_connections的取值,您可以在Hologres管控臺的監控告警頁查看連接數。
- 產生FATAL: sorry, too many clients already connection limit exceeded for superusers報錯。
- 產生FATAL: remaining connection slots are reserved for non-replication superuser connections報錯。
當您有上述情況產生,可以通過Superuser賬號連接實例,執行如下語句查看空閒連接是否過多。
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';
如果查詢結果顯示空閒進程過多,並且確定是無用的空閒連接時,可以找到上述語句結果中的pid字段,並執行如下語句釋放空閒連接。
-- cancel該連接上的query select pg_cancel_backend(<pid>); --結束對應的後臺連接進程 select pg_terminate_backend(<pid>); --批量終止後臺idle連接進程,釋放連接 SELECT pg_terminate_backend(pid) ,query ,datname ,usename ,application_name ,client_addr ,client_port ,backend_start ,state FROM pg_stat_activity WHERE length(query) > 0 AND pid != pg_backend_pid() AND backend_type = 'client backend' AND state = 'idle' AND application_name != 'hologres' AND usename != 'holo_admin';
新功能預告
為了能讓大家更好的管理連接以及可視化方式優雅的殺連接,後期將會在Holoweb開放連接數管理功能,屆時您可以通過Holoweb直接查看當前實例所有的連接數信息,並且可以通過可以通過可視化的方式kill無效連接,方便快捷,簡單易用!
更多有關連接數的新功能將會陸續發佈,請及時關注群或者社區最新消息!
總結
默認連接數的增加,可以方便業務去連接更多的應用,但並不意味著連接數是無限制使用的,我們需要合理的規劃和正確的使用,才能帶來事半功倍的效果!下面再為大家總結使用連接數時的最佳姿勢:
- 善用賬號權限,儘量避免Superuser直接連接應用,以方便Superuser賬號及時管理連接數
- 應用上合理的設置連接池釋放機制,同時也建議為單個用戶預留連接限制,防止資源浪費
- 定期清理空閒連接,防止連接洩漏或者空閒連接佔用過多的資源
感謝您的閱讀,也歡迎使用體驗Hologres,可以參考使用手冊,同時也歡迎掃碼加入釘群進行技術交流: