本文將為您介紹如何對實例中的連接進行診斷和管理。
連接和Query管理概述
Hologres兼容PostgreSQL,可以通過查詢pg_stat_activity視圖信息來查看實例連接信息,以達到分析實例連接狀態和診斷運行SQL的目的。具體涉及的操作內容如下所示:
查詢實例的默認最大連接數:不同的實例規格對應不同的默認連接數,通過命令查詢當前實例規格的最大連接數。
HoloWeb可視化管理連接:通過HoloWeb可視化查看活躍連接,并進行管理如Kill等操作。
通過SQL查詢連接信息:通過查詢實例、DB的連接數、每個連接狀態以及終止空閑連接,更好的管理實例。
釋放連接:通過SQL函數,釋放指定連接資源。
管理員預留連接:用于在連接數達到最大時對連接進行管理操作。
單個用戶連接數限制:為單個用戶設置連接數上限,以防止某個用戶占用過多連接造成資源浪費。
自動釋放空閑連接:開啟自動釋放空閑連接功能自動釋放長期不使用連接。
連接數使用最佳實踐:使用Hologres連接數的最佳實踐建議。
查詢pg_stat_activity視圖信息
pg_stat_activity是一個非常有用的視圖,可以分析排查當前運行的SQL任務以及一些異常問題。您可以執行如下命令查看實例連接和Query的運行信息。
select * from pg_stat_activity ;
pg_stat_activity視圖的參數說明如下所示。
字段 | 描述 |
datid | Hologres后端連接到的數據庫的OID。 |
datname | Hologres后端連接到的數據庫的名稱。 |
pid | Hologres后端的進程ID。 |
usesysid | 登錄到Hologres后端的用戶OID。 |
usename | 當前連接的用戶名。 |
application_name | 客戶端的應用類型。 其中常見的應用類型如下:
|
client_addr | 客戶端的IP地址。 顯示的IP地址可能是被解析過的,不保證一定是源端IP。 |
client_hostname | 客戶端的主機名。 |
client_port | 客戶端的端口。 |
backend_start | 后臺進程開始的時間。 |
xact_start | 該進程的當前事務被啟動的時間。
|
query_start | 當前活動查詢開始的時間,如果當前連接狀態不是active,取值為上一個查詢開始的時間。 |
state_change | 連接的狀態(state)上一次被改變的時間。 |
wait_event_type | 后端正在等待的事件類型,如果不存在則為NULL。可能的取值有:
|
wait_event | 如果后端當前正在等待,則是等待事件的名稱,否則為 NULL。 |
state | 表示連接的狀態。常見的狀態如下:
|
backend_xid | Hologres后端的頂層事務標識符。 |
backend_xmin | 當前后端的xmin范圍。 |
query | 后端最近執行的查詢。如果state為 |
backend_type | 當前后端的類型。可能的類型為autovacuum launcher、autovacuum worker、logical replication launcher、logical replication worker、parallel worker、background writer、client backend、checkpointer、startup、walreceiver、walsender以及 walwriter。除此之外還包括后端的執行組件,例如PQE等。 說明 需要關注 |
使用說明
僅超級管理員(Superuser)可以看到所有連接信息,普通用戶只能看到自己的連接信息。
查詢實例的默認最大連接數
不同的實例規格對應不同的默認連接數,您可以通過以下命令查詢當前實例規格的最大連接數。命令執行完成后顯示結果為單個FrontEnd節點的連接數,總連接數需要乘實例的FrontEnd節點數,不同實例的Frontend節點數請參見實例規格概述。
查詢當前實例的最大連接數,Hologres V1.3.23及以上版本支持。
select instance_max_connections();
查詢單個FrontEnd(FE)節點的最大連接數。實例總連接數即為FE數量乘以單個節點的最大連接數。
show max_connections;
HoloWeb可視化管理連接
您可以通過HoloWeb可視化查看活躍連接并進行管理。
登錄HoloWeb控制臺,詳情請參見連接HoloWeb并執行查詢。
單擊頂部導航欄的診斷與優化。
在左側導航欄單擊活躍連接管理。
進入活躍連接管理頁面,配置好參數,可查看實例的連接以及相關信息。
說明僅Superuser賬號可以看到全部連接信息,普通用戶只能看到自己的連接信息。
參數說明如下。
參數
說明
實例名
Hologres實例名稱。
數據庫
Hologres數據庫名稱,可選擇指定數據庫,不選擇則默認展示全部數據庫。
Database
連接的數據庫名稱。
說明若數據庫名稱為Postgres,則說明是后臺運維連接,可忽略。
User Name
連接的用戶賬號。
Client Address
客戶端IP地址,但不一定是真實的IP,可能是經過路由轉發的出口IP。
Application Name
連接的應用名稱。
State
連接的狀態,常見的狀態如下。
active:活躍。
idle:空閑。
idle in transaction:長事務中的空閑狀態。
idle in transaction(Aborted):已失敗事務中的空閑狀態。
Query Start
Query開始時間。
Query
執行的Query。
說明若是Query太長,可能會被截斷。
PID
Query的pid。
操作
Kill:不符合預期的連接可直接Kill或者批量刪除。
詳情:單擊可以看到詳細的連接信息。
通過SQL查詢連接信息
若您更傾向于使用SQL的方式查詢連接信息,可以通過以下方式操作。
查詢當前數據庫的連接數。
您可以通過如下命令查看當前數據庫的連接數,更多關于參數的說明,請參見參數說明。
Hologres V1.1及以上版本。
SELECT datname::TEXT ,COUNT(1) AS COUNT FROM pg_stat_activity WHERE backend_type = 'client backend' AND application_name != 'hologres' GROUP BY datname::TEXT;
Hologres V0.10及以下版本。
SELECT datname ,COUNT(1) AS COUNT FROM pg_stat_activity WHERE backend_type = 'client backend' AND application_name != 'hologres' GROUP BY datname;
查看每個連接的狀態。
您可以在Hologres管控臺通過HoloWeb查看每個實例的連接狀態,也可以執行如下語句,通過查詢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):表示進程處于一個事務中,該事務存在語句錯誤,并且進程當前沒有執行查詢操作。
fastpath function call:表示進程正在執行一個
fast-path
函數。disabled:表示進程的
track activities
被禁用。
例如,您可以執行如下命令查詢當前實例的空閑連接。
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';
Holoweb等Hologres周邊組件會通過JDBC的方式占用一定的連接數,如果您的連接數滿足需求,無需關心此類連接數的占用。當SQL連接數長期接近或達到
max_connections
時,意味著您需要檢查您的應用是否存在連接數泄漏情況,需要在應用端合理設置連接池大小,或者您也可以根據下面章節釋放空閑連接,詳情請參見釋放連接。查看每個接入節點的連接數
查詢實例當前每個FrontEnd節點的連接數,Hologres V1.3.23版本起支持。當前沒有連接使用的FE節點不會顯示在查詢結果中。
select * from hologres.hg_connections;
查詢結果字段含義如下:
fe_id:FE節點的編碼。
used_connections:FE節點當前已使用的連接數。
max_connections:FE節點的最大連接數,同
show max_connections
命令的返回值。
釋放連接
如果您遇到如下情況,則說明系統連接數(或者某個接入節點)已經達到上限:
連接數達到甚至超出
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字段,并執行如下語句釋放空閑連接。更多關于參數的說明,請參見參數說明。
select pg_cancel_backend(<pid>); -- cancel該連接上的query
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 query not like '%pg_cancel_backend%';
管理員預留連接
Hologres會為Superuser預留連接,不同的實例規格預留的連接數不同,詳情請參見實例規格概述。Superuser預留連接用于在連接數達到最大時對連接進行管理操作(如終止idle連接),普通用戶的連接數最大為max_connections減去預留連接。在實踐中,不建議普通用戶使用Superuser賬號操作數據庫,否則會導致連接全部占滿,且無法通過管理渠道釋放連接。
單個用戶連接數限制
限制單個用戶的連接數上限
由于Hologres兼容PostgreSQL,因此支持為單個用戶設置連接數上限,以防止某個用戶占用過多連接造成資源浪費。
通過執行如下語句限制單個用戶在單個接入節點上的最大連接數,如果實例有多個節點,則總的連接數上限為單個節點連接數 * 節點數
。
語法示例
ALTER ROLE "云賬號ID" CONNECTION LIMIT <number>;
參數說明
參數
說明
云賬號ID
需要限制的賬號ID,如果為RAM用戶,需要在賬號UID前加p4_。
更多關于賬號的說明,請參見賬號概述。
number
限制的連接數個數。
取值范圍為[-1 , N],-1表示取消用戶的連接數限制。
使用示例
如下示例限制RAM用戶283813xxxx一個節點最多只有一個連接。
ALTER ROLE "p4_283813xxxx" CONNECTION LIMIT 1;
查看每個用戶限制的單節點連接數
通過執行如下語句查看當前已經為實例用戶設置的單節點限制連接數。
SELECT rolname, rolconnlimit
FROM pg_roles
WHERE rolconnlimit <> -1;
查詢示例結果如下:
rolname | rolconnlimit
---------------+--------------
p4_283813xxxx | 1
(1 row)
自動釋放空閑連接
當實例存在連接數長期接近或達到上限值時,可能存在連接泄漏情況,可以開啟自動釋放空閑連接功能來釋放長期不使用連接。當連接空閑時間(無SQL執行)超過設置時間時,連接會自動被斷開。
使用限制
僅Hologres V0.10.25及以上版本支持自動釋放空閑連接功能,如果您的實例是V0.10.25以下版本,請您使用自助升級或加入實時數倉Hologres交流群申請升級實例。加入在線支持釘釘群請參見如何獲取更多的在線支持?
語法示例
session級別。
-- 連接在10分鐘沒有執行sql的情況,會自動斷開,單位為毫秒。 SET idle_session_timeout = 600000;
數據庫級別。
-- 連接在10分鐘沒有執行sql的情況,會自動斷開,單位為毫秒。 ALTER DATABASE <db_name> SET idle_session_timeout = 600000;
db_name為要開啟自動釋放空閑連接功能的數據庫名稱。
連接數使用最佳實踐
在使用Hologres連接數時的最佳實踐建議如下所示。
善用Superuser賬號
不建議使用Suerpser賬號直接操作實例或者連接應用,否則當連接數超過實例默認連接數之后,賬號將無法連接實例。
建議專門設置一個Superuser賬號為運維賬號,當出現連接數超過實例默認連接數、Query卡死等緊急情況時,使用該Superuser賬號登錄HoloWeb管理連接和Query。
設置合理的連接池
為了業務安全考慮,Hologres不會在后臺自動釋放連接,建議業務上給應用設置合理的連接池機制,讓空閑連接及時釋放。
定期清理空閑連接,防止空閑連接占用過多連接影響線上業務。
常見報錯
錯誤提示:執行sql時報錯:
terminating connection due to idle state timeout
。可能原因:為實例設置了自動釋放連接的超時,超過設置的超時時間后,連接就會自動斷連,然后出現報錯。
解決方案:重新連接,或者修改空閑連接超時時間為更大的數值,修改空閑連接超時時間操作請參見自動釋放空閑連接。