時(shí)間:2024-02-13 10:22作者:下載吧人氣:36
物理復(fù)制也叫流復(fù)制,流復(fù)制的原理是主庫(kù)把WAL發(fā)送給備庫(kù),備庫(kù)接收WAL后,進(jìn)行重放。
邏輯復(fù)制也是基于WAL文件,在邏輯復(fù)制中把主庫(kù)稱為源端庫(kù),備庫(kù)稱為目標(biāo)端數(shù)據(jù)庫(kù),源端數(shù)據(jù)庫(kù)根據(jù)預(yù)先指定好的邏輯解析規(guī)則對(duì)WAL文件進(jìn)行解析,把DML操作解析成一定的邏輯變化信息(標(biāo)準(zhǔn)SQL語(yǔ)句),源端數(shù)據(jù)庫(kù)把標(biāo)準(zhǔn)SQL語(yǔ)句發(fā)給目標(biāo)端數(shù)據(jù)庫(kù),目標(biāo)端數(shù)據(jù)庫(kù)接收到之后進(jìn)行應(yīng)用,從而實(shí)現(xiàn)數(shù)據(jù)同步。
流復(fù)制主庫(kù)上的事務(wù)提交不需要等待備庫(kù)接收到WAL文件后的確認(rèn),邏輯復(fù)制相反。
流復(fù)制要求主備庫(kù)的大版本一致,邏輯復(fù)制可以跨大版本的數(shù)據(jù)同步,也可以實(shí)現(xiàn)異構(gòu)數(shù)據(jù)庫(kù)的數(shù)據(jù)同步。
流復(fù)制的主庫(kù)可讀寫(xiě),從庫(kù)只允許讀,邏輯復(fù)制的目標(biāo)端數(shù)據(jù)庫(kù)要求可讀寫(xiě)
流復(fù)制是對(duì)實(shí)例級(jí)別的復(fù)制(整個(gè)postgresql數(shù)據(jù)庫(kù)),邏輯復(fù)制是選擇性的復(fù)制一些表,所以是對(duì)表級(jí)別的復(fù)制。
流復(fù)制有主庫(kù)的DDL、DML操作,邏輯復(fù)制只有DML操作。
補(bǔ)充:PostgreSQL 同步流復(fù)制原理和代碼淺析
數(shù)據(jù)庫(kù)ACID中的持久化如何實(shí)現(xiàn)
數(shù)據(jù)庫(kù)ACID里面的D,持久化。 指的是對(duì)于用戶來(lái)說(shuō)提交的事務(wù),數(shù)據(jù)是可靠的,即使數(shù)據(jù)庫(kù)crash了,在硬件完好的情況下,也能恢復(fù)回來(lái)。
PostgreSQL是怎么做到的呢,看一幅圖,畫(huà)得比較丑,湊合看吧。
假設(shè)一個(gè)事務(wù),對(duì)數(shù)據(jù)庫(kù)做了一些操作,并且產(chǎn)生了一些臟數(shù)據(jù),首先這些臟數(shù)據(jù)會(huì)在數(shù)據(jù)庫(kù)的shared buffer中。
同時(shí),產(chǎn)生這些臟數(shù)據(jù)的同時(shí)也會(huì)產(chǎn)生對(duì)應(yīng)的redo信息,產(chǎn)生的REDO會(huì)有對(duì)應(yīng)的LSN號(hào)(你可以理解為REDO 的虛擬地址空間的一個(gè)唯一的OFFSET,每一筆REDO都有),這個(gè)LSN號(hào)也會(huì)記錄到shared buffer中對(duì)應(yīng)的臟頁(yè)中。
walwriter是負(fù)責(zé)將wal buffer flush到持久化設(shè)備的進(jìn)程,同時(shí)它會(huì)更新一個(gè)全局變量,記錄已經(jīng)flush的最大的LSN號(hào)。
bgwriter是負(fù)責(zé)將shared buffer的臟頁(yè)持久化到持久化設(shè)備的進(jìn)程,它在flush時(shí),除了要遵循LRU算法之外,還要通過(guò)LSN全局變量的比對(duì),來(lái)保證臟頁(yè)對(duì)應(yīng)的REDO記錄已經(jīng)flush到持久化設(shè)備了,如果發(fā)現(xiàn)還對(duì)應(yīng)的REDO沒(méi)有持久化,會(huì)觸發(fā)WAL writer去flush wal buffer。 (即確保日志比臟數(shù)據(jù)先落盤(pán))
當(dāng)用戶提交事務(wù)時(shí),也會(huì)產(chǎn)生一筆提交事務(wù)的REDO,這筆REDO也攜帶了LSN號(hào)。backend process 同樣需要等待對(duì)應(yīng)LSN flush到磁盤(pán)后才會(huì)返回給用戶提交成功的信號(hào)。(保證日志先落盤(pán),然后返回給用戶)
同步流復(fù)制,即保證standby節(jié)點(diǎn)和本地節(jié)點(diǎn)的日志雙雙落盤(pán)。
PostgreSQL使用另一組全局變量,記錄同步流復(fù)制節(jié)點(diǎn)已經(jīng)接收到的XLOG LSN,以及已經(jīng)持久化的XLOG LSN。
用戶在發(fā)起提交請(qǐng)求后,backend process除了要判斷本地wal有沒(méi)有持久化,同時(shí)還需要判斷同步流復(fù)制節(jié)點(diǎn)的XLOG有沒(méi)有接收到或持久化(通過(guò)synchronous_commit參數(shù)控制)。
如果同步流復(fù)制節(jié)點(diǎn)的XLOG還沒(méi)有接收或持久化,backend process會(huì)進(jìn)入等待狀態(tài)。
對(duì)應(yīng)的代碼和解釋如下:
CommitTransaction @ src/backend/access/transam/xact.c
RecordTransactionCommit @ src/backend/access/transam/xact.c
網(wǎng)友評(píng)論