Mycat 全域性序列

2021-10-08 10:06:47 字數 4471 閱讀 3019

在實現分庫分表的情況下,資料庫自增主鍵已無法保證主鍵的全域性唯一。所以,mact提供了全區sequence,並且提供了包含本地配置和資料庫配置等多種實現方式。

1. 本地檔案

原理:此方式mycat將sequence配置到檔案中,當使用到sequence中的配置後,mycat會更下classpath中的 sequence_conf.properties檔案中sequence當前的值。

配置方式:

#在sequence_conf.properties檔案中做如下配置: global_seq.hisids= 

global_seq.minid=1001

global_seq.maxid=1000000000

global_seq.curid=1000

其中hisids表示使用過的歷史分段(一般無特殊需要可不配置),minid表示最小id值,maxid表示最大id值,curid表示當前 id值。

server.xml中配置:

sequncehandlertype需要配置為0,表示使用本地檔案方式。

使用示例:

insert

into table1(id,name)

values

(next

value

for mycatseq_global,『test』)

;

資料庫方式

利用資料庫乙個表 來進行計數累加。但是並不是每次生成序列都讀寫資料庫,這樣效率太低。

mycat 會預載入一部分號段到 mycat 的記憶體中,這樣大部分讀寫序列都是在記憶體中完成的。 如果記憶體中的號段用完了 mycat 會再向資料庫要一次。

但是,如果mycat掛了,mycat 啟動後會向資料庫申請新的號段,原有號段會棄用。 也就是說如果 mycat 重啟,那麼損失是當前的號段沒用完的號碼,但是不會因此出現主鍵重複。

配置:

在dn1資料結點建立mycat_sequence表:

create

table mycat_sequence (

name varchar(50

)not

null

,#名稱

current_value int

notnull

,#當前value

increment int

notnull

default

100,

#mycat在資料庫中一次讀取多少個sequence

插入一條sequence:

;

設定sequence值:

例如:

配置server.xml:

指定sequencehandlertype=1,為資料庫方式。(0=本地檔案、1=資料庫、2=時間戳)

注意:mycat_sequence表和以上的3個function,需要放在同乙個節點上。function請直接在具體節點的資料庫上執行,如果執行的時候報:

you might want to use the less safe log_bin_trust_function_creators variable

需要對資料庫做如下設定:

windows下my.ini[mysqld]加上

log_bin_trust_function_creators=1

linux下/etc/my.cnf下my.ini[mysqld]加上

log_bin_trust_function_creators=1

修改完後,即可在mysql資料庫中執行上面的函式.

測試:登入mycat,插入資料

insert

into orders(id, amount, customer_id, order_type)

values

(next

value

for mycatseq_orders,

1000

,101

,102);

insert

into orders(id, amount, customer_id, order_type)

values

(next

value

for mycatseq_orders,

1000

,101

,103

);

時間戳

全域性id = 64位二進位制(42(毫秒)+ 5(機器id)+ 5(機器業務編碼)+ 12(重複累加))換算成十進位制為18位數的long型別,每毫秒可以併發12位二進位制的累加。

優點:配置簡單;

缺點:18位id過長;

自主生成全域性序列

根據業務邏輯組合

利用redis或zookeeper生成全域性id。

mycat 全域性序列

解決主鍵衝突問題 例如id自增的order表,如果分布式情況下不處理的話,當每個表的第一條資料id都是1。怎麼確保id唯一呢?解決辦法 1 本地檔案 不推薦 2 資料庫方式 推薦 3 時間戳 位數較多,佔空間多,並且不安全 資料庫方式詳解 原理 利用資料庫的乙個表來進行計數累加。但是並不是每次生成序...

Mycat全域性序列號

全域性序列號是mycat提供的乙個新功能,為了實現分庫分表情況下,表的主鍵是全域性唯一,而預設的mysql的自增長主鍵無法滿足這個要求。全域性序列號的語法符合標準sql規範。其格式為 next value for mycatseq global 其中mycatseq global是序列號的名字,my...

Mycat快速入門 三 全域性序列號

在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全域性唯一。為此,mycat 提供了全域性 sequence,並且提供了包含本地配置和資料庫配置等多種實現方式。序列號處理器型別,感覺 sequnce 序列號是不是少了個e字母,應該是 sequence 關於全域性序列號的測試是在mycat分...