成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試必備:聊聊MySQL的主從

數據庫 MySQL
大家好,我是撿田螺的小男孩。金三銀四面試的時候,面試官經常會問MySQL主從。今天就跟大家聊聊MySQL的主從。

前言

  • 數據庫主從概念、優點、用途
  • 數據庫主從復制原理
  • 主主、主從、主備的區別
  • MySQL是怎么保證主從一致的
  • 數據庫主從延遲的原因與解決方案
  • 聊聊數據庫的高可用方案

一. 數據庫主從概念、優點、用途

主從數據庫是什么意思呢,主是主庫的意思,從是從庫的意思。數據庫主庫對外提供讀寫的操作,從庫對外提供讀的操作。

數據庫為什么需要主從架構呢?

  • 高可用,實時災備,用于故障切換。比如主庫掛了,可以切從庫。
  • 讀寫分離,提供查詢服務,減少主庫壓力,提升性能
  • 備份數據,避免影響業務。

二. 數據庫主從復制原理

主從復制原理,簡言之,分三步曲進行:

  • 主數據庫有個bin log二進制文件,紀錄了所有增刪改SQL語句。(binlog線程)
  • 從數據庫把主數據庫的bin log文件的SQL 語句復制到自己的中繼日志 relay log(io線程)
  • 從數據庫的relay log重做日志文件,再執行一次這些sql語句。(Sql執行線程)

詳細的主從復制過程如圖:

從復制過程分了五個步驟進行:

  • 主庫的更新SQL(update、insert、delete)被寫到binlog
  • 從庫發起連接,連接到主庫。
  • 此時主庫創建一個binlog dump thread,把bin log的內容發送到從庫。
  • 從庫啟動之后,創建一個I/O線程,讀取主庫傳過來的bin log內容并寫入到relay log
  • 從庫還會創建一個SQL線程,從relay log里面讀取內容,從ExecMasterLog_Pos位置開始執行讀取到的更新事件,將更新內容寫入到slave的db

三. 主主、主從、主備的區別

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

數據庫主從:一臺是主數據庫,同時對外提供讀寫操作。一臺是從數據庫,對外提供讀的操作。數據從主庫同步到從庫。

數據庫主備:一臺是主數據庫,同時對外提供讀寫操作。一臺是備庫,只作為備份作用,不對外提供讀寫,主機掛了它就取而代之。數據從主庫同步到備庫。

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

四. MySQL是怎么保證主從一致的

我們學習數據庫的主從復制原理后,了解到從庫拿到并執行主庫的binlog日志,就可以保持數據與主庫一致了。這是為什么呢?哪些情況會導致不一致呢?

4.1 長鏈接

主庫和從庫在同步數據的過程中斷怎么辦呢,數據不就會丟失了嘛。因此主庫與從庫之間維持了一個長鏈接,主庫內部有一個線程,專門服務于從庫的這個長鏈接的。

4.2 binlog格式

binlog 日志有三種格式,分別是statement,row和mixed。

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

delete from t where a > '666' and create_time<'2022-03-01' limit 1;

我們知道,數據庫選擇了a索引和選擇create_time索引,最后limit 1出來的數據一般是不一樣的。所以就會存在這種情況:在binlog = statement格式時,主庫在執行這條SQL時,使用的是索引a,而從庫在執行這條SQL時,使用了索引create_time。最后主從數據不一致了。

如何解決這個問題呢?

可以把binlog格式修改為row。row格式的binlog日志,記錄的不是SQL原文,而是兩個event:Table_map 和 Delete_rows。Table_map event說明要操作的表,Delete_rows event用于定義要刪除的行為,記錄刪除的具體行數。row格式的binlog記錄的就是要刪除的主鍵ID信息,因此不會出現主從不一致的問題。

但是如果SQL刪除10萬行數據,使用row格式就會很占空間的,10萬條數據都在binlog里面,寫binlog的時候也很耗IO。但是statement格式的binlog可能會導致數據不一致,因此設計MySQL的大叔想了一個折中的方案,mixed格式的binlog。所謂的mixed格式其實就是row和statement格式混合使用,當MySQL判斷可能數據不一致時,就用row格式,否則使用就用statement格式。

五. 數據庫主從延遲的原因與解決方案

主從延遲是怎么定義的呢?與主從數據同步相關的時間點有三個

  • 主庫執行完一個事務,寫入binlog,我們把這個時刻記為T1;
  • 主庫同步數據給從庫,從庫接收完這個binlog的時刻,記錄為T2;
  • 從庫執行完這個事務,這個時刻記錄為T3。

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

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

  • 如果從庫所在的機器比主庫的機器性能差,會導致主從延遲,這種情況比較好解決,只需選擇主從庫一樣規格的機器就好。
  • 如果從庫的壓力大,也會導致主從延遲。比如主庫直接影響業務的,大家可能使用會比較克制,因此一般查詢都打到從庫了,結果導致從庫查詢消耗大量CPU,影響同步速度,最后導致主從延遲。這種情況的話,可以搞了一主多從的架構,即多接幾個從庫分攤讀的壓力。另外,還可以把binlog接入到Hadoop這類系統,讓它們提供查詢的能力。
  • 大事務也會導致主從延遲。如果一個事務執行就要10分鐘,那么主庫執行完后,給到從庫執行,最后這個事務可能就會導致從庫延遲10分鐘啦。日常開發中,我們為什么特別強調,不要一次性delete太多SQL,需要分批進行,其實也是為了避免大事務。另外,大表的DDL語句,也會導致大事務,大家日常開發關注一下哈。
  • 網絡延遲也會導致主從延遲,這種情況你只能優化你的網絡啦,比如帶寬20M升級到100M類似意思等。
  • 如果從數據庫過多也會導致主從延遲,因此要避免復制的從節點數量過多。從庫數據一般以3-5個為宜。
  • 低版本的MySQL只支持單線程復制,如果主庫并發高,來不及傳送到從庫,就會導致延遲。可以換用更高版本的Mysql,可以支持多線程復制。

   六. 聊聊數據的庫高可用方案

  • 雙機主備
  • 一主一從
  • 一主多從
  • MariaDB同步多主機
  • 數據庫中間件

6.1 雙機主備高可用

  • 架構描述:兩臺機器A和B,A為主庫,負責讀寫,B為備庫,只備份數據。如果A庫發生故障,B庫成為主庫負責讀寫。修復故障后,A成為備庫,主庫B同步數據到備庫A
  • 優點:一個機器故障了可以自動切換,操作比較簡單。
  • 缺點:只有一個庫在工作,讀寫壓力大,未能實現讀寫分離,并發也有一定限制

6.2 一主一從

  • 架構描述: 兩臺機器A和B,A為主庫,負責讀寫,B為從庫,負責讀數據。如果A庫發生故障,B庫成為主庫負責讀寫。修復故障后,A成為從庫,主庫B同步數據到從庫A。
  • 優點:從庫支持讀,分擔了主庫的壓力,提升了并發度。一個機器故障了可以自動切換,操作比較簡單。
  • 缺點:一臺從庫,并發支持還是不夠,并且一共兩臺機器,還是存在同時故障的機率,不夠高可用。

6.3 一主多從

  • 架構描述: 一臺主庫多臺從庫,A為主庫,負責讀寫,B、C、D為從庫,負責讀數據。如果A庫發生故障,B庫成為主庫負責讀寫,C、D負責讀。修復故障后,A也成為從庫,主庫B同步數據到從庫A。
  • 優點:多個從庫支持讀,分擔了主庫的壓力,明顯提升了讀的并發度。
  • 缺點:只有臺主機寫,因此寫的并發度不高

6.4 MariaDB同步多主機集群

  • 架構描述:有代理層實現負載均衡,多個數據庫可以同時進行讀寫操作;各個數據庫之間可以通過Galera Replication方法進行數據同步,每個庫理論上數據是完全一致的。
  • 優點:讀寫的并發度都明顯提升,可以任意節點讀寫,可以自動剔除故障節點,具有較高的可靠性。
  • 缺點:數據量不支持特別大。要避免大事務卡死,如果集群節點一個變慢,其他節點也會跟著變慢。

6.5 數據庫中間件

  • 架構描述:mycat分片存儲,每個分片配置一主多從的集群。
  • 優點:解決高并發高數據量的高可用方案
  • 缺點:維護成本比較大。

參考與感謝

  • 極客時間《MySQL45講》
  • 數據庫高可用方案[1]
責任編輯:龐桂玉 來源: 數據庫開發
相關推薦

2025-01-15 15:47:36

2019-10-23 10:15:04

MySQL數據庫

2023-07-03 08:57:45

Master服務TCP

2025-05-06 07:45:12

2021-11-12 09:30:46

滑動窗口算法

2021-10-09 09:52:49

MYSQL開發數據庫

2022-05-23 08:43:02

BigIntJavaScript內置對象

2021-11-17 08:11:35

MySQL

2023-06-12 09:09:19

MySQLDDLNSTANT

2023-11-09 11:56:28

MySQL死鎖

2021-12-27 08:22:18

Kafka消費模型

2024-07-04 17:22:23

2022-02-04 21:56:59

回溯算法面試

2024-10-12 16:25:12

2022-04-27 09:28:11

HTTPExpires

2024-11-15 15:27:09

2025-04-07 00:00:00

MySQL數據庫服務器

2022-11-26 08:16:26

2019-07-26 11:27:25

MySQLSQL數據庫

2023-04-24 14:54:09

JVM性能調優
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产中文字幕在线 | 欧美日韩国产精品一区 | 午夜大片 | 亚洲综合99| 亚洲区一区二 | 欧美aⅴ片 | 久优草 | 色婷婷综合久久久中文字幕 | 亚洲看片网站 | 性一区 | 久久久精品综合 | 狠狠入ady亚洲精品经典电影 | 在线中文视频 | 欧美片网站免费 | 99久热在线精品视频观看 | 伊人精品久久久久77777 | 二区高清| 国产999精品久久久久久 | 成人免费视频网站在线看 | 人成在线 | 精品视频一区二区 | 久久久久久国产精品 | 亚洲一本 | 暴草美女| 精品精品| 亚洲一区免费 | 国产免费看 | 国产视频中文字幕 | 一级中国毛片 | 欧美精品一二三 | 日韩中文字幕视频在线观看 | 狠狠干天天干 | 亚洲日本欧美 | 国产精品久久久av | 亚洲第一色av | 不卡在线一区 | 国产电影一区二区 | 中文字幕在线观看www | 久久精品91久久久久久再现 | 99爱在线视频| 久久久久国产一区二区三区 |