MyCat 作為國產開源數據庫中間件,其分片功能是核心競爭力。本文基於 MyCat 1.4 版本,詳細記錄按月分片(sharding-by-month)的完整配置流程、測試驗證及關鍵注意事項。
CREATE TABLE `tdate` (
`id` int(11) NOT NULL,
`createdate` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
<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 年)balance="1":所有 readHost 參與 SELECT 負載均衡switchType="1":主庫掛掉自動切換備庫<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>
格式匹配鐵律:
| dateFormat | sBeginDate 格式 | 插入 SQL 時間格式 | 分片字段類型 |
|---|---|---|---|
| yyyy-MM-dd | 2015-01-01 | 2015-01-01 / 2015-01-01 00:00:00 均可 | DATE / DATETIME |
| yyyy-MM-dd HH:mm:ss | 2015-01-01 00:00:00 | 必須 2015-01-01 00:00:00 | DATETIME |
⚠️ 強烈建議:dateFormat 與插入 SQL 時間格式嚴格保持一致,避免解析報錯。
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');
SELECT * FROM db1.tdate; -- 應包含 1月、4月、10月、次年1月
SELECT * FROM db2.tdate; -- 應包含 2月
SELECT * FROM db3.tdate; -- 應包含 3月
結果確認:數據按月正確路由至對應分片,循環映射生效。
INSERT INTO tdate(id, createdate) VALUES(...) — 缺少 createdate 會路由失敗。MyCat 1.4 非分片字段可省略(有默認值)。INSERT ... VALUES(1, NOW()) — MyCat 無法解析函數計算分片。dateFormat=yyyy-MM-dd HH:mm:ss 要求字段為 DATETIME,DATE 類型會報錯。MyCat 月分片核心在於:PartitionByMonth 函數 + dateFormat/sBeginDate 精確匹配 + 足夠數量的循環數據節點。配置看似繁瑣,實則邏輯清晰。生產落地關鍵在「格式統一、節點預留、SQL 簡單」三原則。對於時間維度明確的業務(日誌、流水、訂單),月分片是性能與運維的最佳平衡點。