成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何搞懂MySql主從同步

本篇內容主要講解“如何搞懂MySQL主從同步”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何搞懂MySql主從同步”吧!

為文登等地區(qū)用戶提供了全套網頁設計制作服務,及文登網站建設行業(yè)解決方案。主營業(yè)務為成都網站制作、網站建設、外貿網站建設、文登網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

MySql主從同步概述

MySQL主從同步,即MySQL Replication,可以實現(xiàn)將數(shù)據從一臺數(shù)據庫服務器同步到多臺數(shù)據庫服務器。MySQL數(shù)據庫自帶主從同步功能,經過配置,可以實現(xiàn)基于庫、表結構的多種方案的主從同步。

redis是一種高性能的內存數(shù)據庫,但不是今天的主角;MySQL是基于磁盤文件的關系型數(shù)據庫,相比于Redis來說,讀取速度會慢一些,但是功能強大,可以用于存儲持久化的數(shù)據。在實際工作中,我們常將Redis作為緩存與MySQL配合來使用,當有數(shù)據訪問請求的時候,首先會從緩存中進行查找,如果存在就直接取出,如果不存在再訪問數(shù)據庫,這樣就提升了讀取的效率,也減少了后端數(shù)據庫的訪問壓力。使用Redis這種緩存架構是高并發(fā)架構中非常重要的一環(huán)。

如何搞懂MySql主從同步

隨著業(yè)務量的不斷增長,數(shù)據庫的壓力會不斷變大,緩存的頻繁變更也強依賴于數(shù)據的查詢結果,導致數(shù)據查詢效率低,負載很高,連接過多等問題。對于電商場景來說,往往存在很多典型的讀多寫少場景,我們可以對MySQL做主從架構并且進行讀寫分離,讓主服務器(Master)處理寫請求,從服務器(Slave)處理讀請求,這樣可以進一步提升數(shù)據庫的并發(fā)處理能力。如下圖:

如何搞懂MySql主從同步

上圖中,可以看到,我們增加了2個從庫,這2個從庫可以一起抗下大量的讀請求,分擔主庫壓力。從庫會通過主從復制,從主庫中不斷的同步數(shù)據,以此來保證從庫的數(shù)據和主庫數(shù)據的一致。

接下來,我們看看主從同步有哪些作用,以及主從同步具體是怎么實現(xiàn)的。

主從同步的作用

一般來說,不是所有的系統(tǒng)都需要對數(shù)據庫進行主從架構的設計,因為架構本身是有一定成本的,如果我們的目的在于提升數(shù)據庫高并發(fā)訪問的效率,那么我們首先應該優(yōu)化SQL語句及索引,充分發(fā)揮數(shù)據庫的最大性能;其次是采用緩存的策略,如使用Redis、MongoDB等緩存工具,通過其高性能的優(yōu)勢把數(shù)據保存在內存數(shù)據庫中,提升讀取的效率,最后才是對數(shù)據庫采用主從架構,進行讀寫分離。系統(tǒng)的使用和維護成本是根據架構的升級逐漸升高的。

言歸正傳,主從同步不僅可以提升數(shù)據庫的吞吐量,還有以下三個方面的作用:

1 讀寫分離

我們可以通過主從復制的方式來同步數(shù)據,然后通過讀寫分離提升數(shù)據庫的并發(fā)處理能力。簡單來說就是我們的數(shù)據被放在了多個數(shù)據庫中,其中一個是Master主庫,其余的是Slave從庫。當主庫數(shù)據變化時,會自動將數(shù)據同步到從庫中,而我們程序可以從從庫讀取數(shù)據,也就是采用讀寫分離的方式。電商的應用往往是“讀多寫少”,采用讀寫分離就實現(xiàn)了更高的并發(fā)訪問。原本所有的讀寫壓力都由一臺服務器承擔,現(xiàn)在有多個服務器共同處理讀請求,減少了對主庫的壓力。另外還可以對從服務器進行負載均衡,讓不同的讀請求按照策略均勻的分配到不同的從服務器中,讓讀取更加順暢。讀取順暢的另一個原因,就是減少了鎖表的影響,比如我們讓主庫負責寫,當主庫出現(xiàn)寫鎖的時候,不會影響到從庫的查詢操作。

2 數(shù)據備份

主從同步也相當于是一種數(shù)據熱備份機制,在主庫正常運行下進行備份,不影響提供數(shù)據服務。

3 高可用性

數(shù)據備份實際就是一種冗余的機制,通過這種冗余的方式可以換取數(shù)據庫的高可用性,當服務器出現(xiàn)故障、宕機等無可用的情況下,可以迅速進行故障切換,讓從庫充當主庫,保障服務正常運行。大家可以了解下電商系統(tǒng)數(shù)據庫高可用SLA指標。

主從同步的原理

說到主從同步的原理,我們就需要了解在數(shù)據庫中的一個重要日志文件,就是Binlog二進制文件,它記錄了對數(shù)據庫進行更新的事件,事實上主從同步的原理就是基于Binlog進行數(shù)據同步的。

在主從復制的過程中,會基于三個線程來操作,一個是binlog dump線程,位于master節(jié)點上,另外兩個線程分別是I/O線程和SQL線程,它們都分別位于slave節(jié)點上,如下圖:

如何搞懂MySql主從同步

結合以上圖片,我們一起來了解主從復制的核心流程:

  1. 當master節(jié)點接收到一個寫請求時,這個寫請求可能是增刪改操作,此時會把寫請求的更新操作都記錄到binlog日志中。

  2. master節(jié)點會把數(shù)據復制給slave節(jié)點,如圖中的slave01節(jié)點和slave02節(jié)點,這個過程,首先得要每個slave節(jié)點連接到master節(jié)點上,當slave節(jié)點連接到master節(jié)點上時,master節(jié)點會為每一個slave節(jié)點分別創(chuàng)建一個binlog dump線程,用于向各個slave節(jié)點發(fā)送binlog日志。

  3. binlog dump線程會讀取master節(jié)點上的binlog日志,然后將binlog日志發(fā)送給slave節(jié)點上的I/O線程。當主庫讀取事件的時候,會在Binglog上加鎖,讀取完成之后,再將鎖釋放掉。

  4. slave節(jié)點上的I/O線程接收到binlog日志后,會將binlog日志先寫入到本地的relaylog中,relaylog中就保存了binlog日志。

  5. slave節(jié)點上的SQL線程,會來讀取relaylog中的binlog日志,將其解析成具體的增刪改操作,把這些在master節(jié)點上進行過的操作,重新在slave節(jié)點上也重做一遍,達到數(shù)據還原的效果,這樣就可以保證master節(jié)點和slave節(jié)點的數(shù)據一致性了。

主從同步的數(shù)據內容其實是二進制日志(Binlog),它雖然叫二進制日志,實際上存儲的是一個又一個的事件(Event),這些事件分別對應著數(shù)據庫的更新操作,比如INSERT、UPDATE、DELETE等。

另外我們還需要注意的是,不是所有版本的MySQL都默認開啟了服務器的二進制日志,在進行主從同步的時候,我們需要先檢查服務器是否已經開啟了二進制日志。

二進制日志,它是一個文件,在進行網絡傳輸?shù)倪^程中就一定會存在一些延遲,比如200ms,這樣就可能造成用戶在從庫上讀取的數(shù)據不是最新的數(shù)據,也就會造成主從同步中的數(shù)據不一致的情況發(fā)生。比如我們對一條記錄進行更新,這個操作是在主庫上完成的,而在很短的時間內,比如100ms,又對同一個記錄進行讀取,這時候從庫還沒有完成數(shù)據的同步,那么,我們通過從庫讀取到的數(shù)據就是一條舊的數(shù)據。這種情況下該怎么辦呢?

如何解決主從同步的數(shù)據一致性問題

可以想象下,如果我們想要操作的數(shù)據都存儲在同一個數(shù)據庫中,那么對數(shù)據進行更新的時候,可以對記錄進行加寫鎖,這樣在讀取的時候就不會發(fā)生數(shù)據不一致的情況了。但這時從庫的作用就是備份數(shù)據,沒有做到讀寫分離,分擔主庫的壓力。

因此我們還需要想辦法,在進行讀寫分離的時候,解決主從同步中數(shù)據不一致的問題,也就是解決主從之間數(shù)據復制方式的問題,如果按照數(shù)據一致性從弱到強來進行劃分,有以下三種復制方式。

1 全同步復制

首先,全同步復制,就是當主庫執(zhí)行完一個事務之后,要求所有的從庫也都必須執(zhí)行完該事務,才可以返回處理結果給客戶端;因此,雖然全同步復制數(shù)據一致性得到保證了,但是主庫完成一個事物需要等待所有從庫也完成,性能就比較低了。如下圖:

如何搞懂MySql主從同步

2 異步復制

而異步復制,就是當主庫提交事物后,會通知binlog dump線程發(fā)送binlog日志給從庫,一旦binlog dump線程將binlog日志發(fā)送給從庫之后,不需要等到從庫也同步完成事務,主庫就會將處理結果返回給客戶端。

因為主庫只管自己執(zhí)行完事務,就可以將處理結果返回給客戶端,而不用關心從庫是否執(zhí)行完事務,這就可能導致短暫的主從數(shù)據不一致的問題了,比如剛在主庫插入的新數(shù)據,如果馬上在從庫查詢,就可能查詢不到。

而且,當主庫提交事物后,如果宕機掛掉了,此時可能binlog還沒來得及同步給從庫,這時候如果為了恢復故障切換主從節(jié)點的話,就會出現(xiàn)數(shù)據丟失的問題,所以異步復制雖然性能高,但數(shù)據一致性上是最弱的。

mysql主從復制,默認采用的就是異步復制這種復制策略。

如何搞懂MySql主從同步

3 半同步復制

MySQL5.5版本之后開始支持半同步復制的方式。原理是在客戶端提交COMMIT之后不直接將結果返回給客戶端,而是等待至少有一個從庫收到了Binlog,并且寫入到中繼日志中,再返回給客戶端。這樣做的好處就是提高了數(shù)據的一致性,當然相比于異步復制來說,至少多增加了一個網絡連接的延遲,降低了主庫寫的效率。

在MySQL5.7版本中還增加了一個rpl_semi_sync_master_wait_for_slave_count參數(shù),我們可以對需要響應的從庫數(shù)量進行設置,默認為1,也就是說只要有一個從庫進行了響應,就可以返回給客戶端。如果將這個參數(shù)調大,可以提升數(shù)據一致性的強度,但也會增加主庫等待從庫響應的時間。

如何搞懂MySql主從同步

但是,半同步復制也存在以下幾個問題:

  • 半同步復制的性能,相比異步復制而言有所下降,相比于異步復制是不需要等待任何從庫是否接收到數(shù)據的響應,而半同步復制則需要等待至少一個從庫確認接收到binlog日志的響應,性能上是損耗更大的。

  • 主庫等待從庫響應的最大時長是可以配置的,如果超過了配置的時間,半同步復制就會變成異步復制,那么,異步復制的問題同樣也就會出現(xiàn)了。

  • 在MySQL 5.7.2之前的版本中,半同步復制存在著幻讀問題的。

當主庫成功提交事物并處于等待從庫確認的過程中,這個時候,從庫都還沒來得及返回處理結果給客戶端,但因為主庫存儲引擎內部已經提交事務了,所以,其他客戶端是可以到從主庫中讀到數(shù)據的。

但是,如果下一秒主庫突然掛了,此時正好下一次請求過來,因為主庫掛了,就只能把請求切換到從庫中,因為從庫還沒從主庫同步完數(shù)據,所以,從庫中當然就讀不到這條數(shù)據了,和上一秒讀取數(shù)據的結果對比,就造成了幻讀的現(xiàn)象了。

4 增強半同步復制

增強半同步復制,是mysql 5.7.2后的版本對半同步復制做的一個改進,原理上幾乎是一樣的,主要是解決幻讀的問題。

主庫配置了參數(shù) rpl_semi_sync_master_wait_point = AFTER_SYNC 后,主庫在存儲引擎提交事務前,必須先收到從庫數(shù)據同步完成的確認信息后,才能提交事務,以此來解決幻讀問題。參考下圖:

如何搞懂MySql主從同步

到此,相信大家對“如何搞懂MySql主從同步”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

文章題目:如何搞懂MySql主從同步
轉載注明:http://jinyejixie.com/article42/jpojec.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供做網站網站設計、網站改版、網站導航、移動網站建設企業(yè)網站制作

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網站優(yōu)化
卓尼县| 疏附县| 韩城市| 蓬莱市| 东莞市| 新乡市| 淄博市| 大新县| 诸城市| 南召县| 泰州市| 房山区| 申扎县| 清远市| 扬州市| 富源县| 邵阳市| 曲阳县| 仲巴县| 海伦市| 泸水县| 丹阳市| 六枝特区| 双桥区| 涿州市| 金川县| 敖汉旗| 吉安县| 长寿区| 元朗区| 石柱| 滨海县| 汤阴县| 理塘县| 四川省| 城固县| 洪雅县| 饶平县| 安福县| 玛多县| 绵竹市|