本文將為您介紹Hologres執行個體的串連架構,以及如何對執行個體中的串連進行診斷和管理。
串連和Query管理概述
Hologres相容PostgreSQL,可以通過查詢pg_stat_activity視圖資訊來查看執行個體串連資訊,以達到分析執行個體串連狀態和診斷運行SQL的目的。具體涉及的操作內容如下所示:
-
串連架構概述:瞭解Hologres從接入層(Gateway)到執行層(FE、FixedFE、Walsender)的分層串連架構,理解各層獨立的串連數上限。
-
各層串連數上限:查詢Gateway、FE、FixedFE、Walsender各層的串連數上限及對應報錯。
-
串連數相關報錯速查表:根據報錯資訊快速定位達到上限的層級及處理建議。
-
查詢執行個體的預設最大串連數:不同的執行個體規格對應不同的預設串連數,通過命令查詢當前執行個體規格的最大串連數。
-
HoloWeb可視化管理串連:通過HoloWeb可視化查看活躍串連,並進行管理如Kill等操作。
-
通過SQL查詢串連資訊:通過查詢執行個體、DB的串連數、每個串連狀態以及終止空閑串連,更好的管理執行個體。
-
查詢FixedFE串連:FixedFE串連不在pg_stat_activity中展示,需通過專用視圖查看。
-
釋放串連:通過SQL函數,釋放指定串連資源。
-
管理員預留串連:用於在串連數達到最大時對串連進行管理操作。
-
單個使用者串連數限制:為單個使用者佈建串連數上限,以防止某個使用者佔用過多串連造成資源浪費。
-
自動釋放空閑串連:開啟自動釋放空閑串連功能自動釋放長期不使用串連。
-
串連數使用最佳實務:使用Hologres串連數的最佳實務建議。
串連架構概述
Hologres執行個體的串連鏈路是分層的,用戶端串連依次經過接入層與執行層,各層都有各自獨立的串連數上限。
各組件角色如下:
-
Gateway(網關):執行個體的統一接入層,所有用戶端串連首先到達Gateway。Gateway負責串連認證、IP白名單校正,並根據串連屬性將串連轉寄到下遊的FE或FixedFE節點。Gateway節點數量最少為2個以保障高可用。計算群組執行個體中,Gateway還負責把串連轉寄到對應計算群組的FE。
-
FE(Frontend):相容PostgreSQL協議的前端節點,處理標準SQL串連(DDL、查詢、寫入等)。Fixed Plan的點查、點寫請求也可以在FE串連上執行,此時消耗FE的
max_connections配額;是否改走FixedFE由用戶端類型與執行個體版本決定。show max_connections返回的即是單個FE節點的串連數上限。 -
FixedFE(Fixed Frontend):每個FE節點上伴生的高吞吐串連服務,主要服務Fixed Plan的點查點寫情境(如holo-client,以及Flink、DataWorks即時寫入鏈路)。自Hologres V2.1版本起,Binlog消費也預設使用FixedFE輕量級串連。FixedFE串連非常輕量,不佔用FE的
max_connections配額,擁有獨立且遠大於FE的串連數上限。 -
Walsender:FE內處理邏輯複製(
replication=database)串連的進程。自Hologres V2.1版本起,Binlog消費和即時寫入已預設走FixedFE輕量級串連,Walsender主要用於仍使用傳統複製協議的相容情境。Walsender串連數獨立於max_connections,單獨由max_wal_senders控制。
不同類型的串連消耗的是不同層的串連配額。例如Fixed Plan寫入串連打滿FixedFE的配額時,並不影響普通SQL串連;反之,普通串連把max_connections佔滿時,Fixed Plan鏈路依然可用。診斷串連數滿的問題時,需要先根據報錯資訊判斷是哪一層達到上限,詳情請參見串連數相關報錯速查表。
各層串連數上限
Gateway串連數上限
-
自Hologres V4.0.15版本起,為避免用戶端超高頻串連對執行個體穩定性造成影響,計算群組型執行個體單個Gateway的串連數上限已由無限制調整為8000。詳情請參見V4.0預設行為變更。
-
執行個體Gateway層的總串連上限為Gateway節點數乘以8000。Gateway節點數量最少為2,可在管控台調整。
-
可通過管控台監控指標Gateway串連數使用率觀察接入層串連資源的峰值壓力。
達到上限時的報錯如下。
too many client tcp connections (global client_max)
FE串連數上限(max_connections)
單個FE節點的普通SQL串連數上限由max_connections控制,不同執行個體規格預設值不同,可通過如下命令查詢。
-- 單個FE節點的最大串連數
show max_connections;
-- 整個執行個體的最大串連數(等於FE節點數乘以max_connections),Hologres V1.3.23及以上版本支援
select instance_max_connections();
Hologres會為Superuser預留一部分串連(superuser_reserved_connections),用於在串連數達到上限時仍能登入進行管理操作(如終止idle串連)。普通使用者可用的串連數為max_connections減去預留串連數。
達到上限時的報錯如下。
FATAL: sorry, too many clients already connection limit exceeded for superusers
FATAL: remaining connection slots are reserved for non-replication superuser connections
FixedFE串連數上限
-
每個FE節點上的FixedFE服務擁有獨立的串連數上限,為6400個每節點。
-
執行個體FixedFE層的總串連上限為FE節點數乘以6400。
-
FixedFE串連不佔用
max_connections配額,也不出現在pg_stat_activity中,需要通過專用視圖hg_fixed_fe_stat_activity查看,詳情請參見查詢FixedFE串連。 -
走FixedFE的典型串連包括:holo-client、Flink連接器、DataWorksData Integration的Fixed Plan寫入與點查串連,以及Binlog消費串連(自Hologres V2.1版本起預設走輕量級串連)。
-
FixedFE串連目前僅支援查看,不支援通過SQL終止(Kill)釋放。如遇FixedFE串連數打滿,需在用戶端側排查串連池配置或重啟對應任務。
達到上限時的報錯如下。
FATAL: too many fixed frontend connections
Walsender串連數上限(max_wal_senders)
-
邏輯複製串連(
replication=database)在FE上由Walsender進程服務,單個FE節點的Walsender串連數上限由max_wal_senders控制,預設為600。 -
Walsender串連數獨立於
max_connections,兩者互不佔用。
自Hologres V2.1版本起,即時寫入(如Flink連接器)和Binlog消費已預設使用輕量級串連(FixedFE),不再走Walsender通道。對維表和結果表,Flink連接器會在Hologres版本大於V3.0.28時自動選擇輕量級串連模式(connection.fixed.enabled),詳情請參見參數配置(VVR 11及以上版本)。因此Walsender串連數上限主要影響仍使用傳統複製協議的少量情境。更多關於Binlog消費串連方式的說明,請參見通過JDBC消費Hologres Binlog。
達到上限時的報錯如下。
FATAL: number of requested standby connections exceeds max_wal_senders (currently 600)
上限預覽表
|
層級 |
上限參數 |
預設或固定值 |
生效粒度 |
查看方式 |
|
Gateway |
|
8000(Hologres V4.0.15版本起,計算群組型執行個體) |
每個Gateway節點 |
管控台監控指標Gateway串連數使用率 |
|
FE |
|
按執行個體規格 |
每個FE節點 |
|
|
FE(執行個體級) |
無 |
FE節點數乘以 |
執行個體 |
|
|
FixedFE |
固定值 |
6400 |
每個FE節點 |
通過 |
|
Walsender |
|
600 |
每個FE節點 |
無 |
以上各層串連數的使用方式,均可在Hologres管控台執行個體的監控資訊>流量與串連分組中查看。
串連數相關報錯速查表
|
報錯資訊 |
達到上限的層級 |
處理建議 |
|
|
Gateway節點8000上限 |
排查用戶端串連泄漏;必要時增加Gateway節點數。 |
|
|
FE的 |
釋放idle串連,詳情請參見釋放串連;或升配、增加FE節點。 |
|
|
FE普通使用者配額(預留Superuser串連後已滿) |
使用Superuser營運帳號登入並釋放串連。 |
|
|
FixedFE 6400上限 |
檢查Fixed Plan用戶端(如holo-client、Flink連接器)串連池配置是否過大或存在泄漏。 |
|
|
Walsender的 |
檢查Binlog消費任務數量,以及failover後是否殘留舊串連。 |
|
|
非上限問題,idle逾時被回收 |
重連,或調大 |
查詢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命令的傳回值。
-
查詢FixedFE串連
FixedFE串連(Fixed Plan寫入與點查串連)不在pg_stat_activity中展示,需要查詢專用視圖hg_fixed_fe_stat_activity。
-- 查看當前FE節點上的所有FixedFE串連
select * from hg_fixed_fe_stat_activity;
-- 統計FixedFE串連數(對比6400上限評估水位)
select count(*) from hg_fixed_fe_stat_activity;
-- 按資料庫、使用者、應用統計FixedFE串連
SELECT datname
,usename
,application_name
,COUNT(1)
FROM hg_fixed_fe_stat_activity
GROUP BY datname
,usename
,application_name;
主要欄位包括datname、conn_id(FixedFE串連ID)、usename、application_name、client_addr、client_port、backend_start、state、query_start、query等,其中backend_type為fixed frontend connection。
僅Superuser可以看到所有FixedFE串連資訊,普通使用者只能看到自己的串連資訊。FixedFE串連目前僅支援查看,不支援通過pg_terminate_backend等函數終止。如需釋放FixedFE串連,請在用戶端側關閉對應串連或重啟相關任務(如Flink作業)。
釋放串連
如果您遇到如下情況,則說明系統串連數(或者某個接入節點)已經達到上限:
-
串連數達到甚至超出
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報錯。 -
產生
FATAL: too many fixed frontend connections報錯,表示FixedFE層達到上限。 -
產生
too many client tcp connections報錯,表示Gateway層達到上限。
當您有上述情況產生,可以先根據串連數相關報錯速查表定位是哪一層達到上限。對於FE層串連數滿的情況,可以通過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不會在後台自動釋放串連(除非開啟
idle_session_timeout),建議業務上給應用設定合理的串連池機制,讓空閑串連及時釋放。 -
定期清理空閑串連,防止空閑串連佔用過多串連影響線上業務。
-
Fixed Plan用戶端(如holo-client、Flink連接器)同樣需要關注串連池大小。它們消耗的是FixedFE的6400每節點配額,串連泄漏同樣會導致該鏈路不可用。
-
Binlog消費任務(自Hologres V2.1版本起預設走FixedFE輕量級串連)failover時,注意確認舊串連已釋放,避免FixedFE配額被殘留串連耗盡。若仍使用傳統Walsender複製協議,則需關注
max_wal_senders配額。
-
-
分層監控串連資源
-
接入層(Gateway):觀察管控台Gateway串連數使用率監控指標。
-
FE層:通過
hologres.hg_connections查看各FE節點串連水位,結合pg_stat_activity分析具體串連。 -
FixedFE層:通過
hg_fixed_fe_stat_activity視圖統計Fixed Plan串連數。 -
Walsender:在
pg_stat_activity中篩選backend_type = 'walsender'查看Binlog消費串連。
-
常見報錯
-
錯誤提示:執行sql時報錯:
terminating connection due to idle state timeout。 -
可能原因:為執行個體設定了自動釋放串連的逾時,超過設定的逾時時間後,串連就會自動斷連,然後出現報錯。
-
解決方案:重新串連,或者修改空閑連線逾時時間為更大的數值,修改空閑連線逾時時間操作請參見自動釋放空閑串連。
更多串連數相關報錯及對應處理建議,請參見串連數相關報錯速查表。