PostgreSQL 14中連線引數target_session_attrs增強
PostgreSQL 14中連線引數target_session_attrs增強
本文討論PostgreSQL 14資料庫連線引數target_session_attrs增強的功能,並解釋該功能背後的歷史、如何使用它以及它提供的各種好處。
背景
很多PG客戶端程式使用C客戶端libpq庫訪問資料庫。libpq提供了一系列函式,允許連線PG後臺服務並將查詢傳送過去,同時還可以接收查詢返回的結果。
透過libpq,PG支援一個連線字串,指定多個host+port。依次嘗試每個host+port直到成功建立連線。
PG10中引入指定多個hosts的功能。同時增加了引數target_session_attrs,允許指定連線的後臺server型別。
支援下面的引數值:
target_session_attrs值 |
意義 |
any(預設值) |
可以接受所有連線 |
read-write |
預設情況下,可接受的讀寫事務中僅可以接受一個連線 |
從PG11開始,Fujitsu提供了額外的引數值,不僅要滿足其他連線型別,還要提高內部效率,以驗證引數並建立連線。因此與PG社群開始了漫長的審查、諮詢、改進的過程。涉及:
多名開發人員;許多補丁版本和補丁集更改;社群許多成員的反饋,有時會有不同意見和想法;一些成員對附加功能的請求;提交者本人的最終改進、調整與簡化。
最終libpq增強功能在PG14提交了。
功能概述
PG14中target_session_attrs值如下,高亮顯示的是新值:
target_session_attrs值 |
意義 |
any(預設值) |
可以接受所有連線 |
read-write |
預設情況下,可接受的讀寫事務中僅可以接受一個連線 |
read-only |
預設情況下,會話不能接受任何讀寫事務 |
primary |
Server不能是hot standby模式 |
standby |
server必須是hot standby模式 |
prefer-standby |
首先嚐試找到一個standby server。但如果hosts列表中沒有standby server,那麼嘗試“any”模式 |
注意,由於default_transaction_read_only設定成on,PG的server可以是隻讀但不能是hot standby模式。
支援的客戶端
任何使用libpq庫的客戶端都能夠使用target_session_attrs以及此處描述的改進的功能。支援psycopg2(python驅動)、psqlODBC(c 語言介面的驅動)。但是不包括JDBC驅動和NpgSql。JDBC支援targetServerType提供類似的功能,允許的值有primary/secondary/preferSecondary。NpgSql目前沒有類似功能。
連線效能的提升
target_session_attrs增加了新值,當連線到PG14或之後的版本時,效能會有所提升。透過使用與會話狀態相關的配置變數來實現:
GUC變數 |
描述 |
default_transaction_read_only |
PG14中可報告的(GUC_REPORT) |
in_hot_standby |
PG14中新的GUC_REPORT變數 |
伺服器在成功連線時直接向客戶端報告這些資訊,節省了額外的網路往返時間以確定會話狀態。因此連線到舊版本服務時,會發出SHOW和SELECT查詢以檢測會話只讀或熱備狀態。注意,若服務在會話期間被提升成主,則in_hot_standby也會報告給客戶端。
案例
Psql使用libpq,可以無需任何編碼測試target_session_attrs。下面顯示了嘗試連線2個可能的本地服務其中一個服務時,使用不同target_session_attrs值的簡單例子。
1、建立本地服務例項testdb1和testdb2(分別執行在端庫5432和5433)
$ pg_ctl -D ./testdb1 initdb $ pg_ctl -D ./testdb2 initdb $ pg_ctl -D ./testdb1 -o '-p 5432' -l testdb_1.log start $ pg_ctl -D ./testdb2 -o '-p 5433' -l testdb_2.log start
2、嘗試連線僅接受只讀事務的服務
$ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=read-only" psql: error: connection to server at "localhost" (::1), port 5432 failed: session is not read-only connection to server at "localhost" (::1), port 5433 failed: session is not read-only
連線失敗,因為2個例項僅接受讀寫事務。
3、改變testdb2使其僅接受只讀事務,更改testdb2/postgresql.conf新增default_transaction_read_only=on並重啟。
$ pg_ctl -D ./testdb2 -o '-p 5433' -l testdb_2.log restart
4、嘗試連線到只讀server
$ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=read-only" psql (14devel) Type "help" for help. postgres=# show port; port ------ 5433 (1 row)
5、嘗試連線hot standby的server
$ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=standby" psql: error: connection to server at "localhost" (::1), port 5432 failed: server is not in hot standby mode connection to server at "localhost" (::1), port 5433 failed: server is not in hot standby mode
連線失敗,因為沒有hot standby模式的例項
6、嘗試連線primary server
$ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=primary" psql (14devel) Type "help" for help. postgres=# show port; port ------ 5432 (1 row)
7、連線到一個server,最好是處於熱備模式的
$ psql "host=localhost,localhost port=5432,5433 dbname=postgres target_session_attrs=prefer-standby" psql (14devel) 輸入 “help”獲取幫助。 postgres=# 顯示埠; 埠 ------ 5432 (1 行)
總結
支援的target_session_attrs新值,允許客戶端選擇需要的目標服務連線時進行更精細的粒度,並協助多主機連線功能。還提供了一種基本的擴充套件形式,例如允許將只讀請求重定向到備服務,以減少主服務的負載。最後新值可以允許多主機連線字串更好地與某些故障切換解決方案一起公眾,以重新連線到可用的服務。
原文
https://www.postgresql.fastware.com/blog/enhancement-to-target-session-attrs
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2854597/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 連線相關引數MySql
- PostgreSQL:引數簡介SQL
- PostgreSQL AutoVacuum 相關引數SQL
- [轉帖]HikariCP連線池引數解釋
- 建立 MQTT 連線時如何設定引數?MQQT
- Spring Boot中增強對MongoDB的配置(連線池等)Spring BootMongoDB
- PostgreSQL11preview-索引增強彙總SQLView索引
- postgresql配置引數最佳化SQL
- Druid連線池引數maxWait配置錯誤引發的問題UIAI
- PostgreSQL 連線 超時異常SQL
- Rust 連線 PostgreSQL 資料庫RustSQL資料庫
- PostgreSQL DBA(155) - Develop(“大表”連線)SQLdev
- EF Core連線PostgreSQL資料庫SQL資料庫
- postgresql連線失敗如何處理SQL
- PostgreSQL的idle in transaction連線狀態SQL
- MySql連線資料庫常用引數及程式碼示例MySql資料庫
- PostgreSQL11preview-平行計算增強彙總SQLView
- PostgreSQL11preview-分割槽表增強彙總SQLView
- PostgreSQL11preview-優化器增強彙總SQLView優化
- PostgreSQL DBA(144) - pgAdmin(AUTOVACUUM:引數解析#2)SQL
- PostgreSQL DBA(145) - pgAdmin(AUTOVACUUM:引數解析#3)SQL
- PostgreSQL安裝完成後,引數調整SQL
- postgresql11修改引數永久生效方法SQL
- PostgreSQL server端接收連線後fork程式SQLServer
- PostgreSQL資料庫連線保持設定SQL資料庫
- PostgreSQL15開啟遠端連線SQL
- PostgreSQL優化案例之 反連線與外連線等價改寫SQL優化
- 連線池和連線數詳解
- PostgreSQL DBA(66) - 配置引數(checkpoint_flush_after)SQL
- PostgreSQL DBA(64) - checkpoint_completion_target引數解析SQL
- PostgreSQL並行查詢相關配置引數SQL並行
- jmeter如何實現引數自增JMeter
- springboot websocket叢集(stomp協議)連線時候傳遞引數Spring BootWeb協議
- PHP擴充套件資料庫連線引數說明詳解PHP套件資料庫
- PostgreSQL DBA(1) - 資料庫引數設定#1SQL資料庫
- PostgreSQL DBA(2) - 資料庫引數設定#2SQL資料庫
- Oracle vs PostgreSQL Develop(23) - PL(pg)sql(引數宣告)OracleSQLdev
- PostgreSQL的"double buffers"刷髒機制和引數SQL