本文將為您介紹如何對執行個體中的串連進行診斷和管理。
串連和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交流群申請升級執行個體。加入線上支援DingTalk群請參見如何擷取更多的線上支援?
文法樣本
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
。可能原因:為執行個體設定了自動釋放串連的逾時,超過設定的逾時時間後,串連就會自動斷連,然後出現報錯。
解決方案:重新串連,或者修改空閑連線逾時時間為更大的數值,修改空閑連線逾時時間操作請參見自動釋放空閑串連。