Mysql數(shù)據(jù)庫主從復(fù)制學(xué)習(xí)筆記


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ù)制工作原理

  1. 主服務(wù)器Master將改變記錄到二進(jìn)制日志Binary log中;
  2. 從服務(wù)器Slave將主服務(wù)Master的二進(jìn)制日志事件復(fù)制到它的中繼日志Relay log中;
  3. 從服務(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

  1. Mysql如果要使用主從復(fù)制,主服務(wù)器需要開啟Binlog二進(jìn)制日志事件功能,從服務(wù)器需要開啟Relay-log日志中繼功能;
  2. 二進(jìn)制日志只記錄主服務(wù)器內(nèi)容更改的語句,對(duì)查詢語句不做記錄;
  3. 主服務(wù)器需要建立從服務(wù)器賬號(hào);
  4. 從服務(wù)器要配置master.info ;
  5. 主從復(fù)制時(shí),主服務(wù)器有一個(gè)I/O線程,從服務(wù)器有一個(gè)I/O,一個(gè)SQL線程;

參考

  1. https://segmentfault.com/a/1190000008942618
  2. https://blog.csdn.net/hguisu/article/details/7325124
  3. http://blog.51cto.com/junwang/1424711
  4. http://www.itdecent.cn/p/d877cbe9f0f0
  5. https://blog.csdn.net/keda8997110/article/details/50895171
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容