MySQL主從複製原理

2022-09-30 19:39:14 字數 3896 閱讀 6539

主從資料庫是什麼意思呢,主是主庫的意思,從是從庫的意思。資料庫主庫對外提供讀寫的操作,從庫對外提供讀的操作。

資料庫為什麼需要主從架構呢?

主從複製原理,簡言之,分三步曲進行:

詳細的主從複製過程如圖:

上圖主從複製過程分了五個步驟進行:

主庫的更新sql(update、insert、delete)被寫到binlog

從庫發起連線,連線到主庫。

此時主庫建立乙個binlog dump thread,把bin log的內容傳送到從庫。

從庫啟動之後,建立乙個i/o執行緒,讀取主庫傳過來的bin log內容並寫到relay log

從庫還會建立乙個sql執行緒,從relay log裡面讀取內容,從execmasterlog_pos位置開始執行讀取到的更新事件,將更新內容寫入到sl**e的db

資料庫主主:兩台都是主資料庫,同時對外提供讀寫操作。客戶端訪問任意一台。資料存在雙向同步。

資料庫主從:一台是主資料庫,同時對外提供讀寫操作。一台是從資料庫,對外提供讀的操作。資料從主庫同步到從庫。

從庫和備庫,就是sl**e庫功能不同因此叫法不一樣而已。一般sl**e庫都會對外提供讀的功能的,因此,大家日常聽得最多的就是主從

我們學習資料庫的主從複製原理後,了解到從庫拿到並執行主庫的binlog日誌,就可以保持資料與主庫一致了。這是為什麼呢?哪些情況會導致不一致呢?

主庫和從庫在同步資料的過程中斷怎麼辦呢,資料不就會丟失了嘛。因此主庫與從庫之間維持了乙個長鏈結,主庫內部有乙個執行緒,專門服務於從庫這個長鏈結

binlog 日誌有三種格式,分別是statementrowmixed

如果是statement格式,binlog 記錄的是sql的原文,如果主庫和從庫選的索引不一致,可能會導致主庫不一致。我們來分析一下。假設主庫執行刪除這個sql(其中,acreate_time都會有索引)如下:

delete from t where a > '666' and create_time < '2022-03-02' limit 1;
我們知道,資料庫選擇了a索引和選擇create_time索引,最後limit 1出來的資料一般是不一樣的。所以就會存在這種情況:在binlog = statement格式時,主庫在執行這條sql時,使用的是索引a,而從庫在執行這條sql時,使用了索引create_time。最後主從資料不一致了。

如何解決這個問題呢?

可以把binlog格式修改為rowrow格式的binlog日誌,記錄的不是sql原文,而是兩個 event:table_mapdelete_rows。table_map event 說明要操作的表,delete_rows event 用於定義要刪除的行為,記錄刪除的具體行數。row格式的binlog記錄的就是要刪除的主鍵id資訊,因此不會出現主從不一致的問題。

但是如果sql刪除10萬行資料,使用row格式就會很佔空間的,10萬條資料都在 binlog 裡面,寫 binlog 的時候也很耗io。但是statement格式的binlog可能會導致資料不一致,因此設計mysql的大叔想了乙個折中的方案,mixed格式的 binlog。所謂的mixed格式其實就是rowstatement格式混合使用,當 mysql 判斷可能資料不一致時,就用row格式,否則使用statement格式。

主從延遲是怎樣定義的呢?與主從資料同步相關的時間點有三個

主庫執行完乙個事務,寫入binlog,我們把這個時刻記為t1;

主庫同步資料給從庫,從庫接受完這個binlog的時刻,記錄為t2

從庫執行完這個事務,這個時刻記錄為t3

所謂主從延遲,其實就是指同乙個事務,在從庫執行完的時間和在主庫執行完的時間差值,即t3-t1

哪些情況會導致主從延遲呢?

如果從庫所在的機器比主庫的機器效能差,會導致主從延遲,這種情況比較好解決,只需選擇主從庫一樣規格的機器就好。

如果從庫的壓力大,也會導致主從延遲。比如主庫直接影響業務,大家可能使用會比較克制,因此一般查詢都打到從庫了,結果導致從庫查詢消耗大量cpu,影響同步速度,最後導致主從延遲。這種情況的話,可以搞一主多從架構,即多接幾個從庫分攤讀的壓力。另外,還可以把binlog接入到hadoop這類系統,讓它們提供查詢的能力。

大事務也會導致主從延遲。如果乙個事務執行就要10分鐘,那麼主庫執行完後,給到從庫執行,最後這個事務可能就會導致從庫延遲10分鐘啦。日常開發中,我們為什麼特別強調,不要一次性delete太多sql,需要分批進行,其實也是為了避免大事務。另外,大表的ddl語句,也會導致大事務,大家日常開發關注一下哈。

網路延遲也會導致主從延遲,這種情況你只能優化你的網路啦,比如頻寬20m公升級到100m類似意思等。

如果從資料庫過多也會導致主從延遲,因此要避免複製的從節點數量過多。從庫資料一般以3-5個為宜。

低版本的mysql只支援單執行緒複製,如果主庫併發高,來不及傳送到從庫,就會導致延遲。可以換用更高版本的mysql,可以支援多執行緒複製。

mysql主從複製原理

mysql主從複製 靈活 用途及條件 mysql主從複製用途 主從部署必要條件 主從原理 mysql主從複製原理 從庫生成兩個執行緒,乙個i o執行緒,乙個sql執行緒 1 當主伺服器發生改變時,會將此改變以二進位制日誌的形式傳送到binlog中 2 而副伺服器會有乙個中繼日誌,實時監控主伺服器的b...

mysql主從複製原理

什麼是分庫分表 分表是啥意思?就是把乙個表的資料放到多個表中,然後查詢的時候你就查乙個表。比如按照使用者id來分表,將乙個使用者的資料就放在乙個表中 分庫是啥意思?就是你乙個庫一般我們經驗而言,最多支撐到併發2000,一定要擴容了,而且乙個健康的單庫併發值你最好保持在每秒1000左右,不要太大。那麼...

mysql主從複製原理

1 主伺服器上發起乙個mysql事務 2 主伺服器上使用一條或者多條sql語句。物理結構的真正實現依賴於儲存引擎,一邊會先記錄到記憶體快取中 innodb的語句被記錄到innodb事務日誌中,myisam 直接寫到表的資料檔案中 3 事務結束,主伺服器的二進位制日誌檔案記錄所使用的dml語句的結果 ...