原文地址:An Introduction to MySQL Replication: Exploring Different Types of MySQL Replication Solutions
在這篇博文中,我將深入介紹 MySQL 復制,回答它是什么、如何工作、它的優勢和挑戰,并回顧作為 MySQL 環境(特別是 Percona Server for MySQL)一部分的一些 MySQL 復制概念。最后,我還將澄清人們對復制的一些常見誤解,以及 Percona 可以提供哪些幫助。
什么是 MySQL 復制?
MySQL 復制是將主 MySQL 數據庫中的數據復制并發送到一個或多個輔助數據庫(稱為副本)的過程。
復制確保信息被復制并有目的地填充到另一個環境中,而不是只存儲在一個位置(基于源環境的事務)。
這樣做的目的是將基礎架構上的輔助服務器用于讀取或其他管理解決方案。下圖顯示了一個 MySQL 復制環境示例。
MySQL 復制安裝要求
在本節中,我們將介紹實施 MySQL 復制的基本要素:
前提條件和要求:
- Primary-Replica 配置: 確保有一個主 MySQL 數據庫和一個或多個副本 MySQL 數據庫。
- 網絡連接: 在主服務器和副本服務器之間建立可靠的網絡連接。
- MySQL 版本: 確保主服務器和副本服務器上的 MySQL 版本與復制兼容。
安裝 MySQL 復制 - 具體步驟:
- 備份數據: 在開始之前,創建主數據庫備份,以防止在設置過程中丟失數據。
- 配置主服務器:
- 編輯主服務器上的 MySQL 配置文件(my.cnf 或 my.ini),啟用二進制日志記錄。
- 重新啟動 MySQL 服務。
- 創建復制用戶:
- 登錄主服務器上的 MySQL,創建具有必要權限的專用復制用戶。
- 記錄二進制日志坐標:
- 記下當前二進制日志文件和主服務器上的位置。
- 配置復制服務器:
- 在每個副本服務器上,編輯 MySQL 配置文件,將其配置為副本。
- 將 server-id 設置為唯一值。
- 指定主服務器的主機名或 IP 地址。
- 在每個副本上重新啟動 MySQL 服務。
- 初始化復制:
- 在其中一個副本服務器上運行 CHANGE MASTER TO 命令,指定主服務器的二進制日志文件和位置。
- 啟動副本服務器的復制進程。
- 驗證復制:
- 使用 SHOW SLAVE STATUS 檢查復制的狀態。確保 "Slave_IO_Running "和 "Slave_SQL_Running "都顯示 “Yes”。
- 添加更多副本(可選):
- 如果需要,在其他副本服務器上重復配置步驟。
- 監控和維護:
- 定期監控復制狀態和日志。
- 執行日常維護和備份,確保數據完整性。
- 擴展和負載平衡(可選):
- 如果有多個副本,請實施負載平衡和故障切換機制。
MySQL 復制有哪些潛在優缺點?
MySQL復制可提供高可用性、負載平衡和數據冗余,從而提高系統可靠性。它還能實現地理分布式數據庫的災難恢復。不過,考慮潛在的缺點也很重要,包括管理副本的復雜性增加、復制滯后的可能性以及需要監控和維護以確保各副本的一致性和可靠性。
優點
MySQL 復制有很多優點,但其中幾個重點包括:通過將讀取密集型工作負載分布到多個副本、降低主數據庫服務器負載和提高整體性能來增強可擴展性。復制還能在主服務器不可用時切換到副本服務器,從而提高數據庫可用性。
最后,在發生災難的情況下,數據和數據庫可以快速恢復,因為復制提供了地理上分散的數據副本。
缺點
盡管有這么多好處,MySQL 復制也會面臨一些潛在的缺點。一個非常常見的問題是數據一致性,尤其是在寫入活動較多的設置中。副本可能會落后于主服務器,從而影響任何依賴實時數據的應用程序。
另一個問題是單點故障風險。如果主服務器出現故障,整個復制過程就會中斷。實施前面討論的故障轉移機制可以降低這種風險。
在安全性方面,如果沒有正確配置加密和訪問控制,主服務器和副本服務器之間傳輸的數據可能會受到攻擊。
MySQL 復制有哪些不同類型?
您實際上有幾種不同的選擇:
標準異步復制(Standard asynchronous replication)
異步復制意味著事務完全在本地環境中完成,不受復制本身的影響。
在完成更改后,主線程會將數據修改或實際語句填充到二進制日志中(基于行的復制和基于語句的復制之間的區別–稍后詳述)。轉儲線程讀取二進制日志,并將其發送給副本 IO 線程。副本使用其 IO 線程將其放入自己的預處理隊列(稱為中繼日志)。
副本使用 SQL 線程執行副本數據庫中的每次更改。
半同步復制(Semi-synchronous replication)
半同步復制是指副本和主服務器之間相互通信,以保證事務的正確傳輸。只有當其中一個副本確認事務已正確放入副本的一個中繼日志時,主服務器才會填充 binlog 并繼續其會話。
半同步復制能保證事務被正確復制,但不能保證在副本上的提交實際發生。
需要注意的是,半同步復制確保主服務器等待繼續處理特定會話中的事務,直到至少有一個副本 ACK 了事務接收(或超時)。這與異步復制不同,半同步復制允許額外的數據完整性。
請記住,半同步復制會影響性能,因為它需要等待副本實際 ACK 的往返。
組復制(Group Replication)
這一新概念在 MySQL 社區版 5.7 中引入,并在 MySQL 5.7.17 中得到認可。它是一個用于虛擬同步復制的全新插件。
每當在一個節點上執行事務時,插件都會嘗試與其他節點達成共識,然后再將完成的事務返回給客戶端。雖然該解決方案與標準的 MySQL 復制概念完全不同,但它基于使用 binlog 生成和處理日志事件。
以下是組復制的架構示例。
Percona XtraDB Cluster / Galera Cluster
另一種可將信息復制到其他節點的解決方案是 Percona XtraDB Cluster。該解決方案專注于提供一致性,還使用認證流程來保證事務避免沖突并正確執行。
在這種情況下,我們談論的是集群解決方案。每個環境都使用相同的數據,節點之間通過通信來保證一致性。
Percona XtraDB Cluster 有多個組件:
- 用于 MySQL 的 Percona 服務器
- Percona XtraBackup,用于執行運行集群的快照(如果要恢復或添加節點)。
- wsrep 修補程序/Galera 庫
該解決方案實際上是同步的,可與組復制(Group Replication)相媲美。不過,它還具有使用多主復制的功能。Percona XtraDB Cluster 等解決方案是提高數據庫基礎架構可用性的組成部分。
通過我們的電子書了解如何優化數據庫安裝配置以實現高可用性,Percona Distribution for PostgreSQL: High Availability With Streaming Replication
基于行的復制與基于語句的復制(Row-Based Replication Vs. Statement-Based Replication)
基于語句的復制
在基于語句的復制中,SQL 查詢本身被寫入二進制日志。例如,副本會執行完全相同的 INSERT/UPDATE/DELETE 語句。
這種系統有很多優缺點:
- 由于實際語句記錄在二進制日志中,因此審計數據庫更加容易
- 通過線路傳輸的數據更少
- 非確定性查詢(即那些其結果可能因多種因素而變化的查詢)可在副本環境中造成實際破壞
- 使用基于語句的復制(基于 SELECT 的 INSERT)進行某些查詢時,可能會出現性能劣勢
- 由于 SQL 的優化和執行,基于語句的復制速度較慢
基于行的復制
基于行的復制是從 MySQL 5.7.7 開始的默認選擇,它有很多優點。行更改會記錄在二進制日志中,而且不需要上下文信息。這消除了非確定性查詢的影響。
其他一些優勢包括
- 包含少量行更改的高并發查詢的性能提升
- 顯著提高數據一致性
當然,也有一些缺點:
- 如果有修改大量行的查詢,網絡流量會大大增加
- 更難審核數據庫中的更改
- 在某些情況下,基于行的復制可能比基于語句的復制更慢
處理故障和確保高可用性
確保 MySQL 復制的高可用性對于不間斷的數據庫訪問非常重要,有幾種策略可用于實現這一目標。其中一種方法是實施故障轉移(failover)機制。故障切換可確保在主 MySQL 服務器因硬件故障或其他問題而不可用時,系統無縫切換到備用副本。設置故障轉移機制可以使用負載平衡器或代理服務器來完成,它們會持續監控主服務器的健康狀況。一旦發現問題,這些工具就會自動將流量重定向到備用副本。
半同步復制是另一種在高可用性 MySQL 設置中確保數據一致性的重要技術。這種方法要求在主服務器上提交事務之前,至少要有一個副本確認,從而確保數據更改在主服務器上確認之前,安全地復制到至少一個副本。這就降低了主服務器發生故障時數據丟失的風險。通過優先考慮數據一致性而不是原始性能,半同步復制為防止數據差異提供了一個額外的保護層,使其成為對保持數據完整性至關重要的高可用性配置中的一項重要功能。
在我們的電子書中了解高可用性策略,Percona Distribution for MySQL: High Availability With Group Replication
解答關于復制的常見錯誤認識
1. 復制等同于集群。
標準異步復制不是同步群集。請記住,標準和半同步復制并不能保證環境服務于相同的數據集。使用 Percona XtraDB 集群時情況就不同了,在這種情況下,每臺服務器實際上都需要處理每項變更。否則,受影響的節點將從集群中刪除。異步復制沒有這種故障安全機制。在不一致狀態下,它仍然接受讀取。
2. 復制聽起來很不錯,我可以將其用作手動故障切換解決方案。
從理論上講,這些環境應具有可比性。但是,影響數據傳輸效率和一致性的參數有很多。只要使用異步復制,就無法保證事務正確進行。你可以通過提高配置的耐用性來規避這一問題,但這需要付出性能代價。您可以使用 pt-table-checksum
工具驗證主副本和副本的一致性。
3. 我有復制功能,所以實際上不需要備份。
復制是擁有數據集可訪問副本的一個很好的解決方案(例如,報告問題、讀取查詢、生成備份)。但這不是備份解決方案。異地備份可以確保在發生任何重大災難、用戶錯誤或其他原因時重建環境。有些人使用延遲復制。但是,即使是延遲復制也不能取代適當的災難恢復程序。
4. 我有復制功能,因此環境現在可以平衡事務的負載。
雖然通過使用同一數據集運行輔助實例,您可能已經提高了環境的可用性,但您仍可能需要將讀取查詢指向副本,而將寫入查詢指向主實例。您可以使用代理工具,或在自己的應用程序中定義此功能。
5. 復制會大大降低主系統的運行速度。
復制對主系統的性能影響很小。Peter Zaitsev 在此發表了一篇有趣的文章,討論了復制對主數據庫的潛在影響。請記住,寫入二進制日志可能會影響性能,尤其是在有大量小事務的情況下,這些事務會被多個副本轉儲和接收。
當然,還有許多其他參數可能會影響實際主服務器和副本的性能。
查看 MySQL 復制操作
為確保客戶滿意度并滿足需要高可用性(HA)和廣泛使用的應用程序的要求,必須仔細考慮數據庫架構和部署。這通常需要達到卓越的正常運行時間水平,例如令人羨慕的 “5 個 9”(99.999%)可用性。
要深入了解這一主題并探索 Percona 有關 HA 架構和部署的建議,我們誠邀您下載我們的白皮書。在白皮書中,您將看到旨在提供卓越可用性的解決方案的技術概述,該解決方案尤其適合涉及高讀寫應用的場景。
了解更多信息: 免費下載我們的白皮書《High Availability Solutions with Percona Distribution for MySQL》!
常見問題
什么是 MySQL 復制?
MySQL復制是將主MySQL數據庫中的數據復制并發送到一個或多個稱為副本的輔助數據庫的過程。
MySQL復制如何工作?
MySQL復制的工作原理是在主服務器的二進制日志中記錄數據變化,然后在副本服務器上重放這些變化,以保持同步。
為什么使用MySQL復制?
MySQL復制有多種用途,包括提高數據庫性能、為災難恢復提供數據冗余,以及分配數據庫負載以進行擴展。
MySQL復制有不同類型嗎?
MySQL復制有多種類型,包括異步復制和同步復制、基于語句的復制和基于行的復制,以及用于高可用性的組復制。
我可以在不同的 MySQL 版本之間進行復制嗎?
一般來說,最好在相同或兼容的 MySQL 版本之間進行復制,以確保兼容性和一致性。不過,在某些配置和預防措施下,可以進行一些有限的跨版本復制。