分庫分表後,主鍵不再由單庫自增保證唯一。MyCAT 提供 MYCATSEQ_GLOBAL 邏輯序列,應用通過 next value for MYCATSEQ_GLOBAL 獲取全局唯一 ID,底層三種實現方式各有優劣。
0
GLOBAL=100000,100 # 起始值,步長
INSERT INTO company(id,name) VALUES (next value for MYCATSEQ_GLOBAL, 'test');
| 優點 | 缺點 |
|---|---|
| 本地讀取,延遲極低 | MyCAT 重啟後序列重置為初始值,極易主鍵衝突 |
⚠️ 僅適合單節點、非生產、可接受重啟重號的場景。
1
# 指定承載序列表的數據節點
dn1=GLOBAL
CREATE TABLE MYCAT_SEQUENCE (
NAME VARCHAR(50) NOT NULL,
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_nextval(seq_name VARCHAR(50)) RETURNS VARCHAR(64) ...
CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50), value INTEGER) RETURNS VARCHAR(64) ...
| 優點 | 缺點 |
|---|---|
| 重啟不重置,序列單調遞增 | 主從切換+MyCAT重啟易導致雙主序列衝突(見下文) |
緩解措施:故障切換後立即修復主庫、或手動調整備庫序列值(+200 步長)預留間隙。
2
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 單 MyCAT 節點、開發測試、可容忍重啟重號 | 文件模式 (0) | 最簡、最高性能 |
| 生產集群、要求重啟不重號、有運維能力處理主從切換 | 數據庫模式 (1) | 持久化可靠,需配合步長預留應對切換 |
| 高可用優先、無強連續性要求、跨機房/多活架構 | 時間戳模式 (2) | 零協調、天然分布式友好 |
MyCAT 全局序列是分庫分表的基石,選對模式、守住運維底線,才能讓分布式主鍵「生而唯一、長久唯一」。