服務(wù)在運(yùn)行過(guò)程中存在很多意外情況,如:如服務(wù)器宕機(jī)、磁盤損壞、RAID卡損壞等。如何保證數(shù)據(jù)庫(kù)在服務(wù)發(fā)生意外的情況下數(shù)據(jù)不丟失呢?服務(wù)還能繼續(xù)提供服務(wù)呢?
我們一般通過(guò)備份的方式來(lái)解決數(shù)據(jù)丟失問(wèn)題,通過(guò)復(fù)制來(lái)解決MySQL的高可用問(wèn)題。
備份
備份的方法不同可以將備份分為:
- Hot Backup(熱備,在線備份):在數(shù)據(jù)運(yùn)行過(guò)程中進(jìn)行備份,對(duì)數(shù)據(jù)庫(kù)操作沒(méi)有影響。
- Cold Backup(冷備,離線備份):在數(shù)據(jù)停止情況下,直接拷貝數(shù)據(jù)庫(kù)物理文件。
- Warm Backup(溫備):在數(shù)據(jù)運(yùn)行過(guò)程中進(jìn)行,但是會(huì)對(duì)當(dāng)前數(shù)據(jù)庫(kù)的操作有所影響,如加一個(gè)全局讀鎖以保證備份數(shù)據(jù)的一致性。
按照備份后文件的內(nèi)容,備份又可以分為:
- 邏輯備份:是指?jìng)浞莩龅奈募?nèi)容是可讀的,一般是文本文件。內(nèi)容一般是由一條條SQL語(yǔ)句,或者是表內(nèi)實(shí)際數(shù)據(jù)組成。一般適用于數(shù)據(jù)庫(kù)的升級(jí)、遷移等工作。但其缺點(diǎn)是恢復(fù)所需要的時(shí)間往往較長(zhǎng)。
- 裸文件備份:是指復(fù)制數(shù)據(jù)庫(kù)的物理文件,既可以是在數(shù)據(jù)庫(kù)運(yùn)行中的復(fù)制(如ibbackup、xtrabackup這類工具),也可以是在數(shù)據(jù)庫(kù)停止運(yùn)行時(shí)直接的數(shù)據(jù)文件復(fù)制。這類備份的恢復(fù)時(shí)間往往較邏輯備份短很多。
若按照備份數(shù)據(jù)庫(kù)的內(nèi)容來(lái)分,備份又可以分為:
- 完全備份:完全備份是指對(duì)數(shù)據(jù)庫(kù)進(jìn)行一個(gè)完整的備份。
- 增量備份:增量備份是指在上次完全備份的基礎(chǔ)上,對(duì)于更改的數(shù)據(jù)進(jìn)行備份。
- 日志備份:日志備份主要是指對(duì)MySQL數(shù)據(jù)庫(kù)二進(jìn)制日志的備份,通過(guò)對(duì)一個(gè)完全備份進(jìn)行二進(jìn)制日志的重做(replay)來(lái)完成數(shù)據(jù)庫(kù)的point-in-time的恢復(fù)工作。
復(fù)制
復(fù)制(replication)是MySQL數(shù)據(jù)庫(kù)提供的一種高可用高性能的解決方案,一般用來(lái)建立大型的應(yīng)用,原理如下:

- 主服務(wù)器(master)把數(shù)據(jù)更改記錄到二進(jìn)制日志(binlog)中,然后通過(guò)
binary log dump線程將二進(jìn)制文件推送到從服務(wù)器。 - 從服務(wù)器(slave)通過(guò)I/O線程,把主服務(wù)器的二進(jìn)制日志復(fù)制到自己的中繼日志(relay log)中,中繼日志通常會(huì)位于os緩存中,所以中繼日志的開(kāi)銷很小。
- 從服務(wù)器通過(guò)SQL線程重做中繼日志中的日志,把更改應(yīng)用到自己的數(shù)據(jù)庫(kù)上,以達(dá)到數(shù)據(jù)的最終一致性。
從服務(wù)器有2個(gè)線程,一個(gè)是I/O線程,負(fù)責(zé)讀取主服務(wù)器的二進(jìn)制日志,并將其保存為中繼日志;另一個(gè)是SQL線程,復(fù)制執(zhí)行中繼日志。這里需要特別注意的是,復(fù)制是一個(gè)異步過(guò)程,從服務(wù)器數(shù)據(jù)存在延遲。
MySQL二進(jìn)制日志文件Binlog有三種格式,Statement、Row和Mixed,所以MySQL的復(fù)制也對(duì)應(yīng)有三種方式。
異步復(fù)制

主庫(kù)執(zhí)行完Commit后,在主庫(kù)寫入Binlog日志后即可成功返回客戶端,無(wú)需等Binlog日志傳送給從庫(kù)。
半同步復(fù)制

在 MySQL5.5之前,MySQL的復(fù)制是異步操作,主庫(kù)和從庫(kù)的數(shù)據(jù)之間存在一定的延遲,這樣存在一個(gè)隱患:當(dāng)在主庫(kù)上寫人一個(gè)事務(wù)并提交成功,而從庫(kù)尚未得到主庫(kù)推送的Binlog日志時(shí),主庫(kù)宕機(jī)了,例如主庫(kù)可能因磁盤損壞、內(nèi)存故障等造成主庫(kù)上該事務(wù) Binlog丟失,此時(shí)從庫(kù)就可能損失這個(gè)事務(wù),從而造成主從不一致。
而半同步復(fù)制,是等待其中一個(gè)從庫(kù)也接收到Binlog事務(wù)并成功寫入Relay Log之后,才返回Commit操作成功給客戶端;如此半同步就保證了事務(wù)成功提交后至少有兩份日志記錄,一份在主庫(kù)Binlog上,另一份在從庫(kù)的Relay Log上,從而進(jìn)一步保證數(shù)據(jù)完整性;半同步復(fù)制很大程度取決于主從網(wǎng)絡(luò)RTT(往返時(shí)延),以插件 semisync_master/semisync_slave 形式存在。
集群
使用集群可以提高M(jìn)ySQL服務(wù)器的可用性和性能,MySQL服務(wù)支持多種集群方案。
MySQL Cluster
由Mysql本身提供,優(yōu)勢(shì):可用性非常高,性能非常好。每份數(shù)據(jù)至少可在不同主機(jī)存一份拷貝,且冗余數(shù)據(jù)拷貝實(shí)時(shí)同步。但它的維護(hù)非常復(fù)雜,存在部分Bug,目前還不適合比較核心的線上系統(tǒng),所以不推薦。
DRBD磁盤網(wǎng)絡(luò)鏡像
Distributed Replicated Block Device,其實(shí)現(xiàn)方式是通過(guò)網(wǎng)絡(luò)來(lái)鏡像整個(gè)設(shè)備(磁盤)。它允許用戶在遠(yuǎn)程機(jī)器上建立一個(gè)本地塊設(shè)備的實(shí)時(shí)鏡像,與心跳鏈接結(jié)合使用,也可看做一種網(wǎng)絡(luò)RAID。
優(yōu)勢(shì):軟件功能強(qiáng)大,數(shù)據(jù)可在底層快設(shè)備級(jí)別跨物理主機(jī)鏡像,且可根據(jù)性能和可靠性要求配置不同級(jí)別的同步。IO操作保持順序,可滿足數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)一致性的苛刻要求。
但非分布式文件系統(tǒng)環(huán)境無(wú)法支持鏡像數(shù)據(jù)同時(shí)可見(jiàn),性能和可靠性兩者相互矛盾,無(wú)法適用于性能和可靠性要求都比較苛刻的環(huán)境,維護(hù)成本高于MySQL Replication。另外,DRBD也是官方推薦的可用于MySQL高可用方案之一,所以這個(gè)大家可根據(jù)實(shí)際環(huán)境來(lái)考慮是否部署。
MySQL Replication
MySQL的復(fù)制上在實(shí)際應(yīng)用場(chǎng)景中使用最多的一種方案,主要優(yōu)勢(shì)是成本低,實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,缺點(diǎn)是從服務(wù)器存在一定的延遲。
常用架構(gòu)
一主多從,提高系統(tǒng)的讀性能

一主一從和一主多從是最常見(jiàn)的主從架構(gòu),實(shí)施起來(lái)簡(jiǎn)單并且有效,主要用來(lái)實(shí)現(xiàn)讀寫分離,提升度的性能,降低主庫(kù)壓力,在主庫(kù)出現(xiàn)異常宕機(jī)的情況下,可以把一個(gè)從庫(kù)切換為主庫(kù)繼續(xù)提供服務(wù)。
多級(jí)復(fù)制

MySQL的復(fù)制是主庫(kù)推送Binlog到從庫(kù),在上面一主多從的情況下,主庫(kù)的I/O和網(wǎng)絡(luò)壓力都會(huì)隨著從庫(kù)的增加而增大。多級(jí)而使用多級(jí)復(fù)制可以很好的解決這個(gè)問(wèn)題,但是隨著從庫(kù)的鏈路的增加從庫(kù)的數(shù)據(jù)延遲也會(huì)隨著增大。
雙主復(fù)制/Dual Master

其實(shí)就是master1和master2互為主從關(guān)系,這樣任何一方所做的變更,都會(huì)通過(guò)復(fù)制應(yīng)用到另外一方的數(shù)據(jù)庫(kù)中。client客戶端的寫請(qǐng)求都訪問(wèn)主庫(kù) Master1,而讀請(qǐng)求可以選擇訪問(wèn)主庫(kù)Master1或 Master2。
雙主多級(jí)復(fù)制架構(gòu)

雙主復(fù)制還能和主從復(fù)制聯(lián)合起來(lái)使用,在 Master2庫(kù)下配置從庫(kù) Slave1、 Slave2等,這樣即可通過(guò)從庫(kù)Slave等來(lái)分擔(dān)讀取壓力。