數據訪問代理提供了生成分布式環境下的分布式唯一序列(Sequence)的能力,該序列有全局唯一、全局遞增的特性,常用于分庫分表下的主鍵、業務主鍵生成的場景。
數據訪問代理分布式序列功能是基于數據庫實現,如果需要使用該功能,需要在業務數據庫中創建 dbp_sequence
表。
普通序列
數據訪問代理的分布式序列功能提供了類 Oracle 語法的 SQL 語句,seq_name.nextval
,其中 seq_name
是任意字符串,一般是一張邏輯表使用同一個 seq_name
,基于單庫單表的 dbp_sequence
表實現。使用如下:
SELECT order_seq.nextval FROM dual
業務序列
如前面提到的,分布式序列功能基于數據庫表實現,dbp_sequence
可以部署成單庫單表模式,同樣也可以部署成分庫分表模式,分庫分表模式下有如下優點:
提升 Sequence 表的讀寫能力。
提升 Sequence 表的可用性,無單點故障。
通過將 Sequence 表和業務數據表部署在一起,保持數據拆分規則一致,方便生成業務主鍵。
數據訪問代理的分布式序列在 nextVal
語法基礎下,擴展了更多業務型的字段,在獲得 Sequence 值之外,還可以獲得更多分庫分表相關的信息,開發者可以根據實際場景靈活組裝業務的序列號。使用如下:
SELECT
order_seq.timestamp, order_seq.dbtimestamp, order_seq.groupid,
order_seq.tableid, order_seq.nextval
FROM dual
WHERE sharding_col =?
其中各項字段的含義:
timestamp
:獲取 Sequence 的時間戳,該時間是機器時間。dbtimestamp
:獲取 Sequence 數據庫的時間,使用該命令的話,數據訪問代理會實時向物理數據庫請求當前時間。groupid
:獲取 Sequence 所在分片的 ID。tableid
:獲取 Sequence 所在分表的 ID。sharding_col
:獲取 Sequence 的分庫分表字段,該字段是虛擬并不真實存在,用以方便數據訪問代理計算分庫分表規則。
配置分表規則
在數據庫中添加 dbp_sequence
表的分表規則,以下是以 100 個分片 100 個分表,以 sharding_col
字段 hash 規則為示例:
全局序列
通過配置分布式序列,獲取全局序列的核心步驟如下:
在 DB 中創建
dbp_sequence
表。建議您在數據訪問代理中創建邏輯表
dbp_sequence
時,讓數據訪問代理去創建 DB 中的dbp_sequence
表(數據訪問代理會按照分表規則,自動創建相應的表)。假如是分表模式,則添加的分表必須以
sharding_col
為分表字段,例如#sharding_col#%4
,注意這個字段不能變。
在客戶端使用
SELECT user.nextval FROM dual WHERE sharding_col = xxxx
去獲取 sequence。其中,
dual
和sharding_col
不能變。user
代表客戶的邏輯表,會被數據訪問代理填充到dbp_sequence
表的name
字段里面去,表示該 sequence 是為user
這個表產生的。但是,這里沒有強相關性,只是為了程序中好控制唯一性。
數據訪問代理上的邏輯表,示例如下:
dbp_sequence
的分表規則,示例如下:
物理數據庫中的表和內容示例如下:
表中內容是客戶端運行 SQL 后自動創建的,其中 SQL 是用來獲取 sequence 的。
獲取 sequence 的 SQL 代碼,示例如下:
注意事項
分庫分表場景下,
nextval
是每個分片/分表獨立遞增,不同分片/分表的nextval
會有重復的情況。所以請拼接其他信息用以區分,如:groupid
。nextval
不保證嚴格遞增,且也有上限,默認nextval
在 1 ~ 99999999 中重復循環。單條 SQL 中不支持多個 Sequence 名字。
附錄
dbp_sequence 建表語句
CREATE TABLE dbp_sequence (
`id` INT AUTO_INCREMENT,
`name` VARCHAR(255),
`value` INT,
`min_value` BIGINT,
`max_value` BIGINT,
`step` BIGINT,
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`id`),
UNIQUE KEY (`name`)
);
字段說明:
字段名稱 | 類型 | 說明 |
name | VARCHAR | 記錄對應的業務表名,例如:trade_order。 |
min_value | BIGINT | Sequence 最小值,用于校驗 Sequence 不能低于該數值,否則報錯,默認為 1。 |
max_value | BIGINT | Sequence 最大值,當到達最大值以后,將從 min_value 開始重新增加,默認為 99999999。 |
step | BIGINT | 一次獲取的 Sequence 區間,默認 10000。 |
value | INT | 當前 Sequence 值。 |
gmt_create | DATETIME | 創建時間。 |
gmt_modified | DATETIME | 修改時間。 |