Java八股文——MySQL「架構篇」

MySQL主從復制了解嗎

面試官您好,我了解MySQL的主從復制。它是構建高可用、高可擴展數據庫架構的核心基石

1. 主從復制的核心原理與流程

整個主從復制的過程,就是一場圍繞 binlog(二進制日志) 的“接力賽”。這個過程主要可以分為三個大的階段:

  • 階段一:主庫記錄變更 (Master Writes Binlog)

    • 當主庫(Master)執行一個寫操作(INSERT, UPDATE, DELETE)并提交事務時,它會按照兩階段提交的協議,將這次數據變更的邏輯操作記錄到自己的binlog文件中。
  • 階段二:從庫同步日志 (Slave Fetches Binlog)

    • 從庫(Slave)上有一個專門的I/O線程。它的唯一任務就是與主庫建立一個長連接,并請求主庫的binlog
    • 主庫上有一個對應的 log dump線程,它在接收到從庫的請求后,會源源不斷地把新的binlog內容推送給從庫的I/O線程。
    • 從庫的I/O線程在接收到binlog數據后,并不是直接執行,而是先將其原封不動地寫入到本地的一個叫做“中繼日志”(relay log)的文件中。
    • 為什么需要relay log 這是一種解耦設計。它將“網絡數據接收”和“本地數據重放”這兩個步驟分離開。即使后續的重放操作比較慢,也不會影響I/O線程從主庫拉取數據的速度,提高了主從同步的穩定性和效率。
  • 階段三:從庫重放日志 (Slave Replays Relay Log)

    • 從庫上還有另一個專門的SQL線程(在MySQL 5.6之后可以是多線程的)。
    • 它的任務就是不斷地讀取relay log,解析出其中的SQL語句或行變更事件,然后在從庫上原樣地、按順序地執行一遍,從而使得從庫的數據與主庫保持最終一致。
2. 主從復制的模式

默認情況下,主從復制是異步的。

  • 異步復制 (Asynchronous)

    • 主庫在執行完一個事務、寫完binlog后,不會等待從庫的任何響應,會立即返回成功給客戶端。
    • 優點:性能最高,對主庫的性能影響最小。
    • 缺點數據可能不一致。如果主庫在binlog發送給從庫之前就宕機了,那么這個事務的數據就會在從庫上永久丟失,導致主從數據不一致。
  • 半同步復制 (Semi-synchronous)

    • 為了解決異步復制的數據丟失問題,MySQL引入了半同步復制。
    • 工作模式:主庫在提交事務后,會阻塞等待,直到至少有一個從庫接收到binlog并寫入自己的relay log后,主庫才會返回成功給客戶端。
    • 優點:在很大程度上保證了數據的高可用性。只要不是主從在同一時間點上一起宕機,數據就不會丟失。
    • 缺點:增加了主庫的響應延遲,對性能有一定影響。
3. 主從復制的核心應用價值
  1. 讀寫分離:這是最常見的應用。我們可以讓主庫專門負責寫操作,而將大量的讀請求,分散到多個從庫上。這極大地分擔了主庫的壓力,提升了整個數據庫集群的查詢吞吐量。
  2. 高可用與災備:當主庫發生故障時,我們可以快速地將一個從庫提升為新的主庫,從而實現服務的快速恢復,保證了業務的連續性。
  3. 數據備份:我們可以在從庫上進行數據備份,而完全不影響主庫的正常服務。
4. 面臨的挑戰
  • 主從延遲 (Replication Lag):這是主從復制中最核心的挑戰。由于網絡延遲、從庫SQL線程執行慢等原因,從庫的數據可能會落后于主庫。我們需要對主從延遲進行持續的監控和告警,并通過優化SQL、提升從庫硬件、開啟并行復制等手段來緩解這個問題。

總結一下,MySQL主從復制通過一套精巧的、基于binlog的日志同步與重放機制,為我們構建可擴展、高可用的數據庫架構提供了強大的基礎。


主從延遲都有什么處理方法?

面試官您好,主從延遲是MySQL主從架構中一個非常常見、也必須重點關注的問題。解決它,需要一個 “監控、分析、優化、容忍” 相結合的系統性方案。

第一步:監控與發現 —— “讓延遲無所遁形”

在討論如何解決之前,我們首先得能準確地監控到延遲。我會通過SHOW SLAVE STATUS;命令,重點關注以下兩個指標:

  • Seconds_Behind_Master: 這是最直觀的指標,它表示從庫SQL線程執行的時間點,落后于主庫I/O線程接收到binlog的時間點有多少秒。我會對這個值設置一個合理的閾值(比如超過5秒)進行持續的監控和告警
第二步:原因分析 —— “延遲到底發生在哪里?”

主從延遲的根本原因,是從庫消費binlog的速度,跟不上主庫生成binlog的速度。這可能發生在兩個環節:

  1. 網絡延遲:主庫和從庫之間的網絡狀況不佳,導致I/O線程拉取binlog就比較慢。
  2. 從庫執行慢(最常見的原因)
    • 從庫硬件配置差:從庫的磁盤I/O能力或CPU性能,遠低于主庫。
    • 從庫是“單線程作戰”:在MySQL 5.6之前,從庫的SQL線程是單線程的。如果主庫上是多個線程在并行寫入,而從庫卻只能串行回放,延遲就很容易產生。
    • 主庫上存在“大事務”或慢SQL:一個在主庫上執行了10分鐘的大事務,或者一條沒有索引的慢查詢,當它傳到從庫時,同樣會阻塞SQL線程10分鐘,造成巨大的延遲。
    • 從庫上有其他查詢壓力:如果從庫除了要回放binlog,還承擔了大量的實時報表、數據分析等慢查詢任務,也會拖慢SQL線程的執行。
第三步:解決方案 —— “多管齊下”

針對以上原因,我會采用一整套組合拳來解決主從延遲。

  • 1. 硬件與網絡優化(基礎保障)

    • 保證從庫的硬件配置不低于主庫,特別是磁盤I/O性能。
    • 優化主從之間的網絡連接,比如使用專線、萬兆網卡等。
  • 2. 開啟并行復制(核心優化)

    • 這是解決從庫執行慢的最核心、最有效的手段。
    • MySQL 5.6:引入了基于庫(DATABASE) 的并行復制,即不同數據庫的更新可以并行回放。
    • MySQL 5.7:引入了更強大的基于邏輯時鐘(LOGICAL_CLOCK) 的并行復制。它能做到在同一個庫內,只要是沒有數據沖突的事務,都可以并行回放,大大提升了復制效率。
    • MySQL 8.0:進一步增強,引入了基于寫集合(WRITESET) 的并行復制,能更精準地判斷事務是否可以并行。
    • 在生產環境中,開啟并合理配置并行復制是必須的操作。
  • 3. 優化主庫的SQL(源頭治理)

    • 避免大事務:在應用層,將大的DML操作,拆分成多個小事務分批執行。
    • 杜絕慢查詢:所有在主庫上執行的SQL都必須經過EXPLAIN審核,確保都用上了合適的索引,避免全表掃描。
  • 4. 架構層面的業務容忍方案

當上述優化都做了,但仍然可能存在無法完全消除的、秒級的延遲時,我們就需要從業務層面來設計一些容忍方案。

  • a. 讀寫分離的“半同步”讀取

    • 場景:對于一些對實時性要求極高的讀請求,比如用戶剛支付完,立刻查詢訂單狀態。
    • 方案:可以讓這個特定的讀請求,在執行SELECT之前,先執行一條SELECT MASTER_POS_WAIT(file, pos, timeout)命令。這個命令會阻塞當前會話,直到從庫的SQL線程追趕到指定的binlog位置(這個位置可以從寫操作成功后獲取),或者超時。這樣就能保證這次讀取,一定能讀到最新的數據。
  • b. 強制走主庫(最后的兜底方案)

    • 這是最直接但代價也最大的方案。
    • 做法:在應用代碼中,通過路由機制(比如使用特定的數據源注解),將那些絕對不能接受任何延遲的讀請求(比如金融交易的余額查詢),強制路由到主庫去執行。
    • 權衡:這個方案能100%保證數據實時性,但會增加主庫的讀壓力,需要謹慎使用,只用于最關鍵的業務路徑。

總結一下,解決主從延遲,我會先通過并行復制源頭SQL優化盡可能地縮短延遲。對于仍然存在的、不可避免的微小延遲,再通過業務層面的“半同步讀”或“強制走主庫” 等方案,來滿足不同場景對數據實時性的要求。


分表和分庫是什么?有什么區別?

面試官您好,分庫和分表是當單一數據庫或單張數據表的性能或容量達到瓶頸時,我們為了提升系統的可擴展性(Scalability) 而采用的一種核心的數據庫架構演進策略。

它們解決問題的維度不同,可以看作是兩種不同方向的“拆分”:

1. 分表 (Sharding / Partitioning) —— “內部裝修,緩解單表壓力”
  • 它是什么?
    • 分表指的是,將一張數據量巨大的單表,按照某個規則,拆分成多張結構完全相同的小表。這些小表通常還在同一個數據庫實例中。
  • 分表主要有兩種拆分方式
    • a. 垂直分表 (Vertical Partitioning)
      • 思路:“按列拆”。把一張字段非常多的“寬表”,拆分成多張“窄表”。
      • 原則:通常是把常用的、訪問頻繁的字段放在一張主表中,而把不常用的、或者字段本身很大(如TEXT, BLOB)的字段,拆分到另一張擴展表中。兩張表通過同一個主鍵關聯。
      • 解決了什么問題?
        • 提升I/O效率:核心表的單行數據變小,一個數據頁能容納更多行,查詢核心數據時I/O次數減少。
        • 緩存效率更高Buffer Pool可以用有限的內存,緩存更多核心表的數據行。
    • b. 水平分表 (Horizontal Partitioning)
      • 思路:這是我們通常意義上說的“分表”,即“按行拆”。把一張行數巨大(比如上億條)的表,按照某個規則,分散到多張物理表中。
      • 規則:常見的有按范圍(Range) 分片(如按月份、按ID區間)或按哈希(Hash) 分片(如按用戶ID取模)。
      • 解決了什么問題?
        • 緩解單表數據量瓶頸:單表數據量過大,會導致B+樹索引層高增加,查詢和寫入性能都會急劇下降。分表后,每張小表的索引樹都變得很小、很淺,性能得到極大提升。
        • 鎖競爭降低:對于高并發的寫操作,請求被分散到不同的物理表中,鎖的競爭也隨之減少。
2. 分庫 (Database Sharding) —— “另起爐灶,分散整體壓力”
  • 它是什么?
    • 分庫指的是,將一個數據庫實例,按照業務或功能,拆分成多個獨立的數據庫實例。這些實例可以部署在不同的物理服務器上。
  • 分庫也有兩種拆分方式
    • a. 垂直分庫
      • 思路:“按業務拆”。將一個龐大的、耦合的數據庫,按照業務邊界,拆分成多個獨立的微服務數據庫。
      • 例子:一個電商系統,可以拆分成“用戶庫”、“商品庫”、“訂單庫”、“支付庫”等。
      • 解決了什么問題?
        • 業務解耦與隔離:不同業務線使用獨立的數據庫,互不影響。一個業務的數據庫出現問題,不會波及到其他業務。
        • 突破單機資源瓶頸:將壓力分散到多臺服務器上,解決了單臺服務器的CPU、內存、I/O、網絡帶寬的瓶頸。
    • b. 水平分庫
      • 思路:當單個業務的數據庫(比如“訂單庫”)本身也遇到了性能瓶頸時,就需要對這個庫進行水平拆分。
      • 做法:將原先一個庫里的表,按照水平分表的方式,分散到多個數據庫實例中。比如,訂單表orders_0orders_255,可能0-127的表在DB1,128-255的表在DB2。
3. 區別與聯系
對比維度分表 (Table Sharding)分庫 (Database Sharding)
拆分對象單張大表整個數據庫實例
物理位置通常在同一個數據庫實例內分散在多個數據庫實例/服務器上
解決問題單表的查詢/寫入性能瓶頸整個數據庫的并發壓力和數據容量瓶頸
實現復雜度相對簡單復雜,引入了分布式事務等問題
常見組合通常與分庫結合使用是更大范圍的拆分策略

總結一下

  • 分表是“治標”,主要解決的是單張表因為數據量過大而導致的性能問題,它是在一個數據庫實例內部的優化。
  • 分庫是“治本”,主要解決的是整個數據庫實例因為并發壓力過大或數據容量過大而遇到的瓶可瓶頸,它將壓力分散到多個物理服務器上。

在實際的系統演進中,往往是先進行垂直分庫(按業務拆分),然后在某個業務高速發展、數據量激增時,再對這個業務的庫進行水平分庫和分表。這是一個循序漸進的架構演進過程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85597.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85597.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu下python版本升級導致pyqt不能正常運行解決

最終解決方案 ubuntu下多python版本pyqt兼容性問題解決 python3.9 -m pip install --upgrade --force-reinstall --prefer-binary pyqt5)嘗試解決方案一(失敗) 系統默認python版本可以,其他版本不行 sudo apt install pyqt5-dev-tools嘗試解決方案二(失敗) 一直…

AIGC工具平臺-VideoRetalking音頻對口型數字人

唇形合成技術正逐漸成為AIGC內容生產領域的重要工具,能夠實現音視頻數據的高度融合。基于VideoRetalking模塊的可視化界面降低了技術門檻,使非技術背景的用戶也能便捷體驗唇形驅動數字人合成的流程。 本文重點解析該模塊的使用方式及開發流程&#xff0…

前端項目如何部署為https

如何為項目部署設置HTTPS 設置HTTPS是保護網站數據傳輸安全的重要步驟。以下是設置HTTPS的主要方法: 1. 獲取SSL/TLS證書 免費證書選項 Let’s Encrypt:最流行的免費證書頒發機構Cloudflare:提供免費SSL和CDN服務ZeroSSL:另一…

nginx 配置 系統升級頁面

默認80端口配置如下: server {listen 80; # 指定端口號server_name 192.168.2.96; # 替換為實際域名或IP# 全局重定向到升級頁面(排除自身防循環)if ($request_uri !~* "/upgrade.html") {return 307 /upgrade.html; # 臨時重定…

計算機基礎(一)——設計模式

一、設計模式 設計模式(Design Patterns)是軟件開發中反復出現問題的解決方案的通用描述。 它是經過總結、提煉的高效代碼結構和設計方案,幫助開發者寫出更靈活、可維護和可擴展的代碼。 優點注意點規范代碼結構,提高開發效率設…

Mac電腦 磁盤檢測和監控工具 DriveDx

DriveDx Mac 一款不監視驅動器的內置S.M.A.R.T.狀態的先進驅動器運行狀況診斷和監測工具。 還分析了所有驅動器健康密切相關的指標, SSD或硬盤驅動器故障(像SSD磨損 /耐久性,壞扇區重新分配,離線壞道,未定扇形區&…

頻繁操作Json嵌套數據PostgreSQL配合JSON操作工具類+sql

文章目錄 1.工具類2.依賴3.sql 本文檔只是為了留檔方便以后工作運維,或者給同事分享文檔內容比較簡陋命令也不是特別全,不適合小白觀看,如有不懂可以私信,上班期間都是在得 背景:因為頻繁操作json嵌套數據 PostgreSQL得…

京東云 centos vim有操作混亂的問題

centos云服務器 安裝micro編輯器可以解決 yum install micro

限流系列之二:TDMQ CKafka 版限流方案詳解及最佳實踐

導語 在當今大數據和實時通信的時代,消息隊列在分布式系統中扮演著至關重要的角色。CKafka 作為一種高性能、高可靠的消息中間件,被廣泛應用于各種業務場景中。然而,隨著業務的增長和數據流量的增加,CKafka 在生產者和消費者以極…

消息隊列的基本概念

文章目錄 為什么需要消息隊列?🤔🎯 核心價值📋 使用場景 🏗? 架構層面的基本概念整體架構圖📦 核心組件詳解1. Broker(消息代理)2. Topic(主題)3. Partition…

Shell腳本中和||語法解析

https://www.cnblogs.com/liuyuelinfighting/p/16377705.html 在 Shell 腳本中,&& 和 || 是邏輯操作符,用于根據前一個命令的退出狀態(成功或失敗)決定是否執行后續命令。這種語法稱為 命令鏈(Command Chainin…

MySQL中的常見運算符

精選專欄鏈接 🔗 MySQL技術筆記專欄Redis技術筆記專欄大模型搭建專欄Python學習筆記專欄深度學習算法專欄 歡迎訂閱,點贊+關注,每日精進1%,共攀技術高峰 更多內容持續更新中!希望能給大家帶來幫助~ &…

高級IO技術詳解:阻塞/非阻塞IO、多路復用與內存映射

高級IO技術詳解:阻塞/非阻塞IO、多路復用與內存映射 關鍵詞:阻塞IO 非阻塞IO select/poll/epoll mmap 一、阻塞IO vs 非阻塞IO 類型行為特點設置方式阻塞IO- 讀空管道阻塞- 寫滿管道阻塞默認模式非阻塞IO- 讀空文件返回 -1,errnoEAGAIN- 寫滿…

【無標題】拓撲對偶框架的嚴格性補完與哲學突破

拓撲對偶框架的嚴格性補完與哲學突破: 一、數學嚴格性補完:同調類守恒的解決方案 1.1 負系數問題的幾何化修正 **問題本質**:當 $a_i$ 含負數時,曲率分配 $\kappa\frac{2\pi a_i}{A_{\text{max}}}$ 導致偽黎曼流形 **解決方案…

從0開始學習R語言--Day25--A/B測試 vs 多臂老虎機

通常在比較兩個不同的方案對數據的影響時,我們會各拿50%的數據去進行對照試驗,這樣觀測到的結果會最大程度地保留統計學上的特點。但實際上,并不是所有對比不同方案都要這樣做,一來,我們需要等到兩組實驗都完全結束后&…

功耗高?加密弱?愛普特APT32F1023H8S6單片機 2μA待機+AES硬件加密破局

愛普特APT32F1023H8S6單片機深度解析 1. 產品定位 APT32F1023H8S6 是愛普特半導體(APT)推出的 32位高性能單片機,基于 ARM Cortex-M0內核,主打 高集成度、低功耗、高性價比,面向消費電子、工業控制和物聯網領域。 2. …

【MFC】繪制自定義控件-顯示圖片(支持放大操作)

目錄 一、CDC類(二級緩存)二、計算視口三、放大操作代碼中初始化操作(方便以后cv) 一、CDC類(二級緩存) CDC類是設備上下文的核心類,它的作用是抽象化對圖形輸出設備(像屏幕、打印機…

在Proteus新工程中放置基本元器件

視頻教程: [最詳細]Proteus新建第一個工程與快捷鍵設置 操作步驟 1選擇這個黃色的三角,然后點擊旁邊的P,開始找元件。 2點開P后,呈現如下圖界面,我們在Keyword欄中,輸入stm32,然后他會自動出現對應的元件&…

PRUD幣推動健康數據資產化,開啟Web3隱私金融新時代

在全球健康科技與數據主權浪潮下,PRUD幣(Prudential Utility & Data Token)正成為Web3健康金融領域中的重要通證。項目通過鏈上身份綁定、健康行為證明、隱私計算與NFT機制,為用戶打造了“健康數據資產化”的創新路徑&#xf…

Mac 安裝 finalshell

1.下載 地址:FinalShell官網 第一個進入選擇對應的 mac 版本下載。 下一步下一步完成安裝。 2.鏈接虛擬機,點擊圖示文件夾 點擊新建鏈接,新建 SSH 鏈接 3.去 vmware 中查詢 Linux 系統的 IP,使用 ip addr 命令或者 ifconfig 命令皆可。 ip…