成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Mycat的實(shí)踐二:全局序列號(hào)

DesGemini / 1575人閱讀

摘要:這里應(yīng)該是的顯示,配置成了時(shí)間戳序列方式了,顯示的還是本地文件方式部分安裝參考百度初始化插入等測(cè)試受影響的行時(shí)間總結(jié)我們?cè)诜植际降沫h(huán)境下,建議全局序列的順序

上一節(jié)回顧 如果你還初識(shí)mycat,你可以閱讀

Mycat的實(shí)踐一:初始Mycat

遇到的問(wèn)題
通過(guò)上一節(jié)的學(xué)習(xí),我們遇到了一個(gè)insert無(wú)法插入的問(wèn)題

我們思考一個(gè)問(wèn)題,我們上一節(jié)在mysql上創(chuàng)建了3個(gè)分庫(kù),每個(gè)分庫(kù)下每一個(gè)對(duì)應(yīng)的表
CREATE TABLE `travelrecord` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(22) NOT NULL DEFAULT "",
  `time` int(10) unsigned NOT NULL DEFAULT "0",
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

這里的id是自增長(zhǎng),如果是在mycat的分布式下,肯定面臨這一個(gè)id序列的增長(zhǎng)問(wèn)題。

如果我們各自在mysql端的三個(gè)庫(kù)分別插入不同的數(shù)據(jù),如:
use mycat-db1;
insert into travelrecord(name, time) values("test1", 0);
use mycat-db2;
insert into travelrecord(name, time) values("test1", 0);
use mycat-db3;
insert into travelrecord(name, time) values("test1", 0);

這里面臨的每一個(gè)庫(kù)下增長(zhǎng)各自分離,所以可能不同db之間下的id可能會(huì)重復(fù)

mycat肯定要解決不同datahost下的datanode的結(jié)合后邏輯表下面的序列重復(fù)問(wèn)題,所以插入就遇到了問(wèn)題

接下去我們通過(guò)mycat的全局序列號(hào)解決插入的問(wèn)題
Mycat 全局序列號(hào) 簡(jiǎn)介
在實(shí)現(xiàn)分庫(kù)分表的情況下,數(shù)據(jù)庫(kù)自增主鍵已無(wú)法保證自增主鍵的全局唯一。為此, MyCat 提供了全局sequence,并且提供了包含本地配置和數(shù)據(jù)庫(kù)配置等多種實(shí)現(xiàn)方式
全局序列的三種方式
1. 本地文件
缺點(diǎn):在mycat重啟后,配置文件中sequence會(huì)恢復(fù)到初始值,造成下次操作序列重復(fù)
優(yōu)點(diǎn):本地加載,讀取速度較快

2. 數(shù)據(jù)庫(kù)
優(yōu)點(diǎn):在mycat重啟后,sequence值不會(huì)被初始化
缺點(diǎn):如果存取sequence的數(shù)據(jù)庫(kù)掛了,會(huì)遇到單點(diǎn)故障

3. 時(shí)間
優(yōu)點(diǎn):不存在上面兩種方案因?yàn)閙ycat的重啟導(dǎo)致id重復(fù)的現(xiàn)象
缺點(diǎn):數(shù)據(jù)類型太長(zhǎng),建議采用bigint(最大取值18446744073709551615)

4. zookeeper
建議采用,zookeeper自身解決單點(diǎn)和序列問(wèn)題
本地方式 mycat conf/server.xml配置調(diào)整
0
查看配置是否生效
# 重啟mycat
# 先停止 startup_nowrap.bat
bin/startup_nowrap.bat

我這邊是通過(guò)navicat連接(command)
# mysql -uroot -p123456 -p 9066

show @@sysparam;

# output: 輸出了本地文件方式,表示配置成功
...
| sequnceHandlerType            | 本地文件方式  | 指定使用Mycat全局序列的類型。|
...
插入數(shù)據(jù)
# 第一次嘗試
insert into travelrecord(name) values("20180802 13:32");
# output: 提示錯(cuò)誤了,提示了什么ID列沒(méi)有提供
[SQL]insert into travelrecord(name) values("20180802 13:32");
[Err] 1064 - bad insert sql (sharding column:ID not provided,INSERT INTO travelrecord (name)
VALUES ("20180802 13:32")

# 第二次嘗試
insert into travelrecord(id, name) values(next value for MYCATSEQ_GLOBAL, "20180802 13:32");
# output: 成功
受影響的行: 1
時(shí)間: 0.004s

不過(guò)這樣寫起來(lái)很麻煩,而且會(huì)改變現(xiàn)有業(yè)務(wù)里的代碼,因?yàn)槲覀兇蟛糠种暗膯螜C(jī)業(yè)務(wù)的代碼是不會(huì)寫id的,都是利用mysql的主鍵自增長(zhǎng)
next value for MYCATSEQ_XXX 說(shuō)明
是mycat用于分布式序列生成的的一種方式,在mycat里這個(gè)根據(jù)sequnceHandlerType的三種方式對(duì)應(yīng)到不同的三個(gè)配置文件分別是:
sequence_conf.properties -> 本地
sequence_db_conf.properties -> mysql
sequence_time_conf.properties -> time
sequence_distributed_conf.properties -> zookeeper等分布式支持

上個(gè)測(cè)試我們使用了next value for MYCATSEQ_GLOBAL
打開sequence_conf.properties查看

COMPANY.MAXID=2000
GLOBAL.MAXID=20000
COMPANY.HISIDS=
CUSTOMER.MAXID=2000
HOTNEWS.CURID=1000
ORDER.MINID=1001
CUSTOMER.HISIDS=
HOTNEWS.MINID=1001
TRAVELRECORD.MAXID=2000000
GLOBAL.CURID=10003
ORDER.MAXID=2000
TRAVELRECORD.HISIDS=
COMPANY.CURID=1000
CUSTOMER.CURID=1000
COMPANY.MINID=1001
GLOBAL.MINID=10001
HOTNEWS.MAXID=2000
CUSTOMER.MINID=1001
TRAVELRECORD.CURID=506
GLOBAL.HISIDS=
HOTNEWS.HISIDS=
ORDER.CURID=1000
TRAVELRECORD.MINID=5001
ORDER.HISIDS=

# 查看我們之前插入的數(shù)據(jù):
select * from travelrecord;
...
| 10002 | 20180802 13:32 |    0 |
...
我們看到id插入是10002,自增長(zhǎng)來(lái)自GLOBAL.CURID
自增長(zhǎng)式插入
# schema.xml里的配置增加2個(gè)屬性, mycat會(huì)根據(jù)表自動(dòng)獲取到sequence配置里的屬性
# 
# mycat重啟

insert into travelrecord(name) values("20180802 13:49");
# output: 成功
受影響的行: 1
時(shí)間: 0.004s

# 查看我們之前插入的數(shù)據(jù):
select * from travelrecord;
...
|   507 | 20180802 13:49 |    0 |
...
我們看到id插入是507,自增長(zhǎng)來(lái)自TRAVELRECORD.CURID數(shù)據(jù)庫(kù)方式mycat conf/server.xml配置調(diào)整
1
查看配置是否生效
同上不重復(fù)了

| sequnceHandlerType            | 數(shù)據(jù)庫(kù)方式    | 指定使用Mycat全局序列的類型。|
sql
# 序列表
CREATE TABLE `mycat_sequence` (
  `name` varchar(50) NOT NULL,
  `current_value` int(11) NOT NULL,
  `increment` int(11) NOT NULL DEFAULT "1",
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# mycat_seq_currval函數(shù)
CREATE FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 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

# mycat_seq_nextval函數(shù)
CREATE FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC
BEGIN
    UPDATE MYCAT_SEQUENCE
        SET current_value = current_value + increment
    WHERE
        NAME = seq_name;

RETURN mycat_seq_currval (seq_name);
END

# mycat_seq_setval函數(shù)
CREATE FUNCTION `mycat_seq_setval`(
    seq_name VARCHAR (50), VALUE INTEGER
) RETURNS varchar(64) CHARSET utf8 DETERMINISTIC
BEGIN
    UPDATE MYCAT_SEQUENCE
        SET current_value = VALUE
    WHERE
        NAME = seq_name;
RETURN mycat_seq_currval (seq_name);
END

# test
select mycat_seq_currval("TRAVELRECORD");
# output: 800,1
插入一條記錄
INSERT INTO `mycat-db1`.`mycat_sequence` (`name`, `current_value`, `increment`) VALUES ("TRAVELRECORD", "800", "1");
插入數(shù)據(jù)測(cè)試
insert into travelrecord(name) values("20180802 14:18");
# output: 成功
受影響的行: 1
時(shí)間: 0.004s

# 查看我們之前插入的數(shù)據(jù):
select * from travelrecord;
...
|   801 | 20180802 14:18 |    0 |
...
我們看到id插入是801,自增長(zhǎng)來(lái)自數(shù)據(jù)表,查看數(shù)據(jù)庫(kù)表, 并自動(dòng)修改表的當(dāng)前記錄+1(我們的increment=1)

# 切換到真實(shí)的mycat-db1
select * from mycat_sequence;
| TRAVELRECORD |           801 |         1 |
時(shí)間方式mycat conf/server.xml配置調(diào)整
2
查看配置是否生效
同上不重復(fù)了

| sequnceHandlerType            | 本地文件方式  | 指定使用Mycat全局序列的類型。 |

# 這里應(yīng)該是mycat的顯示bug,配置成了時(shí)間戳序列方式了,顯示的還是本地文件方式
插入等測(cè)試
select next value for MYCATSEQ_GLOBAL;
# 1024911601620357120

select next value for MYCATSEQ_GLOBAL;
# 1024911649208930304

insert into travelrecord(name) values("20180808 14:56")
#output: 
[Err] 1064 - can"t find any valid datanode :TRAVELRECORD -> ID -> 1024911922555916288
# 上面的出錯(cuò),是因?yàn)槲覀兊谋聿迦氲穆酚煞绞绞莚ule="auto-sharding-long",找不到這么多的序列對(duì)應(yīng)的datanode
# 調(diào)整 rule="mod-long",并修改三個(gè)真實(shí)分庫(kù)的id未bigint(20) 并重啟mycat


insert into travelrecord(name) values("20180808 15:01");
# 受影響的行: 1
# 時(shí)間: 0.048s


select * from travelrecord;
...
| 1024910441362624512 | 20180802 14:51 |    0 |
...
分布式方式(zookeeper)mycat conf/server.xml配置調(diào)整
3
查看配置是否生效
同上不重復(fù)了

| sequnceHandlerType            | 本地文件方式  | 指定使用Mycat全局序列的類型。 |

# 這里應(yīng)該是mycat的顯示bug,配置成了時(shí)間戳序列方式了,顯示的還是本地文件方式
zookpeeper部分
安裝參考百度
myid.properties:
loadZk=true
zkURL=127.0.0.1:2181
clusterId=mycat-cluster-1
myid=mycat_fz_01
clusterNodes=mycat_fz_01,mycat_fz_02,mycat_fz_04
#server  booster  ;   booster install on db same server,will reset all minCon to 1
type=server
boosterDataHosts=localhost1
初始化mycat zk
bin/init_zk_data.cmd
插入等測(cè)試
select next value for MYCATSEQ_GLOBAL;
# 5328679401562341409
select next value for MYCATSEQ_GLOBAL;
# 5328680350783668258

insert into travelrecord(name) values("20180808 15:58");
# 受影響的行: 1
# 時(shí)間: 0.048s


select * from travelrecord;
...
| 5328681411405709347 | 20180808 15:58 |    0 |
...
總結(jié)
我們?cè)趍ycat分布式的環(huán)境下,建議全局序列id的順序: zookeeper > mysql > timestamp(SnowFlake) > localfile

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29158.html

相關(guān)文章

  • Mycat實(shí)踐一:初始Mycat

    摘要:通過(guò)完成可視化配置,及智能監(jiān)控,自動(dòng)運(yùn)維。通過(guò)本地節(jié)點(diǎn),完整的解決數(shù)據(jù)擴(kuò)容難度,實(shí)現(xiàn)自動(dòng)擴(kuò)容機(jī)制,解決擴(kuò)容難點(diǎn)。支持基于的主從切換及集群化管理。通過(guò)智能優(yōu)化,分析分片熱點(diǎn),提供合理的分片建議,索引建議,及數(shù)據(jù)切分實(shí)時(shí)業(yè)務(wù)建議。 Mycat Mycat簡(jiǎn)介 1. 一個(gè)徹底開源的,面向企業(yè)應(yīng)用開發(fā)的大數(shù)據(jù)庫(kù)集群 2. 支持事務(wù)、ACID、可以替代MySQL的加強(qiáng)版數(shù)據(jù)庫(kù) 3. 一個(gè)可以視為...

    Paul_King 評(píng)論0 收藏0
  • MyCat簡(jiǎn)單使用與配置

    基本配置 1 . 在mycat/conf目錄下,MyCat核心配置文件:schema.xml select user() ...

    CoderStudy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看

        <