最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL是如何實(shí)現(xiàn)主備同步

 更新時(shí)間:2020年12月24日 11:59:33   作者:大雜草  
這篇文章主要介紹了MySQL是如何實(shí)現(xiàn)主備同步的,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下

主備同步,也叫主從復(fù)制,是MySQL提供的一種高可用的解決方案,保證主備數(shù)據(jù)一致性的解決方案。

在生產(chǎn)環(huán)境中,會(huì)有很多不可控因素,例如數(shù)據(jù)庫(kù)服務(wù)掛了。為了保證應(yīng)用的高可用,數(shù)據(jù)庫(kù)也必須要是高可用的。

因此在生產(chǎn)環(huán)境中,都會(huì)采用主備同步。在應(yīng)用的規(guī)模不大的情況下,一般會(huì)采用一主一備。

除了上面提到的數(shù)據(jù)庫(kù)服務(wù)掛了,能夠快速切換到備庫(kù),避免應(yīng)用的不可用外,采用主備同步還有以下好處:

提升數(shù)據(jù)庫(kù)的讀并發(fā)性,大多數(shù)應(yīng)用都是讀比寫要多,采用主備同步方案,當(dāng)使用規(guī)模越來越大的時(shí)候,可以擴(kuò)展備庫(kù)來提升讀能力。

備份,主備同步可以得到一份實(shí)時(shí)的完整的備份數(shù)據(jù)庫(kù)。

快速恢復(fù),當(dāng)主庫(kù)出錯(cuò)了(比如誤刪表),通過備庫(kù)來快速恢復(fù)數(shù)據(jù)。對(duì)于規(guī)模很大的應(yīng)用,對(duì)于數(shù)據(jù)恢復(fù)速度的容忍性很低的情況,通過配置一臺(tái)與主庫(kù)的數(shù)據(jù)快照相隔半小時(shí)的備庫(kù),當(dāng)主庫(kù)誤刪表,就可以通過備庫(kù)和binlog來快速恢復(fù),最多等待半小時(shí)。

說了主備同步是什么和好處,下面讓我們來了解一下主備同步是怎么實(shí)現(xiàn)的。

主備同步的實(shí)現(xiàn)原理

我們先來了解一下主備同步的原理,下面以一個(gè)update語(yǔ)句來介紹主庫(kù)與備庫(kù)間是如何進(jìn)行同步的。

上圖是一個(gè)update語(yǔ)句在節(jié)點(diǎn)A執(zhí)行,然后同步到節(jié)點(diǎn)B的完整流程圖,具體步驟有:

  1. 主庫(kù)接受到客戶端發(fā)送的一條update語(yǔ)句,執(zhí)行內(nèi)部事務(wù)邏輯,同時(shí)寫binlog。
  2. 備庫(kù)通過 change master 命令,設(shè)置主庫(kù)的IP、端口、用戶名和密碼,以及要從哪個(gè)位置開始請(qǐng)求 binlog。這個(gè)位置包含文件名和偏移量。
  3. 在備庫(kù)上執(zhí)行start slave命令,啟動(dòng)兩個(gè)線程 io_thread 和 sql_thread,其中 io_thread 負(fù)責(zé)與主機(jī)進(jìn)行連接。
  4. 主庫(kù)校驗(yàn)完用戶名和密碼,按照接收到的位置去讀取binlog,發(fā)給備庫(kù)。
  5. 備庫(kù)接收到binlog后,寫到本地文件(relay log,中轉(zhuǎn)文件)。
  6. 備庫(kù)讀取中轉(zhuǎn)文件,解析出命令,然后執(zhí)行。

主備同步的工作原理其實(shí)就是一個(gè)完全備份加上二進(jìn)制日志備份的還原。不同的是這個(gè)二進(jìn)制日志的還原操作基本上是實(shí)時(shí)的。

備庫(kù)通過兩個(gè)線程來實(shí)現(xiàn)同步:

  • 一個(gè)是 I/O 線程,負(fù)責(zé)讀取主庫(kù)的二進(jìn)制日志,并將其保存為中繼日志。
  • 一個(gè)是 SQL 線程,負(fù)責(zé)執(zhí)行中繼日志。

從上面的流程可以看出,主備同步的關(guān)鍵是binlog

常見的兩種主備切換流程

M-S結(jié)構(gòu)

M-S結(jié)構(gòu),兩個(gè)節(jié)點(diǎn),一個(gè)當(dāng)主庫(kù)、一個(gè)當(dāng)備庫(kù),不允許兩個(gè)節(jié)點(diǎn)互換角色。

在狀態(tài)1中,客戶端的讀寫都直接訪問節(jié)點(diǎn)A,而節(jié)點(diǎn)B是A的備庫(kù),只是將A的更新都同步過來,到本地執(zhí)行。這樣可以保持節(jié)點(diǎn)B和A的數(shù)據(jù)是相同的。

當(dāng)需要切換的時(shí)候,就切成狀態(tài)2。這時(shí)候客戶端讀寫訪問的都是節(jié)點(diǎn)B,而節(jié)點(diǎn)A是B的備庫(kù)。

雙M結(jié)構(gòu)

雙M結(jié)構(gòu),兩個(gè)節(jié)點(diǎn),一個(gè)當(dāng)主庫(kù),一個(gè)當(dāng)備庫(kù),允許兩個(gè)節(jié)點(diǎn)互換角色。

對(duì)比前面的M-S結(jié)構(gòu)圖,可以發(fā)現(xiàn),雙M結(jié)構(gòu)和M-S結(jié)構(gòu),其實(shí)區(qū)別只是多了一條線,即節(jié)點(diǎn)A和B之間總是互為主備關(guān)系。這樣在切換的時(shí)候就不用再修改主備關(guān)系。

雙M結(jié)構(gòu)的循環(huán)復(fù)制問題

在實(shí)際生產(chǎn)使用中,多數(shù)情況是使用雙M結(jié)構(gòu)的。但是,雙M結(jié)構(gòu)還有一個(gè)問題需要解決。

業(yè)務(wù)邏輯在節(jié)點(diǎn)A執(zhí)行更新,會(huì)生成binlog并同步到節(jié)點(diǎn)B。節(jié)點(diǎn)B同步完成后,也會(huì)生成binlog。(log_slave_updates設(shè)置為on,表示備庫(kù)也會(huì)生成binlog)。

當(dāng)節(jié)點(diǎn)A同時(shí)也是節(jié)點(diǎn)B的備庫(kù)時(shí),節(jié)點(diǎn)B的binlog也會(huì)發(fā)送給節(jié)點(diǎn)A,造成循環(huán)復(fù)制。

解決辦法:

  1. 設(shè)置節(jié)點(diǎn)的server-id,必須不同,不然不允許設(shè)置為主備結(jié)構(gòu)
  2. 備庫(kù)在接到binlog后重放時(shí),會(huì)記錄原記錄相同的server-id,即誰(shuí)產(chǎn)生即為誰(shuí)的。
  3. 每個(gè)節(jié)點(diǎn)在接受binlog時(shí),會(huì)判斷server-id,如果是自己的就丟掉。

解決后的流程:

  1. 業(yè)務(wù)邏輯在節(jié)點(diǎn)A執(zhí)行更新,會(huì)生成帶有節(jié)點(diǎn)A的server-id的binlog。
  2. 節(jié)點(diǎn)B接受到節(jié)點(diǎn)A發(fā)過來的binlog,并執(zhí)行完成后,會(huì)生成帶有節(jié)點(diǎn)A的server-id的binlog。
  3. 節(jié)點(diǎn)A接受到binlog后,發(fā)現(xiàn)是自己的,就丟掉。死循環(huán)就在這里斷掉了。

以上就是MySQL是如何實(shí)現(xiàn)主備同步的詳細(xì)內(nèi)容,更多關(guān)于MySQL 主備同步的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL如何更改數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)目錄詳解

    MySQL如何更改數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)目錄詳解

    這篇文章主要給大家介紹了關(guān)于MySQL如何更改數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)目錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • mysql found_row()使用詳解

    mysql found_row()使用詳解

    在參考手冊(cè)中對(duì)found_rows函數(shù)的描述是: it is desirable to know how many rows the statement would have returned without the LIMIT. 也就是說,它返回值是如果SQL語(yǔ)句沒有加LIMIT的情況下返回的數(shù)值。
    2016-05-05
  • mysql查詢語(yǔ)句通過limit來限制查詢的行數(shù)

    mysql查詢語(yǔ)句通過limit來限制查詢的行數(shù)

    這篇文章主要介紹了mysql查詢語(yǔ)句,通過limit來限制查詢的行數(shù),需要的朋友可以參考下
    2014-02-02
  • mysql中向表中某字段追加字符串的方法

    mysql中向表中某字段追加字符串的方法

    mysql中向表中某字段追加字符串的方法...
    2007-03-03
  • 利用rpm安裝mysql 5.6版本詳解

    利用rpm安裝mysql 5.6版本詳解

    眾所周知MySQL在很多領(lǐng)域都被廣泛的使用,尤其是很多互聯(lián)網(wǎng)企業(yè),諸如騰訊,阿里等等。那么本文將主要介紹如何通過rpm方式來安裝Mysql,這是比較簡(jiǎn)單的一種安裝方式,文中介紹的很詳細(xì),相信對(duì)于大家安裝mysql具有一定的參考借鑒價(jià)值,下面來一起看看吧。
    2016-11-11
  • Mysql數(shù)據(jù)庫(kù)之常用sql語(yǔ)句進(jìn)階與總結(jié)

    Mysql數(shù)據(jù)庫(kù)之常用sql語(yǔ)句進(jìn)階與總結(jié)

    這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)之常用sql語(yǔ)句,總結(jié)分析了MySQL數(shù)據(jù)庫(kù)常用的查詢、條件查詢、排序、連接查詢、子查詢等相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • 解決創(chuàng)建主鍵報(bào)錯(cuò):Incorrect column specifier for column id問題

    解決創(chuàng)建主鍵報(bào)錯(cuò):Incorrect column specifier for 

    這篇文章主要介紹了解決創(chuàng)建主鍵報(bào)錯(cuò):Incorrect column specifier for column‘id‘問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • mysql高級(jí)學(xué)習(xí)之索引的優(yōu)劣勢(shì)及規(guī)則使用

    mysql高級(jí)學(xué)習(xí)之索引的優(yōu)劣勢(shì)及規(guī)則使用

    這篇文章主要給大家介紹了關(guān)于mysql高級(jí)學(xué)習(xí)之索引的優(yōu)劣勢(shì)及規(guī)則使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • navicat如何利用sql語(yǔ)句查詢表所有字段的字段名、類型及長(zhǎng)度

    navicat如何利用sql語(yǔ)句查詢表所有字段的字段名、類型及長(zhǎng)度

    Navicat使用了極好的圖形用戶界面(GUI),可以讓你用一種安全和更為容易的方式快速和容易地創(chuàng)建、組織、存取和共享信息,下面這篇文章主要給大家介紹了關(guān)于navicat如何利用sql語(yǔ)句查詢表所有字段的字段名、類型及長(zhǎng)度的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • mysql建立自定義函數(shù)的問題

    mysql建立自定義函數(shù)的問題

    由于這幾天在寫mysql存儲(chǔ)過程且發(fā)現(xiàn)程序體積越來越龐大,于是嘗試使用mysql的函數(shù)
    2011-04-04

最新評(píng)論

柘城县| 田东县| 弋阳县| 清苑县| 荣昌县| 道真| 梅州市| 宜兴市| 宣恩县| 华蓥市| 新营市| 任丘市| 黎城县| 保定市| 台东县| 新蔡县| 邓州市| 海门市| 图木舒克市| 杭州市| 乌拉特前旗| 通榆县| 伊吾县| 普格县| 临沂市| 多伦县| 衡南县| 南汇区| 台东县| 全南县| 纳雍县| 华安县| 侯马市| 大方县| 伊春市| 临潭县| 金寨县| 军事| 惠安县| 岳阳县| 富民县|