從 0 到 1:用 MyCat 打造可水平擴展的 MySQL 分庫分表架構

一、為什么要分庫分表?

單機 MySQL 的極限大致在:

維度經驗值
單表行數≤ 1 000 萬行(B+ 樹三層)
單庫磁盤≤ 2 TB(SSD)
單機 QPS≤ 1 萬(InnoDB)

當業務繼續增長,數據量和并發量都會突破單機天花板,此時就需要 水平拆分
業內常見方案:

  • Client 模式:ShardingSphere-JDBC、TDDL
  • Proxy 模式:MyCat、ShardingSphere-Proxy、Vitess

今天的主角是 MyCat —— 輕量級、配置簡單、社區成熟,適合中小團隊快速落地。


二、MyCat 是什么?

一句話:
MyCat 是 MySQL 協議的代理中間件,對外表現為“一臺”大 MySQL,內部幫你把 SQL 路由到真正的分片。

核心概念:

名詞作用
schema邏輯庫(業務代碼看到的)
table邏輯表(可配置分片規則)
dataNode分片節點(邏輯庫+物理庫名)
dataHost物理實例(主從/集群)
rule分片算法(取模、范圍、哈希等)

三、實戰目標

  • 3 臺 MySQL 物理機
  • 訂單表 t_order 按 user_id 取模 分成 6 張分表
  • 商品表 t_product 數據量少 → 全局廣播表
  • 配置表 t_config 全局廣播
  • Java 代碼零侵入,只連 MyCat 8066 端口

四、環境準備

角色IP:Port備注
MyCat 節點192.168.1.10:8066 / 9066代理端口/管理端口
MySQL-1192.168.1.100:3306主庫
MySQL-2192.168.1.101:3306主庫
MySQL-3192.168.1.102:3306主庫

4.1 安裝 MyCat

wget http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar -zxvf Mycat-server-1.6-RELEASE-*.tar.gz
cd mycat

目錄結構:

mycat├─ bin/mycat       # 啟停腳本├─ conf/*.xml      # 配置文件└─ logs            # 日志

五、MySQL 端建庫建表

每臺機執行:

CREATE DATABASE IF NOT EXISTS db1 DEFAULT CHARSET utf8mb4;
CREATE DATABASE IF NOT EXISTS db2 DEFAULT CHARSET utf8mb4;
CREATE DATABASE IF NOT EXISTS db3 DEFAULT CHARSET utf8mb4;-- 訂單分表
CREATE TABLE db1.t_order_0 (id BIGINT AUTO_INCREMENT PRIMARY KEY,user_id BIGINT NOT NULL,amount DECIMAL(10,2) NOT NULL,create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE db1.t_order_1 LIKE db1.t_order_0;CREATE TABLE db2.t_order_2 LIKE db1.t_order_0;
CREATE TABLE db2.t_order_3 LIKE db1.t_order_0;CREATE TABLE db3.t_order_4 LIKE db1.t_order_0;
CREATE TABLE db3.t_order_5 LIKE db1.t_order_0;-- 廣播表(每臺庫一份)
CREATE TABLE db1.t_product (id INT PRIMARY KEY,name VARCHAR(100),price DECIMAL(8,2)
);
CREATE TABLE db2.t_product LIKE db1.t_product;
CREATE TABLE db3.t_product LIKE db1.t_product;CREATE TABLE db1.t_config (k VARCHAR(50) PRIMARY KEY,v VARCHAR(200)
);
CREATE TABLE db2.t_config LIKE db1.t_config;
CREATE TABLE db3.t_config LIKE db1.t_config;

六、MyCat 配置

6.1 server.xml —— 用戶、邏輯庫

<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">shop</property>
</user>

6.2 schema.xml —— 邏輯表、節點、主機

<schema name="shop" checkSQLschema="false" sqlMaxLimit="100"><!-- 1) 分片表 --><table name="t_order" dataNode="dn1,dn2,dn3" rule="mod-long" /><!-- 2) 廣播表 --><table name="t_product" dataNode="dn1,dn2,dn3" type="global" /><table name="t_config"  dataNode="dn1,dn2,dn3" type="global" />
</schema><!-- 數據節點 -->
<dataNode name="dn1" dataHost="host1" database="db1" />
<dataNode name="dn2" dataHost="host2" database="db2" />
<dataNode name="dn3" dataHost="host3" database="db3" /><!-- 物理主機 -->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.1.100:3306" user="root" password="mysql123" />
</dataHost>
<dataHost name="host2" ...> ... </dataHost>
<dataHost name="host3" ...> ... </dataHost>

6.3 rule.xml —— 取模算法

<tableRule name="mod-long"><rule><columns>user_id</columns><algorithm>mod-long</algorithm></rule>
</tableRule><function name="mod-long" class="io.mycat.route.function.PartitionByMod"><property name="count">3</property> <!-- 3 節點 × 2 表 = 6 分片 -->
</function>

七、啟動 MyCat

bin/mycat start   # 啟動
tail -f logs/mycat.log  # 觀察 “success”

測試連通:

mysql -uroot -p123456 -h127.0.0.1 -P8066 -Dshop

八、Java 代碼示例(零侵入)

8.1 Maven 依賴

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency>

8.2 連接池配置

spring:datasource:url: jdbc:mysql://192.168.1.10:8066/shop?useSSL=false&serverTimezone=UTCusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

8.3 訂單 DAO(MyBatis 示例)

@Mapper
public interface OrderMapper {@Insert("INSERT INTO t_order(user_id,amount) VALUES(#{userId},#{amount})")void insert(@Param("userId") Long userId, @Param("amount") BigDecimal amount);@Select("SELECT * FROM t_order WHERE user_id = #{userId}")List<Order> findByUserId(Long userId);
}

8.4 商品 DAO

@Select("SELECT * FROM t_product WHERE id = #{id}")
Product getProduct(Integer id);

商品表全局廣播,JOIN 時不會跨庫:

SELECT o.id, o.amount, p.name
FROM t_order o
JOIN t_product p ON o.product_id = p.id
WHERE o.user_id = 123;   -- 只在 1 個分片執行

九、擴容與運維

9.1 水平擴容(從 3 → 6 節點)

  1. 新增 3 臺 MySQL,建 db4/db5/db6,建相同 6 張分表 t_order_6 … t_order_11
  2. 修改 rule.xmlcount 改成 6。
  3. mysqldump / mydumper 把舊數據按 user_id mod 6 重新分布。
  4. 灰度切流 → 觀察 → 下線舊節點。

9.2 一致性校驗(廣播表)

# 1. 安裝 percona-toolkit
pt-table-checksum h=192.168.1.100,u=checksum_user,p=xxx \--databases=db1,db2,db3 --tables=t_product,t_config
# 2. 差異行修復
pt-table-sync --print --execute ...  # 自動生成修復 SQL

十、踩坑與最佳實踐

說明解決方案
全局序列自增主鍵在分片后沖突雪花算法 / MyCat 全局序列
深分頁LIMIT 1000000,10 會拉全表游標分頁 / ES 搜索
跨分片 JOINMyCat 只能內存合并反范式冗余或應用層拼裝
廣播表 DDL漏執行導致查詢報錯統一腳本 + pt-osc

十一、小結

  • MyCat = 透明代理 + 路由規則 + 全局表 + 讀寫分離,幾分鐘就能把單機 MySQL 擴展到百節點百億行
  • 小表全局廣播,大表水平拆分,業務代碼零改動。
  • 監控、擴容、一致性校驗要提前規劃,否則 3 個月后追悔莫及。

參考資料
MyCat 官方文檔 https://www.yuque.com/books/share/05b6e74e-9a1a-4e5d-a21e-4f93e9e3d5a3

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

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

相關文章

電池模組奇異值分解降階模型

了解如何將奇異值分解 (SVD) 降階模型 (ROM) 應用于電池模塊熱模擬。挑戰隨著電池模塊在電動汽車和儲能系統中的重要性日益提升&#xff0c;其熱性能管理也成為一項重大的工程挑戰。高功率密度會產生大量熱量&#xff0c;如果散熱不當&#xff0c;可能導致電池性能下降、性能下…

《Python函數:從入門到精通,一文掌握函數編程精髓》

堅持用 清晰易懂的圖解 代碼語言&#xff0c;讓每個知識點變得簡單&#xff01; &#x1f680;呆頭個人主頁詳情 &#x1f331; 呆頭個人Gitee代碼倉庫 &#x1f4cc; 呆頭詳細專欄系列 座右銘&#xff1a; “不患無位&#xff0c;患所以立。” Python函數&#xff1a;從入門到…

【記錄貼】STM32 I2C 控制 OLED 卡死?根源在 SR1 與 SR2 的讀取操作

問題描述最近在復用以前STM32F407控制OLED的代碼&#xff0c;移植到STM32F103 上&#xff0c;使用硬件 I2C 通信方式。按照常規流程&#xff0c;先發送 OLED 的從機地址&#xff0c;OLED 有正常應答&#xff0c;但當發送第一個控制命令&#xff08;0xAE&#xff09;前的控制字節…

【AI驅動的語義通信:突破比特傳輸的下一代通信范式】

文章目錄1 語義通信簡介1.1 基本概念&#xff1a;什么是語義通信&#xff1f;語義通信的核心目標1.2 基本結構&#xff1a;語義通信系統結構語義通信系統的通用結構組成語義通信系統的結構關鍵模塊1.3 基于大模型的語義通信關鍵技術&#x1f9e0;語義通信系統中AI大模型的設計建…

網絡原理-HTTP

應用層自定義協議自定義協議是指根據特定需求設計的通信規則&#xff0c;用于設備或系統間的數據交換。其核心在于定義數據結構、傳輸方式及處理邏輯。協議結構示例典型的自定義協議包含以下部分&#xff1a;頭部&#xff08;Header&#xff09;&#xff1a;標識協議版本、數據…

ROS配置debug指南

一. 安裝插件 下面的這一個插件過期了需要用下面的這一個插件來替換:二. 設置CMakeLists.txt的編譯模式 set(CMAKE_BUILD_TYPE "Debug") set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAG…

微軟正式將GPT-5接入Microsoft Copilot Studio(國際版)

微軟宣布正式在Microsoft Copilot Studio&#xff08;國際版&#xff09;中集成GPT-5&#xff0c;推動智能體構建能力實現突破性升級。此次更新不僅為企業用戶帶來更高效的響應速度、更精準的語境理解能力&#xff0c;還通過增強的邏輯推理功能&#xff0c;顯著提升了AI交互的深…

微算法科技(NASDAQ:MLGO)通過蟻群算法求解資源分配的全局最優解,實現低能耗的區塊鏈資源分配

隨著區塊鏈網絡規模的不斷擴大和業務需求的日益復雜&#xff0c;資源分配問題逐漸成為制約其發展的關鍵因素之一。傳統的區塊鏈資源分配方法往往存在效率低下、能耗過高、難以達到全局最優解等問題。高能耗不僅增加了運營成本&#xff0c;還對環境造成了較大的壓力。因此&#…

深入淺出JVM:Java虛擬機的探秘之旅

深入淺出JVM&#xff1a;Java虛擬機的探秘之旅一、JVM 初相識&#xff1a;揭開神秘面紗 在 Java 的世界里&#xff0c;JVM&#xff08;Java Virtual Machine&#xff0c;Java 虛擬機&#xff09;就像是一個神秘的幕后大 boss&#xff0c;掌控著 Java 程序運行的方方面面。你可以…

Nginx學習筆記(八)—— Nginx緩存集成

&#x1f5c4;&#x1f5c4; Nginx緩存集成 &#x1f4cc;&#x1f4cc; 一、緩存核心價值 #mermaid-svg-CNji1KUDOsF8MwoY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CNji1KUDOsF8MwoY .error-icon{fill:#5522…

httpx 設置速率控制 limit 時需要注意 timeout 包含 pool 中等待時間

假設通過 httpx.Client 設置 limit 速率控制后&#xff0c;同時發起多個請求訪問 youtube。并且由于科學原因一直連接不上 假設一共 4 個連接&#xff0c;max_connection2&#xff0c;timeout5s。 默認會發生的情況不是前兩個連接 tcp 握手 timeout&#xff0c;后兩個連接再發起…

【網絡】TCP/UDP總結復盤

1.UDP的格式2.TCP的格式3.TCP是來解決什么問題的&#xff1f;答&#xff1a;解決IP層的不可靠傳輸問題&#xff0c;可能數據包丟失、損壞、重復等為上層應用層提高可靠有序的數據傳輸服務通過校驗和、確認應答機制、序列號來解決不可靠傳輸和無序性問題通過流量控制--->>…

Nginx 配置中,root 和 alias 區別

在 Nginx 配置中&#xff0c;root 和 alias 都用于定義文件路徑&#xff0c;但它們的行為有重要區別&#xff0c;特別是 路徑拼接方式 和 末尾斜杠 (/) 的影響。1. root 和 alias 的區別 (1) root 指令 作用&#xff1a;root 會將 location 的 URI 拼接到 root 路徑后面&#x…

基于vue.js的無縫滾動

方法一&#xff1a;基于requestAnimationFrame demo <template><h-page-container class"hoem-page"><h1>無縫滾動</h1><h2>垂直方向</h2><div class"container1"><AutoScroll :data"list" :item-…

【Linux學習|黑馬筆記|Day4】IP地址、主機名、網絡請求、下載、端口、進程管理、主機狀態監控、環境變量、文件的上傳和下載、壓縮和解壓

【DAY4】 今天看的是Linux第四章剩余部分 至此Linux暫時學到這&#xff0c;第五章還包含很多軟件的安裝&#xff0c;但是等我要用的時候再裝吧 我現在只裝了MySQL8.0&#xff0c;具體教程請看筆記安裝教程 內容包含更換鏡像源和安裝配置步驟 文章目錄【DAY4】6&#xff09;IP地…

【合新通信】射頻光纖傳輸模塊詳解

射頻光纖傳輸模塊是一種將射頻(RF)信號通過光纖進行傳輸的關鍵設備&#xff0c;廣泛應用于通信、軍事、廣播電視等領域。以下是關于射頻光纖傳輸模塊的全面介紹&#xff1a;基本原理與組成射頻光纖傳輸模塊主要由以下幾部分組成&#xff1a;電光轉換單元&#xff1a;將輸入的射…

【信息收集】從GET到POST:破解登錄表單的全流程

目標&#xff1a;將瀏覽器數據代理至BP的proxy模塊。將個人PHP的留言板項目首頁登錄數據包代理至BP&#xff0c;并轉發至intrder模塊&#xff0c;進行暴力破解。免責聲明&#xff1a;本文章內容僅用于個人網絡安全知識學習與研究&#xff0c;嚴禁用于任何未經授權的攻擊或非法活…

【辦公自動化】如何使用Python操作PPT和自動化生成PPT?

在現代商業和教育環境中&#xff0c;PowerPoint演示文稿是信息傳遞的重要工具。通過Python自動化PPT創建和編輯過程&#xff0c;可以大幅提高工作效率&#xff0c;特別是在需要批量生成或更新演示文稿的場景下。本文將介紹如何使用python-pptx庫實現PPT自動化&#xff0c;并提供…

18 ABP Framework 模塊管理

ABP Framework 模塊管理 概述 該頁面詳細介紹了在 ABP Framework 解決方案中使用 ABP CLI 及相關工具添加、更新和管理模塊的方法。模塊管理是 ABP 模塊化架構的核心&#xff0c;支持可重用業務和基礎設施功能的集成。模塊通常以 NuGet 和/或 NPM 包的形式分發&#xff0c;有時…

外觀模式C++

外觀模式&#xff08;Facade Pattern&#xff09;是一種結構型設計模式&#xff0c;它為復雜系統提供一個簡化的接口&#xff0c;隱藏系統內部的復雜性&#xff0c;使客戶端能夠更輕松地使用系統。這種模式通過創建一個外觀類&#xff0c;封裝系統內部的交互邏輯&#xff0c;客…