【分布式理論14】分布式數據庫存儲:分表分庫、主從復制與數據擴容策略

文章目錄

    • 一、分表分庫
      • 1. 數據分表的必要性與方式
      • 2. 數據分庫原則與優勢
    • 二、主從復制
      • 1. 讀寫分離架構設計
      • 2. 數據復制方式
      • 3. MySQL實現主從復制
      • 4. MySQL主從復制實踐與高可用方案
    • 三、數據擴容

隨著業務的不斷發展和數據量的增長,傳統的單機關系型數據庫已經逐漸不能滿足高效存儲和快速訪問的需求。在這種背景下,分布式數據庫存儲成為了解決這些問題的重要策略。通過分表分庫、主從復制以及數據擴容等技術,分布式數據庫可以提高存儲的可擴展性、性能和可靠性。接下來,我們將詳細介紹這些關鍵策略及其應用。

一、分表分庫

1. 數據分表的必要性與方式

在傳統數據庫中,隨著單表數據量的增加操作數據庫時會產生巨大的開銷,導致系統效率降低。例如,在MySQL中,當單表記錄數過多時,插入數據時可能會對表加鎖,這會導致后續的請求排隊等待,從而影響系統的整體性能。為了解決這一問題,通常建議MySQL單表的記錄數控制在500萬條以內,但實際情況要根據具體的業務需求和硬件配置來決定。

為了應對數據量過大的問題,分表技術應運而生。分表的方式主要有兩種:垂直分表和水平分表。

  1. 垂直分表:將表中的字段根據業務需求拆分到不同的表中。例如,將不常用的字段或長字段拆分出來,這樣可以避免查詢時產生“跨頁”問題。此方法通常在數據庫設計的初期就進行。

  2. 水平分表:根據某個關鍵字段(如ID)進行Hash計算,將數據拆分到多個表中。例如,可以通過對ID取模的方式,將數據分配到不同的表中。除了ID外,還可以按時間、地域等標準進行分表。

然而,分表雖然帶來了性能提升,但也引入了跨表數據查詢、ID生成和事務處理等新問題。針對這些問題,有以下解決思路:

  • 跨表數據的Join:可以在應用層進行多次查詢,并合并結果。
  • 跨表數據生成ID:可以使用UUID或Sequence表來生成ID,但這些方式的效率和空間利用有時不盡如人意。大廠常用的snowflake算法(由Twitter開源)就是一種高效生成ID的方式。
  • 跨表數據的排序和分頁:可以先對分表數據進行排序、分頁、聚合等操作,再合并數據進行進一步處理,或者先合并數據后再進行這些操作。
  • 跨表事務處理:可以通過補償事務或采用TCC(Try-Confirm-Cancel)模式來保證跨表事務的一致性。

?

2. 數據分庫原則與優勢

在分表的基礎上,隨著數據量和請求量的不斷增長,單一數據庫的存儲能力和訪問能力已無法滿足需求,這時就需要采用分庫技術。分庫技術可以將數據庫按照一定的規則拆分到多個數據庫中,減輕單個數據庫的負擔。

分庫的常見原則有:

  1. 按業務分庫:根據不同的業務模塊將數據分到不同的數據庫中。例如,訂單數據、核算數據和評價數據可以分別存儲在不同的數據庫中。
  2. 按冷熱數據分庫:根據數據訪問頻率的不同,將高頻、中頻和低頻的數據分庫存儲。頻繁訪問的數據存儲在高性能數據庫中,減少訪問延遲。
  3. 按訪問地域或時間范圍分庫:根據地域或者時間來劃分數據存儲的數據庫。例如,可以將不同地區或不同時間段產生的數據分配到不同的數據庫中。

通過分庫,將多個數據庫組成集群,應用程序通過負載均衡代理來訪問這些數據庫,實現讀寫分離,極大地提高了數據庫的可用性。同時,分庫也便于進行健康監控、熔斷、選舉等機制的實施,從而保障數據庫系統的高可用性。

?

二、主從復制

1. 讀寫分離架構設計

在分布式數據庫中,為了提高數據庫的并發處理能力,通常會采用讀寫分離的架構。具體來說,數據庫的寫操作由主庫處理,讀操作由從庫來承擔。這樣,主庫和從庫之間就形成了一個分離的架構,從庫可以分擔主庫的讀請求壓力。當讀請求較多時,可以通過增加從庫來進一步擴展系統的讀性能。

?

2. 數據復制方式

為了保證主庫和從庫數據的一致性,需要對主庫的數據進行復制。數據復制可以分為同步和異步兩種方式:

  1. 同步數據復制:主庫在進行寫操作時,必須先將數據同步到從庫,確認從庫同步成功后,才會返回給用戶。這樣做能夠確保主從數據的一致性,但也會犧牲部分系統的可用性,因為寫操作需要等待同步完成。

  2. 異步數據復制:主庫在進行寫操作后,直接返回結果給用戶,數據復制則在后臺進行。雖然這樣可以提高系統的可用性,但也可能導致主從數據不一致的問題,尤其是在從庫還未同步完成時,應用讀取到的數據可能存在問題。

?

3. MySQL實現主從復制

以MySQL為例,MySQL的主從復制過程如下:

  1. 從庫的IO線程連接到主庫,獲取Binary Log的指定位置和偏移量。
  2. 主庫在數據更新時,將更新信息通知從庫。
  3. 從庫IO線程將這些更新信息存入relay Log,并記錄日志文件名和位置。
  4. 從庫的SQL線程解析relay Log內容,執行SQL語句,從而完成數據的同步。

在這里插入圖片描述

MySQL支持兩種數據復制方式:Row Level和Statement Level。Row Level復制記錄每條數據的修改操作,能夠更精確地同步數據,但會增加日志的存儲和網絡傳輸負擔;而Statement Level復制記錄執行的SQL語句,相對節省空間和IO成本,但對主從數據庫版本的要求較高,建議主庫的版本低于從庫版本。

?

4. MySQL主從復制實踐與高可用方案

在實際應用中,為了實現高可用性,除了傳統的主從復制,還有主主復制(雙主模式)等方案。在主主模式下,兩個主服務器之間互為備份,通常會暴露一個虛擬IP(VIP),并根據服務器的健康狀態進行切換。也可以通過中間件如MyCat和ZooKeeper實現更高級的高可用性,ZooKeeper提供了選舉機制來選擇新的主服務器,從而確保系統的高可用性。

?


如下圖:MyCat 通過 ZooKeeper 對主節點 writeHost(負責寫入)和從節點 readHost(負責讀取)進行心跳檢測。接收到請求時,MyCat 依據 SQL 解析結果,將 DML SQL 發往 writeHost,Select SQL 發往 readHost。writeHost 完成寫入后與 readHost 進行主從復制。若 writeHost 掛掉,n 次心跳檢測未恢復,MyCat 發起選舉新 writeHost,原 writeHost 恢復后變為 readHost 接收數據同步。
?

在這里插入圖片描述

?

三、數據擴容

隨著數據量和并發量的不斷增長,數據庫需要不斷擴容以滿足需求。以主從數據庫擴容為例,假設原本有2個數據庫集群,在擴容時可以將數據庫數量增加到4個。擴容時,需要將原先基于ID取模的分表方式改為新的模4運算,重新分配數據并進行代理配置的調整。擴容后的系統,主庫和從庫之間可以繼續進行復制,進一步提高系統的可用性和性能。

具體操作如下:

  1. 初始數據分布:在2個數據庫集群中,每個集群含主備(M0、S0 和 M1、S1),通過對記錄ID進行模2運算,結果為0的數據存于M0和S0所在集群,結果為1的數據存于M1和S1所在集群。主庫寫入數據后,從庫主動同步以保證數據一致。

在這里插入圖片描述

  1. 集群擴展操作:當將2個集群擴展為4個時,將模2運算切換為模4運算,原從庫S0和S1變為主庫,負載均衡器按ID%4算法將部分數據路由到它們上面,同時S0和S1停止與原主庫同步。只需修改代理配置,無需重啟服務。之后可通過后臺服務刪除冗余數據。
    在這里插入圖片描述

  2. 保障數據庫可用性:擴展到4個主庫后進行主從復制,為每個主庫建立從庫,主庫負責寫操作,從庫負責讀操作,后續擴容可參照此方法。

在這里插入圖片描述

?

《分布式架構原理與實踐-崔皓》

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

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

相關文章

vxe-grid 通過配置式給單元格字段格式化樹結構數據,轉換樹結構節點

vxe-grid 通過配置式給單元格字段格式化樹結構數據,轉換樹結構節點 比如用戶自定義配置好的數據源,通過在列中配置好數據,全 json 方式直接返回給前端渲染,不需要寫任何格式化方法。 官網:https://vxetable.cn npm i…

延遲任務的11種實現方式(下)!!

接上文: Redisson的RDelayedQueue Redisson他是Redis的兒子(Redis son),基于Redis實現了非常多的功能,其中最常使用的就是Redis分布式鎖的實現,但是除了實現Redis分布式鎖之外,它還實現了延遲…

BS5852英國家具防火安全條款主要包括哪幾個方面呢?

什么是BS5852檢測? BS5852是英國針對家用家具的強制性安全要求,主要測試家具在受到燃燒香煙和火柴等火源時的可燃性。這個標準通常分為四個部分進行測試,但實際應用中主要測試第一部分和第二部分,包括煙頭測試和利用乙炔火焰模擬…

如何使用Spark SQL進行復雜的數據查詢和分析

使用Spark SQL進行復雜的數據查詢和分析是一個涉及多個步驟和技術的過程。以下是如何使用Spark SQL進行復雜數據查詢和分析的詳細指南: 一、準備階段 環境搭建: 確保已經安裝并配置好了Apache Spark環境。準備好數據源,可以是CSV文件、JSON…

iOS事件傳遞和響應

背景 對于身處中小公司且業務不怎么復雜的程序員來說,很多技術不常用,你可能看過很多遍也都大致了解,但是實際讓你講,不一定講的清楚。你可能說,我以獨當一面,應對自如了,但是技術的知識甚多&a…

FFmpeg 源碼編譯安裝

參考: https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu Linux (Ubuntu) 下載 FFmpeg 源碼,并將其解壓,這里我將它放在 ~/ffmpeg_source 目錄下; cd ~/ffmpeg_sources wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org…

【pytest】編寫自動化測試用例命名規范README

API_autoTest 項目介紹 1. pytest命名規范 測試文件: 文件名需要以 test_ 開頭或者以 _test.py 結尾。例如,test_login.py、user_management_test.py 這樣的命名方式,pytest 能夠自動識別并將其作為測試文件來執行其中的測試用例。 測試類…

Windows桌面系統管理5:Windows 10操作系統注冊表

Windows桌面系統管理0:總目錄-CSDN博客 Windows桌面系統管理1:計算機硬件組成及組裝-CSDN博客 Windows桌面系統管理2:VMware Workstation使用和管理-CSDN博客 Windows桌面系統管理3:Windows 10操作系統部署與使用-CSDN博客 Wi…

llama.cpp將sensor格式的大模型轉化為gguf格式

前言 ollama本地只能導入gguf格式的大模型文件,將safetensors 文件轉化為gguf格式。需要使用 llama.cpp 這個開源工具。以下是使用 llama.cpp 轉換 .safetensors 格式模型到 .gguf 格式的詳細步驟: 1. 首先克隆并編譯 llama.cpp: 克隆項目 git clone https://gi…

【運維】源碼編譯安裝cmake

背景: 已經在本地源碼編譯安裝gcc/g,現在源碼安裝cmake 下載源碼 下載地址:CMake - Upgrade Your Software Build System 安裝步驟: ./bootstrap --prefix/usr/local/cmake make make install 錯誤處理 1、提示找不到libmpc.…

如何通過AI優化敏捷開發中的任務管理與分配?

用ChatGPT做軟件測試 在現代軟件開發中,敏捷開發(Agile)已成為一種廣泛采用的開發方法論,其核心思想是強調快速響應變化、與客戶的持續溝通以及團隊協作的高效性。然而,隨著項目規模的不斷擴大,敏捷開發面臨…

petalinux高版本設置自動登錄和開機自啟動配置

petalinux-config -c rootfs 依次選擇 Image Features -> serial-autologin-root 這是配置 進來就是root權限 創建并安裝名為 myapp-init 的新建應用程序 petalinux-create -t apps --template install -n myapp-init --enable 編輯 project-spec/meta-user/recipes-…

STM32 USB 設備的描述信息作用

在使用 STM32 USB 功能時 usbd_desc.c 文件中定義了一段宏,以下解每段宏的用途。 #define USBD_VID 1155 #define USBD_LANGID_STRING 1033 #define USBD_MANUFACTURER_STRING "STMicroelectronics" #define US…

React通用登錄/注銷功能實現方案(基于shadcn/ui)

React通用登錄/注銷功能實現方案(基于shadcn/ui) 一、功能需求分析二、通用功能封裝1. 通用登錄表單組件2. 認證Hook封裝 三、功能使用示例1. 登錄頁面實現2. 用戶菜單實現 四、路由保護實現五、方案優勢 一、功能需求分析 需要實現以下核心功能&#x…

jEasyUI 創建學校課程表

jEasyUI 創建學校課程表 引言 隨著信息技術的飛速發展,教育行業也迎來了數字化轉型的浪潮。學校課程表的創建和管理作為教育信息化的重要組成部分,其效率和準確性直接影響到學校的教學秩序。jEasyUI,作為一款優秀的開源UI框架,憑借其易用性、靈活性和豐富的組件,成為了許…

Linux 內核中的 container_of 宏:以 ipoib_rx_poll_rss 函數為例

在 Linux 內核編程中,container_of 是一個非常實用的宏,主要用于通過結構體的成員指針來獲取包含該成員的整個結構體的指針。rx_ring = container_of(napi, struct ipoib_recv_ring, napi); 在代碼中就是利用了這個宏,下面我們詳細分析它的作用和工作原理。 背景知識 在內…

【論文學習】RVS-FDSC:一種基于四方向條帶卷積的視網膜血管分割方法以增強特征提取

寫在前面:本博客僅作記錄學習之用,部分圖片來自網絡,如需引用請注明出處,同時如有侵犯您的權益,請聯系刪除! 文章目錄 前言論文論文內容RSC模塊MSPF2 模塊RPDA模塊 實驗效果 總結互動致謝參考往期回顧 前言…

藍橋杯篇---IAP15F2K61S2矩陣鍵盤

文章目錄 前言簡介矩陣鍵盤的工作原理1.行掃描2.檢測列狀態3.按鍵識別 硬件連接1.行線2.列線 矩陣鍵盤使用步驟1.初始化IO口2.掃描鍵盤3.消抖處理4.按鍵識別 示例代碼:4x4矩陣鍵盤掃描示例代碼:優化后的矩陣鍵盤掃描注意事項1.消抖處理2.掃描頻率3.IO口配…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析?】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase19 作者:車端域控測試工程師 更新日期:2025年02月19日 關鍵詞:UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-019測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

Vue 3 30天精進之旅:Day 29 - 項目實戰

在學習了近一個月的Vue 3知識后,今天是我們學習旅程的第29天。在這一天,我們將專注于實踐,通過一個小型項目來鞏固之前的學習成果,并為之后的展示做好準備。 一、項目目標 我們將構建一個簡單的個人博客應用,具備以下…