溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PostgreSQL 多個(gè)同步復(fù)制服務(wù)器

發(fā)布時(shí)間:2020-07-22 03:19:08 來源:網(wǎng)絡(luò) 閱讀:757 作者:我的二狗呢 欄目:系統(tǒng)運(yùn)維

PG9.6版本時(shí),只能支持基于優(yōu)先級(jí)的同步備庫方式。

PG10及以后版本中,引入了 synchronous_standby_names 這種基于 Quorum的同步復(fù)制優(yōu)選提交的機(jī)制。

?


同步復(fù)制支持一個(gè)或者更多個(gè)同步后備服務(wù)器,事務(wù)將會(huì)等待,直到所有同步后備服務(wù)器都確認(rèn)收到了它們的數(shù)據(jù)為止。事務(wù)必須等待其回復(fù)的同步后備的數(shù)量由synchronous_standby_names指定。這個(gè)參數(shù)還指定一個(gè)后備服務(wù)器名稱及方法(FIRSTANY)的列表來從列出的后備中選取同步后備。

?

方法FIRST指定一種基于優(yōu)先的同步復(fù)制并且讓事務(wù)提交等待,直到它們的WAL記錄被復(fù)制到基于優(yōu)先級(jí)選中的所要求數(shù)量的同步后備上為止。在列表中出現(xiàn)較早的后備被給予較高的優(yōu)先級(jí),并且將被考慮為同步后備。其他在這個(gè)列表中位置靠后的后備服務(wù)器表示可能的同步后備。如果任何當(dāng)前的同步后備由于任何原因斷開連接,它將立刻被下一個(gè)最高優(yōu)先級(jí)的后備所替代。

?

基于優(yōu)先級(jí)的多同步后備的synchronous_standby_names示例1

synchronous_standby_names = 's1, s2'

在這個(gè)例子中,s1是同步備庫,s2為潛在同步備庫,當(dāng)s1不可用時(shí),s2升級(jí)為同步備庫

?

基于優(yōu)先級(jí)的多同步后備的synchronous_standby_names示例2

synchronous_standby_names = 'FIRST 2 (s1, s2, s3)'

在這個(gè)例子中,如果有四個(gè)后備服務(wù)器s1、s2、s3s4在運(yùn)行,列表前兩個(gè)后備服務(wù)器s1s2將被選中為同步后備。

主庫提交事務(wù)時(shí),必須要等s1s2都接收并寫入WAL日志文件才能返回給客戶端成功。

s3是一個(gè)潛在的同步后備,當(dāng)s1s2中的任何一個(gè)失效, 它將升級(jí)為同步備庫。

s4則是一個(gè)異步后備因?yàn)樗拿植辉诹斜碇小?/span>

?

基于Quorum數(shù)量的同步復(fù)制 示例:

synchronous_standby_names的基于規(guī)定數(shù)量的多同步后備的例子:

synchronous_standby_names = 'ANY 2 (s1, s2, s3)'

在這個(gè)例子中,如果有四臺(tái)后備服務(wù)器s1、s2s3以及s4正在運(yùn)行,事務(wù)提交將會(huì)等待來自s1 s2 s3中至少任意兩臺(tái)后備服務(wù)器的回復(fù)。

s4是一臺(tái)異步后備,因?yàn)樗拿植辉谠摿斜碇小?/span>

?

后備服務(wù)器的同步狀態(tài)可以使用pg_stat_replication視圖查看。

?

當(dāng)一臺(tái)后備服務(wù)器第一次附加到主服務(wù)器時(shí),它將處于一種還沒有正確同步的狀態(tài)。這被描述為追趕模式。一旦后備服務(wù)器和主服務(wù)器之間的遲滯第一次變成零,我們就來到了實(shí)時(shí)的流式狀態(tài)。在后備服務(wù)器被創(chuàng)建之后的很長一段時(shí)間內(nèi)可能都是追趕模式。如果后備服務(wù)器被關(guān)閉,則追趕周期將被增加,增加量由后備服務(wù)器被關(guān)閉的時(shí)間長度決定。只有當(dāng)后備服務(wù)器到達(dá)流式狀態(tài)后,它才能成為一臺(tái)同步后備。這種狀態(tài)可以使用pg_stat_replication視圖查看。

?


注意:

如果在提交正在等待確認(rèn)時(shí)主服務(wù)器重啟,那些正在等待的事務(wù)將在主數(shù)據(jù)庫恢復(fù)時(shí)被標(biāo)記為完全提交。沒有辦法確認(rèn)所有后備服務(wù)器已經(jīng)收到了在主服務(wù)器崩潰時(shí)所有還未處理的 WAL 數(shù)據(jù)。某些事務(wù)可能不會(huì)在后備服務(wù)器上顯示為已提交,即使它們?cè)谥鞣?wù)器上顯示為已提交。我們提供的保證是:在 WAL 數(shù)據(jù)已經(jīng)被所有后備服務(wù)器安全地收到之前,應(yīng)用將不會(huì)收到一個(gè)事務(wù)成功提交的顯式確認(rèn)。

?

?

實(shí)驗(yàn)部分:

一主兩備的流復(fù)制實(shí)驗(yàn)(集群使用patroni搭建,它會(huì)自動(dòng)構(gòu)建同步復(fù)制節(jié)點(diǎn)):

postgres=# select pid,usename,application_name,client_addr,state,sync_state,sync_priority from pg_stat_replication ;

? pid? |? usename?? | application_name |? client_addr? |?? state?? | sync_state | sync_priority

-------+------------+------------------+---------------+-----------+------------+---------------

?58691 | replicator | pg_node3???????? | 192.168.2.189 | streaming | sync?????? |???????????? 1

?58712 | replicator | pg_node2???????? | 192.168.2.188 | streaming | potential? |???????????? 1

(2 rows)

?

說明:

sync?????? 表示同步庫

potential? 表示潛在同步庫

?

patroni 構(gòu)建的PG流復(fù)制集群中,我的配置是已經(jīng)開啟了基于優(yōu)先級(jí)多備庫的方式。 因此我們可以任意關(guān)閉1個(gè)standby節(jié)點(diǎn),但是如果我們關(guān)閉全部的standby節(jié)點(diǎn)后,會(huì)造成主節(jié)點(diǎn)的修改阻塞。

?


下面是我自建的基于Quorum的同步備庫演示貼圖(因?yàn)槲以?strong >patroni里面沒找到哪里配的支持Quorum。。。暫時(shí)也懶得找了):

修改 postgresql.conf 的如下內(nèi)容:

synchronous_standby_names = 'ANY 2 (pg_node2,pg_node3)'

?

然后重載pg的配置文件:

pg_ctl reload??

?

然后在主庫查詢配置是否生效:

postgres=# show synchronous_standby_names ;

?synchronous_standby_names

---------------------------

?ANY 2 (pg_node2, pg_node3)

(1 row)

?

這時(shí)候,在主庫查看到的如下:

postgres=# select pid,usename,application_name,client_addr,state,sync_state,sync_priority from pg_stat_replication ;

? pid? |? usename?? | application_name |? client_addr? |?? state?? | sync_state | sync_priority

-------+------------+------------------+---------------+-----------+------------+---------------

?65373 | replicator | pg_node3???????? | 192.168.2.189 | streaming | quorum???? |???????????? 1

?65375 | replicator | pg_node2???????? | 192.168.2.188 | streaming | quorum???? |???????????? 1

(2 rows)

?

圖上可以看出,2個(gè)standby節(jié)點(diǎn)的sync_state都是 quorum的,并且 sync_priority 優(yōu)先級(jí)都是1 (基于Quorum的同步備庫 sync_prioriy的值對(duì)備庫無影響,可忽略)

?

接著關(guān)閉一個(gè)同步備庫 pg_node2 ,這時(shí)候我們?nèi)ブ鲙觳迦霐?shù)據(jù),可看到被阻塞了。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI