Mysql主從複製原理和作用(較詳細)

最近一直在瞭解數據庫的一些實現細節,今天結合網上的一些資料,總結一下Mysql的原理和作用。

什麼是主從複製

主從複製,是用來建立一個和主數據庫完全一樣的數據庫環境,稱爲從數據庫,主數據庫一般是準實時的業務數據庫。一般在數據量較大的情況下會考慮,當然我們做的單機程序可能用不到這些內容,但是現在是個大數據時代,各種技術都會和分佈式相聯繫,主要是爲了進行負載均衡,數據庫的主從複製其實就是爲了解決數據過大,單機進行增刪改查壓力會比較大,所以把數據的增刪改和查分開。

主從複製的作用

1 作爲後備數據庫,主數據庫服務器故障後,可切換到從數據庫繼續工作,避免數據丟失。
2 架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的評率,提高單個機器的I/O性能。
3 讀寫分離,使數據庫能支持更大的併發。在報表中尤其重要。由於部分報表sql語句非常的慢,導致鎖表,影響前臺服務。如果前臺使用master,報表使用slave,那麼報表sql將不會造成前臺鎖,保證了前臺速度。
也可以總結爲以下情況:
1–在從服務器可以執行查詢工作(即我們常說的讀功能),降低主服務器壓力;(主庫寫,從庫讀,降壓)
2–在從主服務器進行備份,避免備份期間影響主服務器服務;(確保數據安全)
3–當主服務器出現問題時,可以切換到從服務器。(提升性能)

主從複製的方式

1 一主一從,基礎的主從結構
2 主主複製(兩個主機在同一等級上,沒有主從之分)
3 一主多從,適用於增刪改少,查詢多的業務
4 多主一從(Mysql 5.7開始支持),適用於增刪改較多,查詢少的業務
5 聯級複製
在這裏插入圖片描述

主從複製實現原理

1.數據庫有個bin-log二進制文件,記錄了所有sql語句。
2.我們的目標就是把主數據庫的bin-log文件的sql語句複製到從數據庫。
3.讓其轉爲從數據庫的relay-log中繼日誌,通過中繼日誌將朱數據庫中的SQL語句同步到從數據庫,保證主從數據庫一致。
4.具體需要三個線程來操作:
1.binlog輸出線程:每當有從庫連接到主庫發送請求時,主庫都會創建一個線程然後發送binlog內容到從庫。
同樣,在從庫裏,當複製開始的時候,從庫就會創建兩個線程進行處理:
1從庫I/O線程:當START SLAVE語句在從庫開始執行之後,從庫創建一個I/O線程,該線程連接到主庫並請求主庫發送binlog裏面的更新記錄到從庫上。從庫I/O線程讀取主庫的binlog輸出線程發送的更新並拷貝這些更新到本地文件,其中包括relay log文件。
2.從庫的SQL線程:從庫創建一個SQL線程,這個線程讀取從庫I/O線程寫到relay log的更新事件並執行。
可以知道,對於每一個主從複製的連接,都有三個線程。擁有多個從庫的主庫爲每一個連接到主庫的從庫創建一個binlog輸出線程,每一個從庫都有它自己的I/O線程和SQL線程。
在這裏插入圖片描述

主從複製的優點

好處一:實現服務器負載均衡
通過服務器複製功能,可以在主服務器和從服務器之間實現負載均衡。即可以通過在主服務器和從服務器之間切分處理客戶查詢的負荷,從而得到更好地客戶相應時間。通常情況下,數據庫管理員會有兩種思路。
一是在主服務器上只實現數據的更新操作。包括數據記錄的更新、刪除、新建等等作業。而不關心數據的查詢作業。數據庫管理員將數據的查詢請求全部 轉發到從服務器中。這在某些應用中會比較有用。如某些應用,像基金淨值預測的網站。其數據的更新都是有管理員更新的,即更新的用戶比較少。而查詢的用戶數 量會非常的多。此時就可以設置一臺主服務器,專門用來數據的更新。同時設置多臺從服務器,用來負責用戶信息的查詢。將數據更新與查詢分別放在不同的服務器 上進行,即可以提高數據的安全性,同時也縮短應用程序的響應時間、提高系統的性能。
二是在主服務器上與從服務器切分查詢的作業。在這種思路下,主服務器不單單要完成數據的更新、刪除、插入等作業,同時也需要負擔一部分查詢作 業。而從服務器的話,只負責數據的查詢。當主服務器比較忙時,部分查詢請求會自動發送到從服務器重,以降低主服務器的工作負荷。當然,像修改數據、插入數 據、刪除數據等語句仍然會發送到主服務器中,以便主服務器和從服務器數據的同步。

好處二:通過複製實現數據的異地備份

可以定期的將數據從主服務器上覆制到從服務器上,這無疑是先了數據的異地備份。在傳統的備份體制下,是將數據備份在本地。此時備份
作業與數據庫服務器運行在同一臺設備上,當備份作業運行時就會影響到服務器的正常運行。有時候會明顯的降低服務器的性能。同時,將備份數據存放在本地,也
不是很安全。如硬盤因爲電壓等原因被損壞或者服務器被失竊,此時由於備份文件仍然存放在硬盤上,數據庫管理員無法使用備份文件來恢復數據。這顯然會給企業
帶來比較大的損失。

而如果使用複製來實現對數據的備份,就可以在從服務器上對數據進行備份。此時不僅不會干擾主服務氣的正常運行,而且在備份過程中主服務器可以繼
續處理相關的更新作業。同時在數據複製的同時,也實現了對數據的異地備份。除非主服務器和從服務器的兩塊硬盤同時損壞了,否則的話數據庫管理員就可以在最
短時間內恢復數據,減少企業的由此帶來的損失。

好處三:提高數據庫系統的可用性

數據庫複製功能實現了主服務器與從服務器之間數據的同步,增加了數據庫系統的可用性。當主服務器出現問題時,數據庫管理員可以馬上讓從服務器作爲主服務器,用來數據的更新與查詢服務。然後回過頭來再仔細的檢查主服務器的問題。此時一般數據庫管理員也會採用兩種手段。

一是主服務器故障之後,雖然從服務器取代了主服務器的位置,但是對於主服務器可以採取的操作仍然做了一些限制。如仍然只能夠進行數據的查詢,而
不能夠進行數據的更新、刪除等操作。這主要是從數據的安全性考慮。如現在一些銀行系統的升級,在升級的過程中,只能夠查詢餘額而不能夠取錢。這是同樣的道理。
二是從服務器真正變成了主服務器。當從服務器切換爲主服務器之後,其地位完全與原先的主服務器相同。此時可以實現對數據的查詢、更新、刪除等操
作。爲此就需要做好數據的安全性工作。即數據的安全策略,要與原先的主服務器完全相同。否則的話,就可能會留下一定的安全隱患。

存在問題
從數據庫具有讀log文件的延遲,如何解決?

由於從數據庫存在更新從庫中SQL數據的延遲,萬一主庫在從庫讀取binlog的時候宕機,那麼數據可能丟失
主要是由於從庫只有一個sql Thread去更新從庫數據,但是主庫寫壓力大,也就是主庫會有很多寫任務,同時還要有IO線程與從庫進行 binlog 輸出,所以複製很可能延時
解決方法:
1 半同步複製—解決數據丟失的問題
2 並行複製—-解決從庫複製延遲的問題
正常主從複製(異步複製)的方式,也就是主庫直接更新數據,但是主從的複製是在主庫更新後或者過程中進行,這樣顯然容易使數據出問題,比如會丟失修改數據等:
在這裏插入圖片描述
半同步複製,可以看到當主庫進行更新時,在binlog寫的過程中,會主動通知Dump進程(輸出IO進程)開啓,與從庫進行數據的同步更新,然後從庫會返回一個ack信號給主庫的Dump進程,收到ack確認後,會給用戶提交的修改進程發送信號,讓其繼續執行,當然當從庫比較多時,這種方法不能保證全部的從庫都進行更新,如果網絡異常或從庫宕機,主庫壓力過大等,都會造成超時,影響客戶響應,並行複製可以一定程度上解決類似問題:

在這裏插入圖片描述

主從複製和主主複製區別?

最大區別是 主從是對主操作數據,從會實時同步數據。反之對從操作,主不會同步數據,還有可能造成數據紊亂,導致主從失效。
主主則是無論對那一臺操作,另一個都會同步數據。一般用作高容災方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章