MySQL高可用化

服務在運行過程中存在很多意外情況,如:如服務器宕機、磁盤損壞、RAID卡損壞等。如何保證數據庫在服務發生意外的情況下數據不丟失呢?服務還能繼續提供服務呢?

我們一般通過備份的方式來解決數據丟失問題,通過複製來解決MySQL的高可用問題。

備份

備份的方法不同可以將備份分爲:

  • Hot Backup(熱備,在線備份):在數據運行過程中進行備份,對數據庫操作沒有影響。
  • Cold Backup(冷備,離線備份):在數據停止情況下,直接拷貝數據庫物理文件。
  • Warm Backup(溫備):在數據運行過程中進行,但是會對當前數據庫的操作有所影響,如加一個全局讀鎖以保證備份數據的一致性。

按照備份後文件的內容,備份又可以分爲:

  • 邏輯備份:是指備份出的文件內容是可讀的,一般是文本文件。內容一般是由一條條SQL語句,或者是表內實際數據組成。一般適用於數據庫的升級、遷移等工作。但其缺點是恢復所需要的時間往往較長。
  • 裸文件備份:是指複製數據庫的物理文件,既可以是在數據庫運行中的複製(如ibbackup、xtrabackup這類工具),也可以是在數據庫停止運行時直接的數據文件複製。這類備份的恢復時間往往較邏輯備份短很多。

若按照備份數據庫的內容來分,備份又可以分爲:

  • 完全備份:完全備份是指對數據庫進行一個完整的備份。
  • 增量備份:增量備份是指在上次完全備份的基礎上,對於更改的數據進行備份。
  • 日誌備份:日誌備份主要是指對MySQL數據庫二進制日誌的備份,通過對一個完全備份進行二進制日誌的重做(replay)來完成數據庫的point-in-time的恢復工作。

複製

複製(replication)是MySQL數據庫提供的一種高可用高性能的解決方案,一般用來建立大型的應用,原理如下:

image.png

  1. 主服務器(master)把數據更改記錄到二進制日誌(binlog)中,然後通過binary log dump線程將二進制文件推送到從服務器。
  2. 從服務器(slave)通過I/O線程,把主服務器的二進制日誌複製到自己的中繼日誌(relay log)中,中繼日誌通常會位於os緩存中,所以中繼日誌的開銷很小。
  3. 從服務器通過SQL線程重做中繼日誌中的日誌,把更改應用到自己的數據庫上,以達到數據的最終一致性。

從服務器有2個線程,一個是I/O線程,負責讀取主服務器的二進制日誌,並將其保存爲中繼日誌;另一個是SQL線程,複製執行中繼日誌。這裏需要特別注意的是,複製是一個異步過程,從服務器數據存在延遲

MySQL二進制日誌文件Binlog有三種格式,StatementRowMixed,所以MySQL的複製也對應有三種方式。

異步複製

image.png

主庫執行完Commit後,在主庫寫入Binlog日誌後即可成功返回客戶端,無需等Binlog日誌傳送給從庫。

半同步複製

image.png

在 MySQL5.5之前,MySQL的複製是異步操作,主庫和從庫的數據之間存在一定的延遲,這樣存在一個隱患:當在主庫上寫人一個事務並提交成功,而從庫尚未得到主庫推送的Binlog日誌時,主庫宕機了,例如主庫可能因磁盤損壞、內存故障等造成主庫上該事務 Binlog丟失,此時從庫就可能損失這個事務,從而造成主從不一致。

而半同步複製,是等待其中一個從庫也接收到Binlog事務併成功寫入Relay Log之後,才返回Commit操作成功給客戶端;如此半同步就保證了事務成功提交後至少有兩份日誌記錄,一份在主庫Binlog上,另一份在從庫的Relay Log上,從而進一步保證數據完整性;半同步複製很大程度取決於主從網絡RTT(往返時延),以插件 semisync_master/semisync_slave 形式存在。

集羣

使用集羣可以提高MySQL服務器的可用性和性能,MySQL服務支持多種集羣方案。

MySQL Cluster

由Mysql本身提供,優勢:可用性非常高,性能非常好。每份數據至少可在不同主機存一份拷貝,且冗餘數據拷貝實時同步。但它的維護非常複雜,存在部分Bug,目前還不適合比較核心的線上系統,所以不推薦。

DRBD磁盤網絡鏡像

Distributed Replicated Block Device,其實現方式是通過網絡來鏡像整個設備(磁盤)。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像,與心跳鏈接結合使用,也可看做一種網絡RAID。

優勢:軟件功能強大,數據可在底層快設備級別跨物理主機鏡像,且可根據性能和可靠性要求配置不同級別的同步。IO操作保持順序,可滿足數據庫對數據一致性的苛刻要求。

但非分佈式文件系統環境無法支持鏡像數據同時可見,性能和可靠性兩者相互矛盾,無法適用於性能和可靠性要求都比較苛刻的環境,維護成本高於MySQL Replication。另外,DRBD也是官方推薦的可用於MySQL高可用方案之一,所以這個大家可根據實際環境來考慮是否部署。

MySQL Replication

MySQL的複製上在實際應用場景中使用最多的一種方案,主要優勢是成本低,實現起來比較簡單,缺點是從服務器存在一定的延遲。

常用架構

一主多從,提高系統的讀性能

image.png

一主一從和一主多從是最常見的主從架構,實施起來簡單並且有效,主要用來實現讀寫分離,提升度的性能,降低主庫壓力,在主庫出現異常宕機的情況下,可以把一個從庫切換爲主庫繼續提供服務。

多級複製

image.png

MySQL的複製是主庫推送Binlog到從庫,在上面一主多從的情況下,主庫的I/O和網絡壓力都會隨着從庫的增加而增大。多級而使用多級複製可以很好的解決這個問題,但是隨着從庫的鏈路的增加從庫的數據延遲也會隨着增大。

雙主複製/Dual Master

image.png

其實就是master1和master2互爲主從關係,這樣任何一方所做的變更,都會通過複製應用到另外一方的數據庫中。client客戶端的寫請求都訪問主庫 Master1,而讀請求可以選擇訪問主庫Master1或 Master2。

雙主多級複製架構

image.png

雙主複製還能和主從複製聯合起來使用,在 Master2庫下配置從庫 Slave1、 Slave2等,這樣即可通過從庫Slave等來分擔讀取壓力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章