日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

分布式序列

數據訪問代理提供了生成分布式環境下的分布式唯一序列(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 規則為示例:

rule

全局序列

通過配置分布式序列,獲取全局序列的核心步驟如下:

  1. 在 DB 中創建 dbp_sequence 表。

    • 建議您在數據訪問代理中創建邏輯表 dbp_sequence 時,讓數據訪問代理去創建 DB 中的 dbp_sequence 表(數據訪問代理會按照分表規則,自動創建相應的表)。

    • 假如是分表模式,則添加的分表必須以 sharding_col 為分表字段,例如 #sharding_col#%4 ,注意這個字段不能變。

  2. 在客戶端使用 SELECT user.nextval FROM dual WHERE sharding_col = xxxx 去獲取 sequence。

    • 其中,dualsharding_col 不能變。

    • user 代表客戶的邏輯表,會被數據訪問代理填充到 dbp_sequence 表的 name 字段里面去,表示該 sequence 是為 user 這個表產生的。但是,這里沒有強相關性,只是為了程序中好控制唯一性。

數據訪問代理上的邏輯表,示例如下:

dbp 邏輯表

dbp_sequence 的分表規則,示例如下:

dbp_sequence 分表規則

物理數據庫中的表和內容示例如下:

物理數據庫表
說明

表中內容是客戶端運行 SQL 后自動創建的,其中 SQL 是用來獲取 sequence 的。

獲取 sequence 的 SQL 代碼,示例如下:

獲取 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

修改時間。