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