數(shù)據(jù)庫系統(tǒng)中何時使用預寫式日志和邏輯復制
建議將預寫日志 (WAL) 與復制結(jié)合在混合一致性模型中,以實現(xiàn)需要容錯能力的彈性系統(tǒng)。
譯自Here’s When To Use Write-Ahead Log and Logical Replication in Database Systems,作者 Raja Chattopadhyay。
在數(shù)據(jù)庫復制方面,兩種廣泛使用的方法是預寫式日志 (WAL) 和邏輯復制。這些技術對于維護數(shù)據(jù)可用性、促進災難恢復和擴展數(shù)據(jù)庫系統(tǒng)至關重要。由于結(jié)構(gòu)、功能和實際應用的不同,需要不同的策略來掌握它們的優(yōu)點和局限性。
預寫式日志 (WAL)
預寫式日志 (WAL) 這種方法通常用于數(shù)據(jù)庫系統(tǒng)中,例如PostgreSQL。它涉及利用存儲在 WAL 文件中的修改流,將數(shù)據(jù)從數(shù)據(jù)庫復制到一個或多個輔助副本。以下是它的分解方式:
在 WAL 中,主數(shù)據(jù)庫通過在數(shù)據(jù)文件中最終確定所有更改之前將其記錄到其預寫式日志 (WAL) 文件中來保證持久性。然后,輔助副本從服務器獲取這些 WAL 文件,并按順序?qū)⑵鋺玫剿鼈冏约旱臄?shù)據(jù)文件中。這種復制技術需要輔助服務器之間的異步通信,以維護整個系統(tǒng)中數(shù)據(jù)的一致性和可靠性。
WAL 通過從數(shù)據(jù)庫的事務日志中復制更改來維護數(shù)據(jù)完整性和一致性。此過程確保復制的數(shù)據(jù)與數(shù)據(jù)保持同步,從而確保整個過程的完整性。此外,WAL 支持時間點恢復,允許備用服務器重放特定時間段的 WAL 文件,從而在發(fā)生故障或數(shù)據(jù)損壞時實現(xiàn)恢復。在主服務器不可用的故障轉(zhuǎn)移事件中,WAL 通過使用最新的 WAL 文件提升備用服務器成為新的主服務器,從而實現(xiàn)轉(zhuǎn)換,以持續(xù)運行。
WAL 通過復制主數(shù)據(jù)庫事務日志中的更改來維護數(shù)據(jù)完整性和一致性,從而在復制期間保持數(shù)據(jù)完整性。此方法還會影響數(shù)據(jù)庫的性能,因為更改首先記錄在 WAL 文件中,然后才應用到數(shù)據(jù)文件中。這種方法允許主數(shù)據(jù)庫高效運行并在負載下寫入。此外,WAL 非常適合災難恢復場景,因為備用服務器會不斷更新數(shù)據(jù)庫中的更改,確保它們是最新的,并準備好在服務器故障時接管。確保數(shù)據(jù)庫系統(tǒng)的可靠備份計劃可保證災難恢復措施。
在使用 WAL 時,為了使復制有效,必須意識到一些缺點。有時,由于網(wǎng)絡延遲或高活動級別,備用副本落后于服務器時,可能會發(fā)生復制滯后。此滯后會導致備用服務器上的數(shù)據(jù)出現(xiàn)差異,從而影響數(shù)據(jù)一致性。此外,在某些情況下,可能需要手動步驟將服務器指定為新的主服務器。此手動過程可能會導致延遲。它需要參與,可能會延長恢復操作所需的時間。
邏輯復制
另一方面,邏輯復制是一種用于 PostgreSQL、MySQL 和MongoDB等數(shù)據(jù)庫系統(tǒng)中的技術。它在復制 SQL 語句或數(shù)據(jù)修改的級別上運行。與在字節(jié)級別復制更改的 WAL 不同,邏輯復制提供了一種同步數(shù)據(jù)的方法。此方法由于其設計和功能而具有不同的優(yōu)點和挑戰(zhàn)。
在復制中,主數(shù)據(jù)庫將一組更改(可能包括 SQL 語句或行修改)發(fā)送到副本服務器。這些更改集通常通過副本服務器之間的復制連接傳輸。在收到這些更改集后,副本服務器通過執(zhí)行 SQL 語句或應用修改將其實現(xiàn)到它們的數(shù)據(jù)集中。此方法允許備份服務器通過鏡像其數(shù)據(jù)集中的更改來保持與數(shù)據(jù)庫的更新。邏輯復制通常在發(fā)布者向訂閱者分發(fā)更改的模型上運行,從而實現(xiàn)復制設置和可擴展性選項。
與 WAL 等方法相比,邏輯復制提供了優(yōu)勢。首先,它提供復制的優(yōu)勢,允許復制表或數(shù)據(jù)庫,而不是所有更改,從而提高了靈活性和效率。其次,它啟用復制,便于跨數(shù)據(jù)庫類型進行同步,這在擁有不同系統(tǒng)的環(huán)境中特別有用。此外,邏輯復制授予對復制行為的控制,包括沖突解決和數(shù)據(jù)轉(zhuǎn)換,從而實現(xiàn)準確的數(shù)據(jù)同步管理。根據(jù)設置的不同,邏輯復制可以異步或同步地運行,從而提供根據(jù)要求優(yōu)先考慮性能或數(shù)據(jù)一致性的選項。這些功能使復制成為在分布式系統(tǒng)中維護同步數(shù)據(jù)的有力工具。
邏輯復制通過允許管理員選擇要復制哪些數(shù)據(jù)以便進行有針對性的同步,為管理員提供了靈活性。此功能通過復制數(shù)據(jù)表或數(shù)據(jù)庫并減少不必要的工作負載來簡化此過程。此外,它對復制的支持促進了數(shù)據(jù)庫類型之間的同步——促進了組織內(nèi)各種系統(tǒng)之間無縫的數(shù)據(jù)遷移和集成。此外,通過復制過程中的數(shù)據(jù)轉(zhuǎn)換,邏輯復制允許在必要時進行格式調(diào)整或數(shù)據(jù)清理。此功能可確保信息在系統(tǒng)中保持統(tǒng)一和兼容,從而提高數(shù)據(jù)質(zhì)量和可用性。
雖然邏輯復制提供了好處,它也帶來了它的挑戰(zhàn)。首先,它通常需要與 WAL 等方法相比的資源。解析和執(zhí)行 SQL 命令的過程可能會給系統(tǒng)性能帶來壓力。此外,如果復制過程因事務負載或網(wǎng)絡延遲而落后,則存在數(shù)據(jù)不一致的可能性,這可能導致主數(shù)據(jù)庫和備份數(shù)據(jù)庫之間出現(xiàn)差異。配置和管理復制設置可能比使用 WAL 等方法更復雜。這種復雜性需要進行規(guī)劃和監(jiān)視,以確保復制系統(tǒng)運行。
比較 WAL 和邏輯復制
WAL 通常由于其成本而更受青睞,因為它以字節(jié)級復制更改,這更有效率。另一方面,邏輯復制在處理大量數(shù)據(jù)量或復雜 SQL 命令時可能會導致費用。這種成本的增加可歸因于分析和處理 SQL 命令的必要性,在進行大量數(shù)據(jù)修改或使用復雜查詢的情況下,這會消耗資源。
數(shù)據(jù)一致性
WAL 通過復制事務日志中的更改來保證數(shù)據(jù)一致性,確保副本與主數(shù)據(jù)庫保持同步。相比之下,邏輯復制可能會出現(xiàn)一致性問題,主要是由于復制來自數(shù)據(jù)庫的更改時有延遲。這可能會導致主數(shù)據(jù)庫上更改的時間與副本上反映更改的時間之間存在時間差,從而可能導致兩個數(shù)據(jù)庫之間出現(xiàn)差異。即便如此,一旦復制趕上,數(shù)據(jù)一致性將重新建立。
靈活度
邏輯復制以其適應性和靈活性而聞名,它能夠選擇復制哪些數(shù)據(jù)并支持環(huán)境類型。通過復制,管理員可以根據(jù)自己的要求選擇表或數(shù)據(jù)庫進行復制,自定義同步。此外,它允許在數(shù)據(jù)庫類型之間進行復制,簡化了跨平臺的數(shù)據(jù)遷移和系統(tǒng)集成的過程。另一方面,WAL 遵循數(shù)據(jù)復制方法。它以字節(jié)級別復制所有更改,而無法選擇性地復制數(shù)據(jù)元素。此外,它需要在備用服務器上使用數(shù)據(jù)庫引擎,這限制了它在混合數(shù)據(jù)庫技術環(huán)境中的效率。
AWS RDS PostgreSQL 的主動-主動復制擴展
Amazon RDS 上適用于 PostgreSQL 的 PGActive Active Active 復制擴展允許多個 RDS 實例同時處理讀寫操作,通過復制和沖突解決技術確保數(shù)據(jù)一致性。此擴展允許管理員選擇性地復制數(shù)據(jù)和支持環(huán)境,以及針對 Amazon RDS 上 PostgreSQL 數(shù)據(jù)庫的可用性和可擴展性,提供自動故障轉(zhuǎn)移和負載均衡功能。
結(jié)論
預寫日志 (WAL) 和邏輯復制在實現(xiàn)數(shù)據(jù)庫系統(tǒng)中的可用性、災難恢復和可擴展性方面發(fā)揮著作用。WAL非常適合優(yōu)先考慮數(shù)據(jù)一致性且對性能有影響的場景,例如災難恢復設置。另一方面,邏輯復制提供了對復制行為的靈活性與控制,使其非常適合具有不同需求的復雜環(huán)境。
架構(gòu)師和管理員必須了解差異,才能設計出有彈性的數(shù)據(jù)庫復制設置。建議將預寫日志 (WAL) 與復制結(jié)合起來,在混合一致性模型中,這適用于需要容錯的高彈性系統(tǒng)。