1、原理
在資料庫中建立一張表,存放「名稱」,「當前值」,「步長」(mycat 每次讀取多少個 sequence)
sequence 獲取步驟:
1)當初次使用該sequence時,根據傳入的squence名稱,從這個表中獲取current_value 和 increment 到mycat中,並將current_value 設定為current_value+increment
2)mycat 將本次讀取到的current_value+increment 作為本次的squence,下次使用時自動加1,使用increment後,執行第一步操作。
3)mycat 維護這張張表,用到那些squence ,往表中插入一條資料即可。若某次讀取的squence 沒有用完伺服器就停止,則讀過的squence就不會再用,再從第一 步開始執行。
2 mycat配置:
1) server.xml
1配置為1 ,表示使用資料庫方式生成squence
2) 建立資料庫表(資料庫表的位置 要和schema.xml 中指定的位置相同)
也就是說 以下資料庫表和function 的建立,需要在dn1 所在的節點上。
create table mycat_sequence (
name varchar (50) not null
comment "名稱",
current_value int not null
comment "當前值",
increment int not null default 100
comment "步長",
primary key (name)
) engine = innodb ;
建立函式:
#取當前squence的值
drop function if exists mycat_seq_currval;
delimiter $$
create
function mycat_seq_currval(seq_name varchar(50))
returns varchar(64) charset `utf8`
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 ;
#設定 sequence 值
drop function if exists mycat_seq_setval;
delimiter $$
create
function mycat_seq_setval(seq_name varchar(50),value integer) returns varchar(64) charset `utf8`
begin
update mycat_sequence set current_value = value where name = seq_name;
return mycat_seq_currval(seq_name);
end$$
delimiter ;
#取下乙個sequence的值
drop function if exists mycat_seq_nextval;
delimiter $$
create
function mycat_seq_nextval(seq_name varchar(50)) returns varchar(64) charset `utf8`
begin
update mycat_sequence set current_value = current_value + increment
where name = seq_name;
return mycat_seq_currval(seq_name);
end$$
delimiter ;
插入一條初始化資料:
insert into mycat_sequence(name,current_value,increment) values('file_data_lct_1',1000,10);
name 列 就是我們配置的全域性序列號的名稱。
如果需要多個全域性序列號,可以初始化多條語句。
注意:1、mycat_sequence 表和以上的 function,需要放在同乙個節點上。這個結點就是
sequence_db_conf.properties 指定的資料庫結點
2、遠端建立function失敗,
需要對資料庫做如下設定:
/etc/my.cnf 下 my.ini
[mysqld]
加上 log_bin_trust_function_creators=1
3)配置 sequence_db_conf.properties
指定自定義的全域性序列號所在結點:
file_data_lct_1=dn1
注意:必須大寫(表名大寫)
4)重新啟動mycat
測試:
----登入到mycat 伺服器
#mysql -h
192.168.192.133 -utest -ptest -p8066 -dtestdb
----查詢出乙個序列
mysql>select next value for mycatseq_file_data_lct_1
其他使用方式:
insert intofile_data_lct_1(id,name) values(next value for
mycatseq_
file_data_lct_1,'test');
以上方式 配置了乙個全域性序列號,插入資料的時候,可以通過 引用全域性序列號獲得乙個 值,從而保證 多個分片id唯一。
如果主鍵id 是自增的,插入語句的時候,想要省略id ,
insert into file_data_lct_1(name) values(
'test');
類似這樣,該怎麼配置?
1)首先table1 表 主鍵id設定自增。
2)schema.xml 中配置 分片表 :
file_data_lct_1" primarykey="id" autoincrement="true" datanode="dn1,dn2">
3)sequence_db_conf.properties 中增加相應表配置:
file_data_lct_1=dn1
file_data_lct_1是全域性序列號的名字,正好也是表
file_data_lct_1的大寫方式。這不是巧合,mycat 故意這樣設定的。
這樣執行這條語句的時候
insert into file_data_lct_1(name) values(
'test'
);發現primarykey ="id " 並且是自增的,就回去自動尋找 表名 大寫對應 全域性序列號是否存在,
如果不存在,直接報錯。
如果存在,則 默默的獲取到 file_data_lct_1 的next value 作為 id 插入到 file_data_lct_1 中。
Mycat全域性序列號
全域性序列號是mycat提供的乙個新功能,為了實現分庫分表情況下,表的主鍵是全域性唯一,而預設的mysql的自增長主鍵無法滿足這個要求。全域性序列號的語法符合標準sql規範。其格式為 next value for mycatseq global 其中mycatseq global是序列號的名字,my...
Mycat快速入門 三 全域性序列號
在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全域性唯一。為此,mycat 提供了全域性 sequence,並且提供了包含本地配置和資料庫配置等多種實現方式。序列號處理器型別,感覺 sequnce 序列號是不是少了個e字母,應該是 sequence 關於全域性序列號的測試是在mycat分...
Mycat1 6系列全域性序列號相關測試
mycat github上 master分支進行全域性序列號測試,經過測試,在多次版本更新後功能沒有被損壞 1.6.6 druid 分支進行本地檔案方式的全域性序列號測試 新版1.66 druid分支問題,因為更新druid版本1.10,因為mysql的語法是沒有next value for myc...