前言:服務在運行過程當中存在不少意外狀況,如:如服務器宕機、磁盤損壞、RAID卡損壞等。如何保證數據庫在服務發生意外的狀況下數據不丟失呢?服務還能繼續提供服務呢?sql
咱們通常經過備份的方式來解決數據丟失問題,經過複製來解決MySQL的高可用問題。數據庫
備份的方法不一樣能夠將備份分爲:緩存
按照備份後文件的內容,備份又能夠分爲:服務器
若按照備份數據庫的內容來分,備份又能夠分爲:網絡
複製(replication)是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的複製也對應有三種方式。
主庫執行完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庫下配置從庫 Slave一、 Slave2等,這樣便可經過從庫Slave等來分擔讀取壓力。
第一次寫MySQL高可用化的文章,不足之處,歡迎指出。
原文連接:https://blog.csdn.net/xiaolyuh123/article/details/105972412