服務在運行過程中存在很多意外情況,如:如服務器宕機、磁盤損壞、RAID卡損壞等。如何保證數據庫在服務發生意外的情況下數據不丟失呢?服務還能繼續提供服務呢?
我們一般通過備份的方式來解決數據丟失問題,通過複製來解決MySQL的高可用問題。
備份
備份的方法不同可以將備份分爲:
- Hot Backup(熱備,在線備份):在數據運行過程中進行備份,對數據庫操作沒有影響。
- Cold Backup(冷備,離線備份):在數據停止情況下,直接拷貝數據庫物理文件。
- Warm Backup(溫備):在數據運行過程中進行,但是會對當前數據庫的操作有所影響,如加一個全局讀鎖以保證備份數據的一致性。
按照備份後文件的內容,備份又可以分爲:
- 邏輯備份:是指備份出的文件內容是可讀的,一般是文本文件。內容一般是由一條條SQL語句,或者是表內實際數據組成。一般適用於數據庫的升級、遷移等工作。但其缺點是恢復所需要的時間往往較長。
- 裸文件備份:是指複製數據庫的物理文件,既可以是在數據庫運行中的複製(如ibbackup、xtrabackup這類工具),也可以是在數據庫停止運行時直接的數據文件複製。這類備份的恢復時間往往較邏輯備份短很多。
若按照備份數據庫的內容來分,備份又可以分爲:
- 完全備份:完全備份是指對數據庫進行一個完整的備份。
- 增量備份:增量備份是指在上次完全備份的基礎上,對於更改的數據進行備份。
- 日誌備份:日誌備份主要是指對MySQL數據庫二進制日誌的備份,通過對一個完全備份進行二進制日誌的重做(replay)來完成數據庫的point-in-time的恢復工作。
複製
複製(replication)是MySQL數據庫提供的一種高可用高性能的解決方案,一般用來建立大型的應用,原理如下:
- 主服務器(master)把數據更改記錄到二進制日誌(binlog)中,然後通過
binary log dump
線程將二進制文件推送到從服務器。 - 從服務器(slave)通過I/O線程,把主服務器的二進制日誌複製到自己的中繼日誌(relay log)中,中繼日誌通常會位於os緩存中,所以中繼日誌的開銷很小。
- 從服務器通過SQL線程重做中繼日誌中的日誌,把更改應用到自己的數據庫上,以達到數據的最終一致性。
從服務器有2個線程,一個是I/O線程,負責讀取主服務器的二進制日誌,並將其保存爲中繼日誌;另一個是SQL線程,複製執行中繼日誌。這裏需要特別注意的是,複製是一個異步過程,從服務器數據存在延遲。
MySQL二進制日誌文件Binlog有三種格式,Statement
、Row
和Mixed
,所以MySQL的複製也對應有三種方式。
異步複製
主庫執行完Commit後,在主庫寫入Binlog日誌後即可成功返回客戶端,無需等Binlog日誌傳送給從庫。
半同步複製
在 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的複製是主庫推送Binlog到從庫,在上面一主多從的情況下,主庫的I/O和網絡壓力都會隨着從庫的增加而增大。多級而使用多級複製可以很好的解決這個問題,但是隨着從庫的鏈路的增加從庫的數據延遲也會隨着增大。
雙主複製/Dual Master
其實就是master1和master2互爲主從關係,這樣任何一方所做的變更,都會通過複製應用到另外一方的數據庫中。client客戶端的寫請求都訪問主庫 Master1,而讀請求可以選擇訪問主庫Master1或 Master2。
雙主多級複製架構
雙主複製還能和主從複製聯合起來使用,在 Master2庫下配置從庫 Slave1、 Slave2等,這樣即可通過從庫Slave等來分擔讀取壓力。