天天看點

雲資料庫高可用—— Series1:MySQL主從複制原理背景

本文始發于:雲栖社群

時間:2020-06-01

原文連結:

https://yq.aliyun.com/articles/763185

1 引言

高可用是系統架構設計中必須考慮的因素之一,主要目标是消除基礎架構中的單點故障,通常表示為一個百分比,表示在給定時間段内特定系統或元件的正常運作時間,其中100%表示系統永不失效。而任何的單機系統因受限于軟硬體的限制,如硬體損壞、作業系統崩潰、軟體BUG、業務壓力過大等原因,都不可能保證系統100%可用。一旦出現此類問題,如何能快速恢複使用者業務,将影響程度減至最低,降低故障RTO(Recovery Time Objective,恢複時間目标)成為我們所要考慮的問題。

對于資料庫系統來說,比較通用的解決方案是将單機程式部署在多台主機上,組成一個叢集共同對外提供服務。在MySQL中,最常見的一種部署方式為主從複制,這種部署方式一方面滿足了故障恢複的場景,又能夠在一定程式上分擔主庫的壓力,做到了業務的讀寫分離。相較于Oracle的RAC(real application clusters,實時應用叢集)來講,一不需要共享存儲,二不需要記憶體同步,也無需VIP(Virtual IP Address,虛拟IP位址)。是以MySQL的主從部署更為便捷,實作原理也簡單。本文将對MySQL主從複制的實作原理進行介紹。

2 一主一從複制實作原理

在資料庫實作技術中,最基本的、必須要滿足的一個特性便是ACID,即事務的原子性(Atomicity)、一緻性(Consistency)、隔離性(Isolation)、持久性(Durability)。為了實作ACID,MySQL引入了Binlog(二進制日志),資料庫中所有的DML、DDL語句都将記錄在Binlog當中。如使用者在主庫上執行了一條update語句,那麼在Binlog中便會記錄這條update語句,這樣就可以使用Binlog來進行執行個體間的資料同步,Binlog也成為MySQL主從複制的實作基礎,能夠達到增量資料同步的目的,具體實作原理如下圖所示。

雲資料庫高可用—— Series1:MySQL主從複制原理背景

圖1:MySQL一主一從複制實作原理圖

  • 主庫所有的DML、DDL操作語句記錄到Binlog日志中。
  • 從庫中的IO線程會實時捕獲主庫中Binlog的變化内容,并寫到從庫的中繼日志Relay log裡。Relay log會持久化到本地檔案中。
  • 從庫中的SQL線程負責從Relay log日志裡取出Binlog内容,并把所有的語句按先後順序在從庫中執行一遍,這樣就實作了主從間資料的一緻性。

以上便是MySQL主從庫實作增量資料同步的步驟和原理。

3 一主一從部署

在實際部署過程中,需要先做全量資料的同步,保證從庫中存在與主庫相同的基礎資料,然後再進行增量同步。一般使用資料庫全庫的備份恢複來做主從間的全量同步,即先在主庫上做一次全量備份,然後把備份傳到從庫中進行全量恢複。這裡會有一個問題,主庫不會一直是靜止狀态,資料備份和恢複需要一定的時間,這個時間長短完全取決于資料量的大小以及主從間的傳輸帶寬,從庫執行完全量恢複後可能已經落後主庫一段時間,這段時間的增量資料就需要Binlog來追。是以在從庫上需要執行一個change master的指令來告訴從庫需要從哪個位置來同步主庫的Binlog日志,同時從庫上會啟動IO線程和SQL線程,IO線程從指定位置開始讀取Binlog,SQL線程用來回放日志。當從庫追平主庫時,便完成了主從部署和搭建。

以上便是MySQL基于Binlog進行主從複制的相關内容,不過這種機制是100%可靠的麼?會不會有例外情況?讀者可思考一下,

下期

我們将繼續進行介紹。

後續内容

雲資料庫高可用——Series2:MySQL如何保證主從一緻

作者:張西來

阿裡雲智能GTS-SRE團隊技術服務經理

曾就職于某國産資料庫廠商,有10多年資料庫技術支援工作經驗,精通多款資料庫産品,為國内多個大中銀行核心資料庫提供技術支援。目前就職于阿裡雲智能GTS-SRE團隊,負責雲資料庫的高效運維和管理工作。

我們是阿裡雲智能全球技術服務-SRE團隊,我們緻力成為一個以技術為基礎、面向服務、保障業務系統高可用的工程師團隊;提供專業、體系化的SRE服務,幫助廣大客戶更好地使用雲、基于雲建構更加穩定可靠的業務系統,提升業務穩定性。我們期望能夠分享更多幫助企業客戶上雲、用好雲,讓客戶雲上業務運作更加穩定可靠的技術,您可用釘釘掃描下方二維碼,加入阿裡雲SRE技術學院釘釘圈子,和更多雲上人交流關于雲平台的那些事。

雲資料庫高可用—— Series1:MySQL主從複制原理背景