在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全域性唯一。為此,mycat提供了以下幾種解決方式:
一、本地檔案
比方式mycat將sequence配置到檔案中,當使用到sequence中的配置後,mycat會更下classpath中的sequence_conf.properties檔案中sequence當前的值。
優點:本地載入,讀取速度較快。
缺點:抗風險能力差,mycat所在主機宕機後,無法讀取本地檔案。
二、資料庫方式
(推薦)
利用資料庫乙個表來進行計數累加。mycat會預載入一部分號段到mycat的記憶體中,這樣大部分讀寫序列都在記憶體中完成,如果記憶體中的號段用完了mycat會再向資料庫要一次。如果mycat重啟,那麼損失是當前的號段沒用完的號碼,但是不會因此出現主鍵重複。
1、建立序列指令碼
#在 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;
#建立全域性序列所需函式
delimiter $$
create function mycat_seq_currval(seq_name varchar(50)) returns varchar(64)
deterministic
begin
declare retval varchar(64);
set retval="-999999999,null";
select concat(cast(current_value as char),",",cast(increment as char)) into retval from
mycat_sequence where name = seq_name;
return retval;
end $$
delimiter ;
delimiter $$
create function mycat_seq_setval(seq_name varchar(50),value integer) returns
varchar(64)
deterministic
begin
update mycat_sequence
set current_value = value
where name = seq_name;
return mycat_seq_currval(seq_name);
end $$
delimiter ;
delimiter $$
create function mycat_seq_nextval(seq_name varchar(50)) returns varchar(64)
deterministic
begin
update mycat_sequence
set current_value = current_value + increment where name = seq_name;
return mycat_seq_currval(seq_name);
end $$
delimiter ;
#初始化序列表記錄
2、修改mycat配置vim sequence_db_conf.properties
意思是orders這個序列在dn1這個節點上,具體dn1是哪台機器需要檢視schema.xml
1
全域性序列型別(sequncehandlertype):0-本地檔案;1-資料庫方式;2-時間戳方式
3、重啟mycat
mycat console
4、寫入資料並驗證
#登入 mycat,插入資料
insert into orders(id,amount,customer_id,order_type) values(next value for mycatseq_orders,1000,101,102);
重啟mycat後再寫入資料並驗證
三、時間戳方式
全域性序列id=64位二進位制(42(毫秒)+5(機器id)+5(業務編碼)+12(重複累加))換算成十進位制為18位數的long型別,每毫秒可以併發12位二進位制的累加。
優點:配置簡單
缺點:18位id過長
四、自主生成全域性序列
可在專案裡自己生成全域性序列,如下
1、根據業務邏輯組合
2、利用redis的單執行緒原子性incr來生成序列
mycat分表擴充套件之全域性序列 資料庫方式
1.在dn1上建庫序列指令碼 在 dn1 上建立全域性序列表 create table mycat sequence name varchar 50 not null,current value int not null,increment int not null default 100,prim...
Mycat 全域性序列
在實現分庫分表的情況下,資料庫自增主鍵已無法保證主鍵的全域性唯一。所以,mact提供了全區sequence,並且提供了包含本地配置和資料庫配置等多種實現方式。1.本地檔案 原理 此方式mycat將sequence配置到檔案中,當使用到sequence中的配置後,mycat會更下classpath中的...
mycat 全域性序列
解決主鍵衝突問題 例如id自增的order表,如果分布式情況下不處理的話,當每個表的第一條資料id都是1。怎麼確保id唯一呢?解決辦法 1 本地檔案 不推薦 2 資料庫方式 推薦 3 時間戳 位數較多,佔空間多,並且不安全 資料庫方式詳解 原理 利用資料庫的乙個表來進行計數累加。但是並不是每次生成序...