欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解MySQL主從同步原理

 更新時間:2022年08月16日 10:41:34   作者:一燈架構(gòu)???????  
這篇文章主要介紹了一文詳解MySQL主從同步原理,MySQL主從同步是基于Bin?Log實現(xiàn)的,而Bin?Log記錄的是原始SQL語句,更多相關(guān)內(nèi)容介紹感興趣的小伙伴可以參考一下

1. MySQL主從同步實現(xiàn)方式

MySQL主從同步是基于Bin Log實現(xiàn)的,而Bin Log記錄的是原始SQL語句。

Bin Log共有三種日志格式,可以binlog_format配置參數(shù)指定。

參數(shù)值含義
Statement記錄原始SQL語句,會導(dǎo)致更新時間與原庫不一致。
比如 update_time=now()
Row記錄每行數(shù)據(jù)的變化,保證了數(shù)據(jù)與原庫一致,缺點是數(shù)據(jù)量較大。
MixedStatement和Row的混合模式,默認(rèn)采用Statement模式,涉及日期、函數(shù)相關(guān)的時候采用Row模式,既減少了數(shù)據(jù)量,又保證了數(shù)據(jù)一致性。

常見的主從同步架構(gòu)有一主多從、雙主多從

2. MySQL主從同步的作用

  • 讀寫分離,提升數(shù)據(jù)庫性能
  • 容災(zāi)恢復(fù),主服務(wù)器不可用時,從服務(wù)器提供服務(wù),提高可用性
  • 冗余備份,主服務(wù)器數(shù)據(jù)損壞丟失,從服務(wù)器保留備份

一主多從架構(gòu)

一般是主庫負(fù)責(zé)所有讀寫請求,而從庫只負(fù)責(zé)容災(zāi)恢復(fù)和冗余備份。

如果做了讀寫分離的話,主庫負(fù)責(zé)寫請求,從庫負(fù)責(zé)讀請求,可以提升數(shù)據(jù)庫性能。

雙主多從架構(gòu)

一般是主庫1負(fù)責(zé)所有讀寫請求,主庫2不對外提供服務(wù),只用來容災(zāi)恢復(fù)。

相比一主多從架構(gòu),雙主多從架構(gòu)可以減少宕機時間,更快恢復(fù)數(shù)據(jù)庫可用狀態(tài)。

3. 主動同步的原理

  • 當(dāng)主庫數(shù)據(jù)發(fā)生變更時,寫入本地Bin Log文件
  • 從庫IO線程發(fā)起dump主庫Bin Log文件的請求
  • 主庫IO線程推送Bin Log文件到從庫中
  • 從庫IO線程把Bin Log內(nèi)容寫入本地的Relay Log文件中
  • 從庫SQL線程讀取Relay Log文件內(nèi)容
  • 從庫SQL線程重新執(zhí)行一遍SQL語句

4. 主從同步延遲問題

主從同步最常遇到的問題就是主從同步延遲,可以通過在從庫上執(zhí)行show slave status命令查看延遲時間,Seconds_Behind_Master表示延遲的秒數(shù)。

主從同步延遲的原因有哪些?

從庫機器性能較差:

主庫負(fù)責(zé)所有讀寫請求,從庫只用來備份,會用性能較差的機器,執(zhí)行時間自然較慢。

從庫壓力更大:

  • 讀寫分離后,主庫負(fù)責(zé)寫請求,從庫負(fù)責(zé)讀請求。
  • 互聯(lián)網(wǎng)應(yīng)用一般讀請求更多,所以從庫讀壓力更大,占用更多CPU資源。

網(wǎng)絡(luò)延遲:

當(dāng)主庫的Bin Log文件往從庫上發(fā)送時,可能產(chǎn)生網(wǎng)絡(luò)延遲,也會導(dǎo)致從庫數(shù)據(jù)跟不上。

主庫有大事務(wù):

當(dāng)主庫上有個大事務(wù)需要執(zhí)行5分鐘,把Bin Log文件發(fā)送到從庫,從庫至少也需要執(zhí)行5分鐘,所以這時候從庫就出現(xiàn)了5分鐘的延遲。

主從同步延遲的解決方案?

從庫機器性能較差:

把從庫換成跟主庫同等規(guī)格的機器。

從庫壓力更大:

多搞幾臺從庫,分擔(dān)讀請求壓力。

網(wǎng)絡(luò)延遲:

聯(lián)系運維或者云服務(wù)提供商解決。

主庫有大事務(wù):

把大事務(wù)分割成小事務(wù)執(zhí)行,大事務(wù)不但會產(chǎn)生從庫延遲,還可能產(chǎn)生死鎖,降低數(shù)據(jù)庫并發(fā)性能,所以盡量少用大事務(wù)。

5. 如何提升主從同步性能

從庫開啟多線程復(fù)制

就是在主從同步的最后兩步使用多線程,修改配置 slave_parallel_workers=4,代表開啟4個復(fù)制線程。

修改同步模式,改為異步

主從同步共有三種復(fù)制方式:

全同步復(fù)制:

當(dāng)主庫執(zhí)行完一個事務(wù),并且所有從庫都執(zhí)行完該事務(wù)后,才給客戶端返回成功。

半同步復(fù)制:

至少有一個從庫執(zhí)行完成后,就給客戶端返回成功。

異步復(fù)制:

主庫執(zhí)行完后,立即返回成功,不關(guān)心從庫是否執(zhí)行完成。

如果對數(shù)據(jù)安全性要求沒那么高,可以把同步模式改成半同步復(fù)制或者異步復(fù)制。

修改從庫Bin Log配置

修改sync_binlog配置:

sync_binlog=0 ,表示寫binlog不立即刷新磁盤,由系統(tǒng)決定什么時候刷新磁盤。

sync_binlog=1,每次寫binlog都刷新磁盤,安全性高,性能差。

sync_binlog=N,寫N次binlog才刷新磁盤。

從庫對數(shù)據(jù)安全性要求沒那么高,可以設(shè)置sync_binlog=0。

修改innodb_flush_log_at_trx_commit配置:

innodb_flush_log_at_trx_commit=0,每隔一秒鐘,把事務(wù)日志刷新到磁盤。

innodb_flush_log_at_trx_commit=1,每次事務(wù)都刷新到磁盤。

innodb_flush_log_at_trx_commit=2,每次事務(wù)都不主動刷新磁盤,由系統(tǒng)決定什么時候刷新磁盤。

從庫對數(shù)據(jù)安全性要求沒那么高,可以設(shè)置innodb_flush_log_at_trx_commit=2。

知識點總結(jié)

到此這篇關(guān)于一文詳解MySQL主從同步原理的文章就介紹到這了,更多相關(guān)MySQL主從同步原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Ubuntu下mysql安裝和操作圖文教程

    Ubuntu下mysql安裝和操作圖文教程

    這篇文章主要為大家詳細(xì)分享了Ubuntu下mysql安裝和操作圖文教程,喜歡的朋友可以參考一下
    2016-05-05
  • Mac下MySQL初始化密碼操作

    Mac下MySQL初始化密碼操作

    個人在Mac上操作數(shù)據(jù)庫,遇到的啟動數(shù)據(jù)庫問題的簡單記錄。接下來通過本文給大家介紹Mac下MySQL初始化密碼操作,需要的朋友參考下
    2017-03-03
  • MySQL數(shù)據(jù)庫內(nèi)置函數(shù)使用說明

    MySQL數(shù)據(jù)庫內(nèi)置函數(shù)使用說明

    這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫內(nèi)置函數(shù)使用說明的相關(guān)資料,MySQL提供了多種內(nèi)置函數(shù)來實現(xiàn)不同的功能,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • MySQL學(xué)習(xí)之日期函數(shù)的用法詳解

    MySQL學(xué)習(xí)之日期函數(shù)的用法詳解

    本文將學(xué)習(xí)MySQL的日期函數(shù),在前面章節(jié)的練習(xí)中,我們就利用過NOW()函數(shù)來獲取過當(dāng)前系統(tǒng)時間,用DATEDIFF函數(shù)來計算日期相差的天數(shù),接下來我們就系統(tǒng)的學(xué)習(xí)一下 日期函數(shù)
    2022-08-08
  • 深入理解MySQL重做日志 redo log

    深入理解MySQL重做日志 redo log

    redo log:被稱為物理日志,記錄的就是最終修改后的按頁面存儲的數(shù)據(jù)頁,直接存數(shù)據(jù)最終的狀態(tài),用于確保事務(wù)的持久性,本文主要介紹了MySQL重做日志 redo log,感興趣的了解一下
    2022-04-04
  • 正確理解Mysql中的列索引和多列索引

    正確理解Mysql中的列索引和多列索引

    本篇文章是對Mysql中的列索引和多列索引進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • SQL使用WHERE條件語句的項目實踐

    SQL使用WHERE條件語句的項目實踐

    本文將介紹WHERE子句中使用的通用語法,它還將概述如何在單個WHERE子句中組合多個搜索條件謂詞以更細(xì)粒度的方式過濾數(shù)據(jù),以及如何使用NOT操作符排除而不是包含滿足給定搜索條件的行,感興趣的可以了解一下
    2023-09-09
  • Mysql CASE IF 判空的具體使用

    Mysql CASE IF 判空的具體使用

    MySQL 中的條件表達(dá)式用于根據(jù)條件的結(jié)果選擇不同的值或執(zhí)行不同的操作,本文主要介紹了Mysql CASE IF 判空的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • 深入淺析MySQL從刪庫到跑路_高級(一)——數(shù)據(jù)完整性

    深入淺析MySQL從刪庫到跑路_高級(一)——數(shù)據(jù)完整性

    數(shù)據(jù)完整性是指數(shù)據(jù)的可靠性和準(zhǔn)確性,數(shù)據(jù)完整性類型有四種,本文給大家提到,接下來通過本文給大家介紹MySQL從刪庫到跑路的內(nèi)容分析,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • MySQL對varchar類型數(shù)字進行排序的實現(xiàn)方法

    MySQL對varchar類型數(shù)字進行排序的實現(xiàn)方法

    這篇文章主要介紹了MySQL對varchar類型數(shù)字進行排序的實現(xiàn)方法,文中用的是CAST方法,MySQL CAST()函數(shù)用于將值從一種數(shù)據(jù)類型轉(zhuǎn)換為另一種特定數(shù)據(jù)類型,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-04-04

最新評論