Postgrsql 從節點當機,主節點執行DML語句出現等待情況
一、問題描述
postgresql主從叢集,當叢集中的從節點當機後,主節點執行DDL與DML時出現語句等待情況。
二、問題原因分析
由於當前PostGresql叢集主從節點配置了流複製狀態,主從節點採用半同步複製關係, 一旦出現網路抖動或者從節點故障 ,複製關係不會自動降級為非同步模式, 導致同步事務進入等待狀態。
三、解決方法
針對這個問題需要對同步複製進行降級處理,下面介紹一下如何設定事務可靠性級別。
PostgreSQL 支援在會話中設定事務的可靠性級別。
off 表示commit 時不需要等待wal 持久化。
local 表示commit 是隻需要等待本地資料庫的wal 持久化。
remote_write 表示commit 需要等待本地資料庫的wal 持久化,同時需要等待sync standby節點wal write buffer完成(不需要持久化)。
on 表示commit 需要等待本地資料庫的wal 持久化,同時需要等待sync standby節點wal持久化。
提醒一點, synchronous_commit 的任何一種設定,都不影響wal日誌持久化必須先於shared buffer髒資料持久化。 所以不管你怎麼設定,都不好影響資料的一致性。
synchronous_commit = off # synchronization level;
# off, local, remote_write, or on
實現同步複製降級
如果 backend process 進入了等待迴圈,只接受幾種訊號降級。 並且降級後會告警,表示本地wal已持久化,但是同步從節點不確定wal有沒有持久化。如果你只配置了1個從節點,並且將它配置為同步流複製節點。一旦出現網路抖動和從節點故障,將導致同步事務進入等待狀態。
方法1.
修改配置檔案並重置
$ vi postgresql.conf
synchronous_commit = local
$ pg_ctl reload
然後cancel 所有query .
postgres=# select pg_cancel_backend(pid) from pg_stat_activity where pid<>pg_backend_pid();
收到這樣的訊號,表示事務成功提交,同時表示WAL不知道有沒有同步到sync standby。
WARNING: canceling wait for synchronous replication due to user request
DETAIL: The transaction has already committed locally, but might not have been replicated to the standby.
COMMITpostgres=# show synchronous_commit ;
synchronous_commit
--------------------
off
(1 row)
同時它會讀到全域性變數synchronous_commit 已經是 local了。
這樣就完成了降級的動作。
方法2.
方法1的降級需要對已有的正在等待wal sync的pid使用cancel進行處理,有點不人性化。
可以透過修改程式碼的方式,做到更人性化。
SyncRepWaitForLSN for迴圈中,加一個判斷,如果發現全域性變數sync commit變成local, off了,則告警並退出。這樣就不需要人為的去cancel query了.
WARNING: canceling wait for synchronous replication due to user request
DETAIL: The transaction has already committed locally, but might not have been replicated to the standby.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2737070/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mongodb主從仲裁節點配置MongoDB
- 計算節點會對收到的SQL 語句做解析、優化、執行並SQL優化
- DRM特性引起的RAC節點當機
- 如何執行一個 Conflux 節點UX
- selenium-grid 有多個節點,但 pytest.main 批次執行用例,每次只有一個節點執行用例,不能同時多個節點執行,要怎樣才能多個節點同時執行AI
- DataNode工作機制 & 新增節點 &下線節點
- 從節點崩了,還怎麼「主從讀寫分離」?
- ElasticSearch兩個節點的情況下,shard是如何分配的Elasticsearch
- Java中的條件判斷語句-動力節點Java
- 【故障公告】Kubernetes 叢集節點當機造成部落格站點故障
- React從零實現-節點建立和渲染React
- JavaScript學習之DOM(節點、節點層級、節點操作)JavaScript
- dom4j 根據xml節點路徑查詢節點,找到對應的目標節點下的子節點,對節點Text值進行修改XML
- Geth簡介及如何執行以太坊節點
- 從Hash Join的執行計劃的細節中能看到點啥
- KPN當選NEO主網共識節點,加速去中心化程式中心化
- 搭建PowerDNS+LAP+NFS+MySQL主從半節點同步實現LAMP架構DNSNFSMySqlLAMP架構
- oracle 11.2.0.4 rac節點異常當機之ORA-07445Oracle
- expdp 匯出時指定節點
- 基於etcd的選主功能實現的主備節點管理
- consul 多節點/單節點叢集搭建
- redis cluster 故障後,主從位於不同節點的修復。Redis
- 一句話查詢出指定節點的葉子記錄
- ADAMoracle預言機節點需衡量節點伺服器安全性Oracle伺服器
- Kubernetes – 節點
- fabric多機多節點部署
- JQuery2:節點選取與節點插入jQuery
- mysql根據節點查詢所有葉節點MySql
- rac新增節點前之清除節點資訊
- 關於Oracle 11G RAC雙節點之間存在防火牆導致只能一個節點執行Oracle防火牆
- 【IT運維小知識】如何通俗理解節點、叢集以及主從?運維
- FILE+POS 方式 GreatSQL 主從複製架構給主節點磁碟擴容SQL架構
- k8s系列--node(k8s節點介紹,新增節點,移除節點)K8S
- Python從頭實現以太坊(二):Pinging引導節點Python
- 1.19 JQuery2:節點插入與節點選取jQuery
- json 陣列已知父節點,求所有子節點JSON陣列
- MongoDB叢集搭建(包括隱藏節點,仲裁節點)MongoDB
- 第 7 小節 if、switch 語句