在實現分庫分表的情況下,資料庫自增主鍵已無法保證主鍵的全域性唯一。所以,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分...