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

MyCAT 全局序列號生成三種方案深度解析:文件、數據庫、時間戳

     編輯:MySQL 綜合教學

為什麼需要全局序列

分庫分表後,主鍵不再由單庫自增保證唯一。MyCAT 提供 MYCATSEQ_GLOBAL 邏輯序列,應用通過 next value for MYCATSEQ_GLOBAL 獲取全局唯一 ID,底層三種實現方式各有優劣。

方案一:本地文件模式 (sequenceHandlerType=0)

配置



  0



GLOBAL=100000,100  # 起始值,步長

測試

INSERT INTO company(id,name) VALUES (next value for MYCATSEQ_GLOBAL, 'test');

優缺點

優點缺點
本地讀取,延遲極低MyCAT 重啟後序列重置為初始值,極易主鍵衝突
⚠️ 僅適合單節點、非生產、可接受重啟重號的場景。

方案二:數據庫持久化模式 (sequenceHandlerType=1)

配置


1


# 指定承載序列表的數據節點
dn1=GLOBAL

初始化 SQL(在物理庫 dn1 執行)

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重啟易導致雙主序列衝突(見下文)

主從切換衝突場景

  1. 雙主 A(寫)/B(讀),序列表同步復制
  2. A 掛掉,B 提升為主,MyCAT 緩存仍指向 A 的舊值
  3. 此時 MyCAT 重啟 → 讀取 B 的序列值(較小)→ 生成已用過的 ID → 主鍵衝突

緩解措施:故障切換後立即修復主庫、或手動調整備庫序列值(+200 步長)預留間隙。

方案三:本地時間戳模式 (sequenceHandlerType=2)

配置

2

特點

  • ID = 18 位時間戳(毫秒級)+ 機器標識,天然全局唯一、單調遞增
  • 無持久化依賴,重啟、遷移、主從切換均無衝突

缺點

  • ID 長度 18 位(bigint 可存),但業務若預期 64 位雪花算法風格需自行擴展
  • 不連續,無法滿足「遞增無間隙」審計需求

選型決策表

場景推薦方案理由
單 MyCAT 節點、開發測試、可容忍重啟重號文件模式 (0)最簡、最高性能
生產集群、要求重啟不重號、有運維能力處理主從切換數據庫模式 (1)持久化可靠,需配合步長預留應對切換
高可用優先、無強連續性要求、跨機房/多活架構時間戳模式 (2)零協調、天然分布式友好

最佳實踐建議

  1. 生產優先選 數據庫模式 (1),步長設 ≥ 1000,主從切換時手動預留間隙。
  2. 若架構演進至多活/異地多活,平滑遷移至 時間戳模式 (2) 或引入 Snowflake/Leaf 等獨立 ID 服務。
  3. 監控序列消耗速率,預警剩餘值 < 20% 時擴容步長或分片。

MyCAT 全局序列是分庫分表的基石,選對模式、守住運維底線,才能讓分布式主鍵「生而唯一、長久唯一」。

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