首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MyCat 月分片實戰:配置、測試與避坑全記錄

     編輯:MySQL 綜合教學

MyCat 月分片實戰:配置、測試與避坑全記錄

MyCat 作為國產開源數據庫中間件,其分片功能是核心競爭力。本文基於 MyCat 1.4 版本,詳細記錄按月分片(sharding-by-month)的完整配置流程、測試驗證及關鍵注意事項。

一、 環境與表結構

  • MyCat 版本:1.4
  • 數據節點:dn1、dn2、dn3(主從架構,3 節點循環)
  • 測試表:
CREATE TABLE `tdate` (
  `id` int(11) NOT NULL,
  `createdate` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

二、 核心配置文件

1. schema.xml - 表與數據節點映射

<table name="tdate" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10,dn11,dn12,dn13" 
       rule="sharding-by-month" />

<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataNode name="dn4" dataHost="localhost1" database="db1" />
<dataNode name="dn5" dataHost="localhost1" database="db2" />
<dataNode name="dn6" dataHost="localhost1" database="db3" />
<dataNode name="dn7" dataHost="localhost1" database="db1" />
<dataNode name="dn8" dataHost="localhost1" database="db2" />
<dataNode name="dn9" dataHost="localhost1" database="db3" />
<dataNode name="dn10" dataHost="localhost1" database="db1" />
<dataNode name="dn11" dataHost="localhost1" database="db2" />
<dataNode name="dn12" dataHost="localhost1" database="db3" />
<dataNode name="dn13" dataHost="localhost1" database="db3" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  <heartbeat>select user()</heartbeat>
  <writeHost host="hostM1" url="192.168.x.x:3306" user="root" password="xxx">
    <readHost host="hostS1" url="192.168.x.x:3306" user="root" password="xxx" />
    <readHost host="hostS2" url="192.168.x.x:3306" user="root" password="xxx" />
  </writeHost>
  <writeHost host="hostM2" url="192.168.x.x:3306" user="root" password="xxx">
    <readHost host="hostS3" url="192.168.x.x:3306" user="root" password="xxx" />
  </writeHost>
</dataHost>

關鍵說明:

  • dataNode 配置 13 個節點(覆蓋 1 年 + 1 個月緩衝),生產環境建議 ≥ 24 個節點(2 年)
  • 3 物理節點循環映射:dn1/dn4/dn7/dn10/dn13 → db1(localhost1 主庫)
  • balance="1":所有 readHost 參與 SELECT 負載均衡
  • switchType="1":主庫掛掉自動切換備庫

2. rule.xml - 分片函數定義

<tableRule name="sharding-by-month">
  <rule>
    <columns>createdate</columns>
    <algorithm>sharding-by-month</algorithm>
  </rule>
</tableRule>

<function name="sharding-by-month" class="org.opencloudb.route.function.PartitionByMonth">
  <property name="dateFormat">yyyy-MM-dd HH:mm:ss</property>
  <property name="sBeginDate">2015-01-01 00:00:00</property>
</function>

格式匹配鐵律:

dateFormatsBeginDate 格式插入 SQL 時間格式分片字段類型
yyyy-MM-dd2015-01-012015-01-01 / 2015-01-01 00:00:00 均可DATE / DATETIME
yyyy-MM-dd HH:mm:ss2015-01-01 00:00:00必須 2015-01-01 00:00:00DATETIME

⚠️ 強烈建議:dateFormat 與插入 SQL 時間格式嚴格保持一致,避免解析報錯。

三、 測試驗證

1. 插入測試數據

INSERT INTO tdate(id, createdate) VALUES(1, '2015-01-01 00:00:00');
INSERT INTO tdate(id, createdate) VALUES(2, '2015-02-01 00:00:00');
INSERT INTO tdate(id, createdate) VALUES(3, '2015-03-01 00:00:00');
INSERT INTO tdate(id, createdate) VALUES(4, '2015-10-01 00:00:00');
INSERT INTO tdate(id, createdate) VALUES(5, '2016-01-01 00:00:00');

2. 驗證分片分布

SELECT * FROM db1.tdate; -- 應包含 1月、4月、10月、次年1月
SELECT * FROM db2.tdate; -- 應包含 2月
SELECT * FROM db3.tdate; -- 應包含 3月

結果確認:數據按月正確路由至對應分片,循環映射生效。

四、 關鍵注意事項(避坑指南)

  1. INSERT 必須顯式列出分片字段
    INSERT INTO tdate(id, createdate) VALUES(...) — 缺少 createdate 會路由失敗。MyCat 1.4 非分片字段可省略(有默認值)。
  2. 分片字段值禁止使用函數
    ❌ INSERT ... VALUES(1, NOW()) — MyCat 無法解析函數計算分片。
    ✅ 應用層生成時間字符串傳入。
  3. 分片字段類型與 dateFormat 嚴格匹配
    dateFormat=yyyy-MM-dd HH:mm:ss 要求字段為 DATETIME,DATE 類型會報錯。
  4. 生產環境節點數規劃
    配置節點數 ≥ 預估運行年數 × 12 + 3(緩衝),避免中途擴容需重啟 MyCat。
  5. SQL 寫法保持簡單標準
    MyCat 容錯較弱,複雜 SQL(子查詢、CTE、窗口函數)易路由錯誤,盡量拆解為簡單語句。

五、 總結

MyCat 月分片核心在於:PartitionByMonth 函數 + dateFormat/sBeginDate 精確匹配 + 足夠數量的循環數據節點。配置看似繁瑣,實則邏輯清晰。生產落地關鍵在「格式統一、節點預留、SQL 簡單」三原則。對於時間維度明確的業務(日誌、流水、訂單),月分片是性能與運維的最佳平衡點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved