偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

對(duì)MySQL主從復(fù)制原理的探索

數(shù)據(jù)庫(kù) MySQL
經(jīng)歷過一次mysql主從延遲之后,就開始思考,主從復(fù)制是什么東西?它是怎么實(shí)現(xiàn)的呢?它的原理是什么?于是乎就開始查閱資料、文章,現(xiàn)將自己理解到的內(nèi)容總結(jié)在此,加深印象。

上一篇文章里面,講到了遇到mysql主從延遲的坑,對(duì)于這次的坑多說兩句,以前也看過這樣的例子,也知道不能夠?qū)懲曛篑R上更新,但是真正開發(fā)的時(shí)候還是沒有注意到這一點(diǎn),道理大家都懂,但是還是會(huì)犯錯(cuò),只有等到自己親身體驗(yàn)到該錯(cuò)誤之后,才真正的掌握到該道理。

經(jīng)歷過一次mysql主從延遲之后,就開始思考,主從復(fù)制是什么東西?它是怎么實(shí)現(xiàn)的呢?它的原理是什么?于是乎就開始查閱資料、文章,現(xiàn)將自己理解到的內(nèi)容總結(jié)在此,加深印象。

為什么要做主從復(fù)制?

1、在業(yè)務(wù)復(fù)雜的系統(tǒng)中,有這么一個(gè)情景,有一句sql語(yǔ)句需要鎖表,導(dǎo)致暫時(shí)不能使用讀的服務(wù),那么就很影響運(yùn)行中的業(yè)務(wù),使用主從復(fù)制,讓主庫(kù)負(fù)責(zé)寫,從庫(kù)負(fù)責(zé)讀,這樣,即使主庫(kù)出現(xiàn)了鎖表的情景,通過讀從庫(kù)也可以保證業(yè)務(wù)的正常運(yùn)作。

2、做數(shù)據(jù)的熱備

3、架構(gòu)的擴(kuò)展。業(yè)務(wù)量越來(lái)越大,I/O訪問頻率過高,單機(jī)無(wú)法滿足,此時(shí)做多庫(kù)的存儲(chǔ),降低磁盤I/O訪問的頻率,提高單個(gè)機(jī)器的I/O性能。

mysql主從復(fù)制的原理是什么?

binlog: binary log,主庫(kù)中保存更新事件日志的二進(jìn)制文件。

主從復(fù)制的基礎(chǔ)是主庫(kù)記錄數(shù)據(jù)庫(kù)的所有變更記錄到binlog。binlog是數(shù)據(jù)庫(kù)中保存配置中過期時(shí)間內(nèi)所有修改數(shù)據(jù)庫(kù)結(jié)構(gòu)或內(nèi)容的一個(gè)文件。如果過期時(shí)間是10d的話,那么就是最近10d的數(shù)據(jù)庫(kù)修改記錄。

mysql主從復(fù)制是一個(gè)異步的復(fù)制過程,主庫(kù)發(fā)送更新事件到從庫(kù),從庫(kù)讀取更新記錄,并執(zhí)行更新記錄,使得從庫(kù)的內(nèi)容與主庫(kù)保持一致。

在主庫(kù)里,只要有更新事件出現(xiàn),就會(huì)被依次地寫入到binlog里面,是之后從庫(kù)連接到主庫(kù)時(shí),從主庫(kù)拉取過來(lái)進(jìn)行復(fù)制操作的數(shù)據(jù)源。

binlog輸出線程。每當(dāng)有從庫(kù)連接到主庫(kù)的時(shí)候,主庫(kù)都會(huì)創(chuàng)建一個(gè)線程然后發(fā)送binlog內(nèi)容到從庫(kù)。

對(duì)于每一個(gè)即將發(fā)送給從庫(kù)的sql事件,binlog輸出線程會(huì)將其鎖住。一旦該事件被線程讀取完之后,該鎖會(huì)被釋放,即使在該事件完全發(fā)送到從庫(kù)的時(shí)候,該鎖也會(huì)被釋放。

在從庫(kù)里,當(dāng)復(fù)制開始的時(shí)候,從庫(kù)就會(huì)創(chuàng)建兩個(gè)線程進(jìn)行處理:

從庫(kù)I/O線程。當(dāng)START SLAVE語(yǔ)句在從庫(kù)開始執(zhí)行之后,從庫(kù)創(chuàng)建一個(gè)I/O線程,該線程連接到主庫(kù)并請(qǐng)求主庫(kù)發(fā)送binlog里面的更新記錄到從庫(kù)上。

從庫(kù)I/O線程讀取主庫(kù)的binlog輸出線程發(fā)送的更新并拷貝這些更新到本地文件,其中包括relay log文件。

從庫(kù)的SQL線程。從庫(kù)創(chuàng)建一個(gè)SQL線程,這個(gè)線程讀取從庫(kù)I/O線程寫到relay log的更新事件并執(zhí)行。

可以知道,對(duì)于每一個(gè)主從復(fù)制的連接,都有三個(gè)線程。擁有多個(gè)從庫(kù)的主庫(kù)為每一個(gè)連接到主庫(kù)的從庫(kù)創(chuàng)建一個(gè)binlog輸出線程,每一個(gè)從庫(kù)都有它自己的I/O線程和SQL線程。

從庫(kù)通過創(chuàng)建兩個(gè)獨(dú)立的線程,使得在進(jìn)行復(fù)制時(shí),從庫(kù)的讀和寫進(jìn)行了分離。因此,即使負(fù)責(zé)執(zhí)行的線程運(yùn)行較慢,負(fù)責(zé)讀取更新語(yǔ)句的線程并不會(huì)因此變得緩慢。比如說,如果從庫(kù)有一段時(shí)間沒運(yùn)行了,當(dāng)它在此啟動(dòng)的時(shí)候,盡管它的SQL線程執(zhí)行比較慢,它的I/O線程可以快速地從主庫(kù)里讀取所有的binlog內(nèi)容。這樣一來(lái),即使從庫(kù)在SQL線程執(zhí)行完所有讀取到的語(yǔ)句前停止運(yùn)行了,I/O線程也至少完全讀取了所有的內(nèi)容,并將其安全地備份在從庫(kù)本地的relay log,隨時(shí)準(zhǔn)備在從庫(kù)下一次啟動(dòng)的時(shí)候執(zhí)行語(yǔ)句。

查看主從復(fù)制的狀態(tài)

當(dāng)主從復(fù)制正在進(jìn)行中時(shí),如果想查看從庫(kù)兩個(gè)線程運(yùn)行狀態(tài),可以通過執(zhí)行在從庫(kù)里執(zhí)行”show slave statusG”語(yǔ)句,以下的字段可以給你想要的信息:

Master_Log_File — 上一個(gè)從主庫(kù)拷貝過來(lái)的binlog文件

Read_Master_Log_Pos — 主庫(kù)的binlog文件被拷貝到從庫(kù)的relay log中的位置

Relay_Master_Log_File — SQL線程當(dāng)前處理中的relay log文件

Exec_Master_Log_Pos — 當(dāng)前binlog文件正在被執(zhí)行的語(yǔ)句的位置

整個(gè)主從復(fù)制的流程可以通過以下圖示理解:

 

  • 步驟一:主庫(kù)db的更新事件(update、insert、delete)被寫到binlog
  • 步驟二:從庫(kù)發(fā)起連接,連接到主庫(kù)
  • 步驟三:此時(shí)主庫(kù)創(chuàng)建一個(gè)binlog dump thread,把binlog的內(nèi)容發(fā)送到從庫(kù)
  • 步驟四:從庫(kù)啟動(dòng)之后,創(chuàng)建一個(gè)I/O線程,讀取主庫(kù)傳過來(lái)的binlog內(nèi)容并寫入到relay log
  • 步驟五:還會(huì)創(chuàng)建一個(gè)SQL線程,從relay log里面讀取內(nèi)容,從Exec_Master_Log_Pos位置開始執(zhí)行讀取到的更新事件,將更新內(nèi)容寫入到slave的db

注:上面的解釋是解釋每一步做了什么,整個(gè)mysql主從復(fù)制是異步的,不是按照上面的步驟執(zhí)行的。

其他

關(guān)于主從復(fù)制架構(gòu)的搭建,可以參考網(wǎng)上更多的文檔,文筆有限,不做更多的介紹。

作為一名開發(fā),這些基礎(chǔ)的mysql知識(shí)還是需要多多學(xué)習(xí)。

參考資料

  1. What is MySQL Replication and How Does It Work?
  2. Replication Implementation Details 
責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2024-07-04 08:00:24

2025-01-15 15:47:36

2021-01-12 09:03:17

MySQL復(fù)制半同步

2020-04-14 16:26:22

MySQL線程同步

2024-07-04 17:22:23

2023-04-06 13:15:48

MySQL復(fù)制原理應(yīng)用實(shí)踐

2020-11-13 07:11:23

MySQL復(fù)制日志

2025-02-10 10:55:16

2024-03-01 18:33:59

MySQL節(jié)點(diǎn)數(shù)據(jù)

2021-06-08 07:48:27

MySQL主從配置

2024-11-15 15:27:09

2018-05-16 15:26:43

數(shù)據(jù)庫(kù)MySQL主從復(fù)制

2025-04-07 00:00:00

MySQL數(shù)據(jù)庫(kù)服務(wù)器

2024-10-12 16:25:12

2023-12-25 08:02:09

2017-10-11 15:40:20

MySQL主從復(fù)制拓?fù)浣Y(jié)構(gòu)

2023-03-19 11:53:27

2023-03-19 22:38:12

邏輯復(fù)制PostgreSQL

2025-02-28 00:00:00

2023-12-29 13:45:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)