MyCat 通過全局序列號保證分片環境下主鍵唯一性,支援本地文件、數據庫表、時間戳等多種生成方式。本文詳細講解最常用的「本地文件」與「數據庫表」兩種模式的配置原理、操作步驟及避坑指南。
核心原理:MyCat 啟動時讀取 sequence_conf.properties 文件中的序列號範圍(MINID、MAXID、CURID),運行期間在內存中遞增,定期或關閉時持久化回文件。
sequence_conf.properties:
# 全局序列號配置示例 GLOBAL.HISIDS= GLOBAL.MINID=10001 GLOBAL.MAXID=20000 GLOBAL.CURID=10000
server.xml 啟用文件模式:
<property name="sequnceHandlerType">0</property>
優缺點:配置簡單、無外部依賴、性能極高;但單點故障風險大,集群模式下無法共享序列號,重啟可能導致 ID 重複或大幅跳躍。
核心原理:利用後端 MySQL 表 MYCAT_SEQUENCE 存儲當前值與步長,配合三個自定義函數(mycat_seq_currval、mycat_seq_setval、mycat_seq_nextval)實現原子化獲取,天然支援集群高可用。
CREATE TABLE MYCAT_SEQUENCE (
NAME VARCHAR(50),
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 100,
PRIMARY KEY (NAME)
) ENGINE=INNODB;
INSERT INTO MYCAT_SEQUENCE (NAME, current_value, increment) VALUES ('GLOBAL', 100000, 100);
-- 獲取當前值 CREATE FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) ... -- 設置值 CREATE FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) ... -- 獲取下一值(含行鎖與 GET_LOCK 保證並發安全) CREATE FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) ...
server.xml 切換模式:
<property name="sequnceHandlerType">1</property>
insert into travelrecord(id,name) values(next value for MYCATSEQ_GLOBAL,'test');
increment 即 Step 值,建議設置 100-1000 平衡性能與 ID 緊湊度。GET_LOCK 實現分布式鎖,避免多 MyCat 實例並發獲取衝突。| 維度 | 本地文件 | 數據庫表 |
|---|---|---|
| 配置複雜度 | 低 | 中 |
| 集群支援 | 不支援 | 完美支援 |
| 故障恢復 | 靠文件備份 | 靠數據庫備份 |
| 性能 | 極高(內存操作) | 高(一次網絡交互可用多次) |
| 適用場景 | 單節點測試/低並發 | 生產集群/高並發/高可用 |