title: Mysql數(shù)據(jù)庫主從復(fù)制學(xué)習(xí)筆記
date: 2018-11-02 15:26:15
tags:
- Mysql
- 主從復(fù)制
- 學(xué)習(xí)筆記
Mysql數(shù)據(jù)庫主從復(fù)制學(xué)習(xí)筆記
概述
- 主從復(fù)制是指一臺(tái)服務(wù)器充當(dāng)主數(shù)據(jù)庫服務(wù)器,另一臺(tái)或多臺(tái)服務(wù)器充當(dāng)從數(shù)據(jù)庫服務(wù)器,主服務(wù)器中的數(shù)據(jù)自動(dòng)復(fù)制到從服務(wù)器中。
- Mysql主從復(fù)制的基礎(chǔ)是主服務(wù)器對(duì)數(shù)據(jù)庫修改記錄二進(jìn)制日志,從服務(wù)器通過主服務(wù)器的二進(jìn)制日志自動(dòng)執(zhí)行更新。
- Mysql使用主從復(fù)制,可以作為一種熱備份,還可以用來做讀寫分離,均衡數(shù)據(jù)庫負(fù)載。
- Mysql主從復(fù)制解決了數(shù)據(jù)分布、負(fù)載均衡、備份、高可用性和容錯(cuò)性的問題。
- Mysql主從服務(wù)器最多不超過9臺(tái),推薦不超過5臺(tái)。
主從復(fù)制的類型
基于語句復(fù)制
- 主服務(wù)器上執(zhí)行的語句從服務(wù)器再執(zhí)行一遍,Mysql默認(rèn)使用基于語句的復(fù)制。
- 存在問題:在時(shí)間上可能不能完全同步造成偏差,執(zhí)行語句的用戶也可能不是同一個(gè)用戶。
基于行復(fù)制
- 把主服務(wù)器中修改的內(nèi)容直接復(fù)制到從服務(wù)器中,不關(guān)心到底修改的內(nèi)容是由哪條語句引發(fā)的。
- 存在問題:如果修改了數(shù)據(jù)表中每行的內(nèi)容,那么需要復(fù)制數(shù)據(jù)表中所有的內(nèi)容到從服務(wù)器中,造成比較大的開銷。
混合類型的復(fù)制
- Mysql默認(rèn)使用基于語句的復(fù)制,當(dāng)基于語句的復(fù)制會(huì)引發(fā)問題是,就使用基于行的復(fù)制,Mysql會(huì)自動(dòng)進(jìn)行選擇。
- 在主從復(fù)制架構(gòu)中,讀操作可以在所有的服務(wù)器中執(zhí)行,而寫操作只能在主服務(wù)器中執(zhí)行。主從復(fù)制架構(gòu)雖然對(duì)讀操作提供了擴(kuò)展,但是,如果寫操作比較多,單主模型的復(fù)制中主服務(wù)器勢(shì)必會(huì)成為性能瓶頸。
主從復(fù)制工作原理
- 主服務(wù)器Master將改變記錄到二進(jìn)制日志Binary log中;
- 從服務(wù)器Slave將主服務(wù)Master的二進(jìn)制日志事件復(fù)制到它的中繼日志Relay log中;
- 從服務(wù)器Slave重做中繼日志中的事件,將改變反應(yīng)到自己的數(shù)據(jù)庫中;
- 一主多從的復(fù)制模式中,主服務(wù)器既要負(fù)責(zé)數(shù)據(jù)的寫入,又要負(fù)責(zé)為從服務(wù)器提供二進(jìn)制日志,那么主服務(wù)器將面臨更多的負(fù)擔(dān)。
Mysql主從復(fù)制-從分發(fā)日志 - 在一主多從的復(fù)制模式中,可以將主服務(wù)器中的二進(jìn)制日志復(fù)制到某一個(gè)從服務(wù)器中,該從服務(wù)器再開啟二進(jìn)制日志事件,并將自己的二進(jìn)制日志發(fā)送給其他從服務(wù)器或者該從無服務(wù)器不開啟二進(jìn)制日志事件,只負(fù)責(zé)把二進(jìn)制日志轉(zhuǎn)發(fā)給其他從服務(wù)器,這樣的架構(gòu)性能更好,而且數(shù)據(jù)之間的延時(shí)也更好。
主從復(fù)制的過程
- Mysql主從復(fù)制有:同步復(fù)制、異步復(fù)制、半同步復(fù)制。3
- 異步復(fù)制:事物首先從主節(jié)點(diǎn)上提交,然后復(fù)制給從節(jié)點(diǎn),并在從節(jié)點(diǎn)上應(yīng)用。這就代表著在同一個(gè)時(shí)間點(diǎn)主從服務(wù)器上的數(shù)據(jù)可能不一致,異步復(fù)制的好處是比同步復(fù)制要快,如果對(duì)數(shù)據(jù)的一致性要求很高,最好采用同步復(fù)制。
- 半同步復(fù)制:半同步復(fù)制在多個(gè)Slave節(jié)點(diǎn)中選取一個(gè)節(jié)點(diǎn)進(jìn)行半同步復(fù)制。也就是說,當(dāng)主服務(wù)器提交一個(gè)事物時(shí),在這個(gè)這個(gè)半同步復(fù)制的Slave端返回一個(gè)同步完成的Ack包之后,主服務(wù)器才會(huì)向用戶返回事務(wù)提交成功,其他的Slave則采用傳統(tǒng)的異步方式進(jìn)行同步。4
- 半同步復(fù)制基于異步復(fù)制模式的,在配置半同步模式之前需要先配置異步復(fù)制。
- 半同步復(fù)制可以保證在主節(jié)點(diǎn)發(fā)生故障的時(shí)候,至少有一個(gè)從服務(wù)器與主服務(wù)器的數(shù)據(jù)一樣,這樣在進(jìn)行切換時(shí),可以更加快速的將該Slave設(shè)置成Master來使用。
二進(jìn)制日志的模式5
- 二進(jìn)制日志Binlog有3種模式:row、statement、mixed;
row模式
- 日志中會(huì)記錄成每一行數(shù)據(jù)被修改的格式,然后在slave端再對(duì)相同的數(shù)據(jù)進(jìn)行修改,只記錄要修改的數(shù)據(jù),只有value,不會(huì)有sql多表關(guān)聯(lián)的情況;
- row模式的日志清楚的記錄下每行數(shù)據(jù)修改的細(xì)節(jié),比較容易理解,不會(huì)出現(xiàn)某些情況下的存儲(chǔ)過程、trigger的調(diào)用和觸發(fā)無法被正確復(fù)制的問題。但是在該模式下,所有執(zhí)行過的語句都被記錄到日志中,日志將根據(jù)每行的修改來記錄,這樣就會(huì)產(chǎn)生大量的日志內(nèi)容;
statement模式
- 每一條會(huì)修改數(shù)據(jù)的sql語句都會(huì)記錄到二進(jìn)制日志文件中,在Slave復(fù)制的時(shí)候sql進(jìn)程會(huì)解析成和Master端相同的sql語句再執(zhí)行。在這種模式下,解決了row模式的缺點(diǎn),不需要記錄每行數(shù)據(jù)的變化,減少了日志量,節(jié)省了I/O、存儲(chǔ)資源,提高了性能。但是,在這種模式下,為了讓Slave端執(zhí)行相同的sql語句得到與Master端相同的結(jié)果,二進(jìn)制日志文件必須要記錄執(zhí)行語句的上下文信息,這就對(duì)mysql的復(fù)制造成了不小的吊炸你,自然復(fù)制的時(shí)候涉及到越復(fù)雜的內(nèi)容,bug就越容易出現(xiàn);
mixed模式
- mixed模式是row和statement模式的混合模式,在mixed模式下,mysql會(huì)根據(jù)執(zhí)行的每一條具體的sql語句來區(qū)分對(duì)待二進(jìn)制日志文件的記錄形式,它會(huì)在row和statement模式之間自動(dòng)選擇。啟用該日志模式,需要在配置文件中添加
binlog_format=mixed
Tips
- Mysql如果要使用主從復(fù)制,主服務(wù)器需要開啟
Binlog二進(jìn)制日志事件功能,從服務(wù)器需要開啟Relay-log日志中繼功能; - 二進(jìn)制日志只記錄主服務(wù)器內(nèi)容更改的語句,對(duì)查詢語句不做記錄;
- 主服務(wù)器需要建立從服務(wù)器賬號(hào);
- 從服務(wù)器要配置
master.info; - 主從復(fù)制時(shí),主服務(wù)器有一個(gè)I/O線程,從服務(wù)器有一個(gè)I/O,一個(gè)SQL線程;

