Mysql主從原理


1.1 mysql主從同步

1、mysql主從同步(復制)概念

  1. 將Mysql某一台主機數據復制到其它主機(slaves)上,並重新執行一遍來實現的。

  2. 復制過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。

  3. 主服務器將更新寫入二進制日志文件,並維護文件的一個索引以跟蹤日志循環。

  4. 當一個從服務器連接主服務器時,它通知主服務器從服務器在日志中讀取的最后一次成功更新的位置。

  5. 從服務器接收從那時起發生的任何更新,然后封鎖並等待主服務器通知新的更新。

·binlog:**是二進制日志文件,用於記錄mysql的數據更新或者潛在更新(比如DELETE語句執行刪除而實際並沒有符合條件的數據)

2、Mysql支持哪些復制

 1. 基於語句的復制: 在主服務器執行SQL語句,在從服務器執行同樣語句。

 注:MySQL默認采用基於語句的復制,效率較高。一旦發現沒法精確復制時, 會自動選基於行的復制。

 2. 基於行的復制: 把改變的內容復制過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持

  1. 混合類型的復制: 默認采用基於語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制。

3、Mysql主從復制原理

  1. master服務器將數據的改變都記錄到二進制binlog日志中,只要master上的數據發生改變,則將其改變寫入二進制日志;

  1. salve服務器會在一定時間間隔內對master二進制日志進行探測其是否發生改變,如果發生改變,則開始一個I/O Thread請求master二進制事件

  2. 同時主節點為每個I/O線程啟動一個dump線程,用於向其發送二進制事件,並保存至從節點本地的中繼日志中

  3. 從節點將啟動SQL線程從中繼日志中讀取二進制日志,在本地重放,使得其數據和主節點的保持一致

  4. 最后I/O Thread和SQL Thread將進入睡眠狀態,等待下一次被喚醒.

    需要理解:

    1)從庫會生成兩個線程,一個I/O線程,一個SQL線程;

    2)I/O線程會去請求主庫的binlog,並將得到的binlog寫到本地的relay-log(中繼日志)文件中;*

    3)主庫會生成一個log dump線程,用來給從庫I/O線程傳binlog;

    4)SQL線程,會讀取relay log文件中的日志,並解析成sql語句逐一執行;

4、Mysql復制流程圖

  1. master將操作語句記錄到binlog日志中

  2. salve服務器會在一定時間間隔內對master二進制日志進行探測其是否發生改變,如果發生改變

  3. salave開啟兩個線程:IO線程和SQL線程

    1)*IO線程:*負責讀取master的binlog內容到中繼日志relay log里;

    2)*SQL線程:*負責從relay log日志里讀出binlog內容,並更新到slave的數據庫里(保證數據一致)

1.2 MySQL同步延遲問題

1、造成mysql同步延遲常見原因

1)網絡:如主機或者從機的帶寬打滿、主從之間網絡延遲很大,導致主上的binlog沒有全量傳輸到從機,造成延遲。

2)機器性能:*從機使用了爛機器?比如主機使用SSD而從機還是使用的SATA*

3)從機高負載:有很多業務會在從機上做統計,把從機服務器搞成高負載,從而造成從機延遲很大的情況

4)大事務:比如在RBR模式下,執行帶有大量的delete操作,這種通過查看processlist相關信息以及使用mysqlbinlog查看binlog中的SQL就能快速進行確認

5)鎖: 鎖沖突問題也可能導致從機的SQL線程執行慢,比如從機上有一些select .... for update的SQL,或者使用了MyISAM引擎等。

2、硬件方面(優化)

1.采用好服務器,比如4u比2u性能明顯好,2u比1u性能明顯好。

2.存儲用ssd或者盤陣或者san,提升隨機寫的性能。

3.主從間保證處在同一個交換機下面,並且是萬兆環境。

總結**:硬件強勁,延遲自然會變小。一句話,縮小延遲的解決方案就是花錢和花時間。

3、mysql主從同步加速

1)sync_binlog在slave端設置為0

當事務提交后,Mysql僅僅是將binlog_cache中的數據寫入Binlog文件,但不執行fsync之類的磁盤 同步指令 通知文件系統將緩存刷新到磁盤

而讓Filesystem自行決定什么時候來做同步,這個是性能最好的。

2)slave端 innodb_flush_log_at_trx_commit = 2

每次事務提交時MySQL都會把log buffer的數據寫入log file,但是flush(刷到磁盤)操作並不會同時進行。

該模式下,MySQL會每秒執行一次 flush(刷到磁盤)操作。

3)–logs-slave-updates 從服務器從主服務器接收到的更新不記入它的二進制日志。

4)直接禁用slave端的binlog

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM