天天看點

MySQL高可用化

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

我們一般通過備份的方式來解決資料丢失問題,通過複制來解決MySQL的高可用問題。

備份

備份的方法不同可以将備份分為:

  • Hot Backup(熱備,線上備份):在資料運作過程中進行備份,對資料庫操作沒有影響。
  • Cold Backup(冷備,離線備份):在資料停止情況下,直接拷貝資料庫實體檔案。
  • Warm Backup(溫備):在資料運作過程中進行,但是會對目前資料庫的操作有所影響,如加一個全局讀鎖以保證備份資料的一緻性。

按照備份後檔案的内容,備份又可以分為:

  • 邏輯備份:是指備份出的檔案内容是可讀的,一般是文本檔案。内容一般是由一條條SQL語句,或者是表内實際資料組成。一般适用于資料庫的更新、遷移等工作。但其缺點是恢複所需要的時間往往較長。
  • 裸檔案備份:是指複制資料庫的實體檔案,既可以是在資料庫運作中的複制(如ibbackup、xtrabackup這類工具),也可以是在資料庫停止運作時直接的資料檔案複制。這類備份的恢複時間往往較邏輯備份短很多。

若按照備份資料庫的内容來分,備份又可以分為:

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

複制

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

MySQL高可用化
  1. 主伺服器(master)把資料更改記錄到二進制日志(binlog)中,然後通過​

    ​binary log dump​

    ​線程将二進制檔案推送到從伺服器。
  2. 從伺服器(slave)通過I/O線程,把主伺服器的二進制日志複制到自己的中繼日志(relay log)中,中繼日志通常會位于os緩存中,是以中繼日志的開銷很小。
  3. 從伺服器通過SQL線程重做中繼日志中的日志,把更改應用到自己的資料庫上,以達到資料的最終一緻性。

從伺服器有2個線程,一個是I/O線程,負責讀取主伺服器的二進制日志,并将其儲存為中繼日志;另一個是SQL線程,複制執行中繼日志。這裡需要特别注意的是,複制是一個異步過程,從伺服器資料存在延遲。

MySQL二進制日志檔案Binlog有三種格式,​

​Statement​

​​、​

​Row​

​​和​

​Mixed​

​,是以MySQL的複制也對應有三種方式。

異步複制

MySQL高可用化

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

半同步複制

MySQL高可用化

在 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的複制上在實際應用場景中使用最多的一種方案,主要優勢是成本低,實作起來比較簡單,缺點是從伺服器存在一定的延遲。

常用架構

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

MySQL高可用化

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

多級複制

MySQL高可用化

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

雙主複制/Dual Master

MySQL高可用化

其實就是master1和master2互為主從關系,這樣任何一方所做的變更,都會通過複制應用到另外一方的資料庫中。client用戶端的寫請求都通路主庫 Master1,而讀請求可以選擇通路主庫Master1或 Master2。

雙主多級複制架構

繼續閱讀