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