Mycat 分表擴充套件之全域性序列

2021-10-10 19:18:23 字數 2950 閱讀 6318

在實現分庫分表的情況下,資料庫自增主鍵已無法保證自增主鍵的全域性唯一。為此,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 時間戳 位數較多,佔空間多,並且不安全 資料庫方式詳解 原理 利用資料庫的乙個表來進行計數累加。但是並不是每次生成序...