PostgreSQL 流復(fù)制異步轉(zhuǎn)同步的操作
非常重要的synchronous_commit參數(shù)
流復(fù)制的同步方式,有主庫(kù)配置文件postgresql.conf,中的synchronous_commit控制著。所以理解該參數(shù)的配置十分重要。
單實(shí)例環(huán)境
| 參數(shù)值 | 說明 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|
| on 或 local | 當(dāng)事務(wù)提交時(shí),WAL先寫入WAL buffer 再寫到 WAL文件(落盤)中。設(shè)置為on表示提交事務(wù)時(shí)需要等待本地WAL最終落盤后,才向客戶端返回成功。 | 非常安全 | 數(shù)據(jù)庫(kù)性能有損耗 |
| off | 當(dāng)事務(wù)提交時(shí),不需要等待WAL先寫入WAL buffer 再寫到 WAL文件(落盤)中。 | 提升數(shù)據(jù)庫(kù)性能 | 數(shù)據(jù)庫(kù)宕機(jī)是最新提交的少量事務(wù)可能丟失 |
流復(fù)制環(huán)境
| 參數(shù)值 | 說明 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|
| remote_write | 當(dāng)主庫(kù)提交事務(wù)后,需等待備庫(kù)接收主庫(kù)發(fā)送的WAL日志流并寫入WAL buffer, 就向客戶端返回成功 | 只有主庫(kù)的WAL是落盤的 | 事務(wù)響應(yīng)時(shí)間快 |
| on | 當(dāng)主庫(kù)提交事務(wù)后,需等待備庫(kù)接收主庫(kù)發(fā)送的WAL日志流并寫入WAL buffer 以及寫入WAL文件, 就向客戶端返回成功 | 主、備庫(kù)WAL均落盤,有兩份持有化文件保護(hù) | 事務(wù)響應(yīng)時(shí)間相對(duì)較慢 |
| remote_apply | 當(dāng)主庫(kù)提交事務(wù)后,需等待備庫(kù)接收主庫(kù)發(fā)送的WAL日志流并寫入WAL buffer 以及寫入WAL文件, 同時(shí)備庫(kù)apply之后, 就向客戶端返回成功 | 數(shù)據(jù)保護(hù)最好 | 影響事務(wù)性能 |
查看同步情況
在主庫(kù)執(zhí)行以下SQL , sync_state字段為async表示異步同步方式
postgres=# select usename , application_name , client_addr,sync_state from pg_stat_replication; usename | application_name | client_addr | sync_state ---------+------------------+----------------+------------ repuser | walreceiver | 192.168.56.102 | async (1 row)
配置同步復(fù)制
主庫(kù)配置postgresql.conf文件
[postgres@pg01 data]$ vi postgresql.conf synchronous_commit = on synchronous_standby_names = 'walreceiver'
synchronous_commit : 開篇提到的那個(gè)重要參數(shù)!
synchronous_standby_names: 這里的name填寫,剛剛查詢到的application_name。
重啟主庫(kù)服務(wù)
[root@pg01 PG_12_201909212]# service postgresql-12 restart Stopping postgresql-12 service: [ OK ] Starting postgresql-12 service: [ OK ]
再次查看主庫(kù)字典
postgres=# select usename , application_name , client_addr,sync_state from pg_stat_replication; usename | application_name | client_addr | sync_state ---------+------------------+----------------+------------ repuser | walreceiver | 192.168.56.102 | sync
數(shù)據(jù)保護(hù)測(cè)試
關(guān)閉備庫(kù)。模擬備庫(kù)宕機(jī)無法正常接收WAL
[root@pg02 ~]# service postgresql-12 stop Stopping postgresql-12 service: [ OK ]
主庫(kù)嘗試進(jìn)行DML操作
dong=# insert into t1 select * from t1; Cancel request sent 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. INSERT 0 8
由于備庫(kù)已關(guān)閉,無法接受從主庫(kù)傳來的WAL,根據(jù)同步規(guī)則,主庫(kù)需要一直等待主庫(kù)接收到WAL的消息。
手動(dòng)進(jìn)行了cancel, 數(shù)據(jù)庫(kù)報(bào)錯(cuò)。說明在等待備庫(kù)reguest相應(yīng)。
所以,sync同步模式雖然可以很好的保護(hù)數(shù)據(jù),但同時(shí)也帶來了性能的影響,需慎重
補(bǔ)充:PostgreSQL 流復(fù)制數(shù)據(jù)同步檢查
如何分辨主、備
看進(jìn)程
主庫(kù) – walwriter
[root@pg01 PG_12_201909212]# ps -ef| grep wal postgres 21157 21151 0 15:57 ? 00:00:00 postgres: walwriter postgres 21168 21151 0 15:57 ? 00:00:00 postgres: walsender repuser 192.168.56.102(38473) streaming 0/2A0001C0
備庫(kù) – walreceiver
[root@pg02 ~]# ps -ef | grep wal postgres 13383 13369 0 14:08 ? 00:00:01 postgres: walreceiver streaming 0/2A0001C0
函數(shù)方法
一句話判斷哪個(gè)是主庫(kù)、哪個(gè)是備庫(kù),返回的值:
f 為主庫(kù)
t 為備庫(kù)
postgres=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- f (1 row)
那我這個(gè)就是主庫(kù)嘍~
檢查流復(fù)制同步情況
先確定主庫(kù)傳到哪兒了
在確定備庫(kù)接收到哪兒了
最后確定備庫(kù)應(yīng)用到哪兒了
檢查主庫(kù)傳輸
確定主庫(kù)傳到什么位置了
postgres=# select pg_current_wal_lsn(); pg_current_wal_lsn -------------------- 0/2A0001C0 (1 row)
檢查備庫(kù)恢復(fù)
確定備庫(kù)接收到哪兒了
postgres=# select pg_last_wal_receive_lsn(); pg_last_wal_receive_lsn ------------------------- 0/2A0001C0 (1 row)
確定備庫(kù)應(yīng)用到哪兒了
postgres=# select pg_last_wal_replay_lsn(); pg_last_wal_replay_lsn ------------------------ 0/2A0001C0 (1 row)
最近事務(wù)應(yīng)用的時(shí)間
postgres=# select pg_last_xact_replay_timestamp(); pg_last_xact_replay_timestamp ------------------------------- 2020-03-05 15:20:22.125688+08 (1 row)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
postgresql查詢自動(dòng)將大寫的名稱轉(zhuǎn)換為小寫的案例
這篇文章主要介紹了postgresql查詢自動(dòng)將大寫的名稱轉(zhuǎn)換為小寫的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Ubuntu中卸載Postgresql出錯(cuò)的解決方法
這篇文章主要給大家介紹了關(guān)于在Ubuntu中卸載Postgresql出錯(cuò)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
PostgreSQL中如何將對(duì)象oid和對(duì)象名相互轉(zhuǎn)換
文章介紹了在PostgreSQL中如何使用內(nèi)部數(shù)據(jù)類型將對(duì)象OID(對(duì)象標(biāo)識(shí)符)轉(zhuǎn)換為對(duì)象名,從而簡(jiǎn)化系統(tǒng)視圖的關(guān)聯(lián)查詢,文章還提供了不同類型OID與對(duì)象名之間的轉(zhuǎn)換關(guān)系,并通過示例展示了如何將對(duì)象名轉(zhuǎn)換為OID2024-11-11
CentOS 9 Stream 上安裝 PostgreSQL 16的步
在CentOS9Stream上安裝PostgreSQL16,首先添加PostgreSQL官方倉(cāng)庫(kù),然后禁用系統(tǒng)自帶PostgreSQL版本,避免沖突,使用dnf命令安裝PostgreSQL16,并初始化數(shù)據(jù)庫(kù),本文給大家介紹CentOS 9 Stream 上安裝 PostgreSQL 16的步驟,感興趣的朋友一起看看吧2024-11-11
PostgreSQL事務(wù)回卷實(shí)戰(zhàn)案例詳析
前段時(shí)間在公司小范圍做了一個(gè)關(guān)于PG事務(wù)實(shí)現(xiàn)的講座,最后總結(jié)了一個(gè)摘要性的東西,分享一下,這篇文章主要給大家介紹了關(guān)于PostgreSQL事務(wù)回卷實(shí)戰(zhàn)案例的相關(guān)資料,需要的朋友可以參考下2022-03-03
關(guān)于PostgreSQL JSONB的匹配和交集問題
這篇文章主要介紹了PostgreSQL JSONB的匹配和交集問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
關(guān)于PostgreSql數(shù)據(jù)庫(kù)與mysql數(shù)據(jù)庫(kù)的不同點(diǎn)以及注意事項(xiàng)
PostgreSQL和MySQL是兩種流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),它們都可以用來存儲(chǔ)和管理數(shù)據(jù),但是它們?cè)谀承┓矫嬗兴煌?下面這篇文章主要給大家介紹了關(guān)于PostgreSql數(shù)據(jù)庫(kù)與mysql數(shù)據(jù)庫(kù)的不同點(diǎn)以及注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下2023-05-05
PostgreSQL的upsert實(shí)例操作(insert on conflict do)
這篇文章主要介紹了PostgreSQL的upsert實(shí)例操作(insert on conflict do),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL歸檔配置及自動(dòng)清理歸檔日志的操作
這篇文章主要介紹了PostgreSQL歸檔配置及自動(dòng)清理歸檔日志的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
postgresql關(guān)于like%xxx%的優(yōu)化操作
這篇文章主要介紹了postgresql關(guān)于like%xxx%的優(yōu)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01

