摘要:這里應(yīng)該是的顯示,配置成了時間戳序列方式了,顯示的還是本地文件方式部分安裝參考百度初始化插入等測試受影響的行時間總結(jié)我們在分布式的環(huán)境下,建議全局序列的順序
上一節(jié)回顧 如果你還初識mycat,你可以閱讀
Mycat的實踐一:初始Mycat
遇到的問題通過上一節(jié)的學(xué)習(xí),我們遇到了一個insert無法插入的問題 我們思考一個問題,我們上一節(jié)在mysql上創(chuàng)建了3個分庫,每個分庫下每一個對應(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是自增長,如果是在mycat的分布式下,肯定面臨這一個id序列的增長問題。 如果我們各自在mysql端的三個庫分別插入不同的數(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); 這里面臨的每一個庫下增長各自分離,所以可能不同db之間下的id可能會重復(fù) mycat肯定要解決不同datahost下的datanode的結(jié)合后邏輯表下面的序列重復(fù)問題,所以插入就遇到了問題 接下去我們通過mycat的全局序列號解決插入的問題Mycat 全局序列號 簡介
在實現(xiàn)分庫分表的情況下,數(shù)據(jù)庫自增主鍵已無法保證自增主鍵的全局唯一。為此, MyCat 提供了全局sequence,并且提供了包含本地配置和數(shù)據(jù)庫配置等多種實現(xiàn)方式全局序列的三種方式
1. 本地文件 缺點:在mycat重啟后,配置文件中sequence會恢復(fù)到初始值,造成下次操作序列重復(fù) 優(yōu)點:本地加載,讀取速度較快 2. 數(shù)據(jù)庫 優(yōu)點:在mycat重啟后,sequence值不會被初始化 缺點:如果存取sequence的數(shù)據(jù)庫掛了,會遇到單點故障 3. 時間 優(yōu)點:不存在上面兩種方案因為mycat的重啟導(dǎo)致id重復(fù)的現(xiàn)象 缺點:數(shù)據(jù)類型太長,建議采用bigint(最大取值18446744073709551615) 4. zookeeper 建議采用,zookeeper自身解決單點和序列問題本地方式 mycat conf/server.xml配置調(diào)整
查看配置是否生效0
# 重啟mycat # 先停止 startup_nowrap.bat bin/startup_nowrap.bat 我這邊是通過navicat連接(command) # mysql -uroot -p123456 -p 9066 show @@sysparam; # output: 輸出了本地文件方式,表示配置成功 ... | sequnceHandlerType | 本地文件方式 | 指定使用Mycat全局序列的類型。| ...插入數(shù)據(jù)
# 第一次嘗試 insert into travelrecord(name) values("20180802 13:32"); # output: 提示錯誤了,提示了什么ID列沒有提供 [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 時間: 0.004s 不過這樣寫起來很麻煩,而且會改變現(xiàn)有業(yè)務(wù)里的代碼,因為我們大部分之前的單機業(yè)務(wù)的代碼是不會寫id的,都是利用mysql的主鍵自增長next value for MYCATSEQ_XXX 說明
是mycat用于分布式序列生成的的一種方式,在mycat里這個根據(jù)sequnceHandlerType的三種方式對應(yīng)到不同的三個配置文件分別是: sequence_conf.properties -> 本地 sequence_db_conf.properties -> mysql sequence_time_conf.properties -> time sequence_distributed_conf.properties -> zookeeper等分布式支持 上個測試我們使用了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,自增長來自GLOBAL.CURID自增長式插入
# schema.xml里的配置增加2個屬性, mycat會根據(jù)表自動獲取到sequence配置里的屬性 #
查看配置是否生效1
同上不重復(fù)了 | sequnceHandlerType | 數(shù)據(jù)庫方式 | 指定使用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ù)測試
insert into travelrecord(name) values("20180802 14:18"); # output: 成功 受影響的行: 1 時間: 0.004s # 查看我們之前插入的數(shù)據(jù): select * from travelrecord; ... | 801 | 20180802 14:18 | 0 | ... 我們看到id插入是801,自增長來自數(shù)據(jù)表,查看數(shù)據(jù)庫表, 并自動修改表的當(dāng)前記錄+1(我們的increment=1) # 切換到真實的mycat-db1 select * from mycat_sequence; | TRAVELRECORD | 801 | 1 |時間方式 mycat conf/server.xml配置調(diào)整
查看配置是否生效2
同上不重復(fù)了 | sequnceHandlerType | 本地文件方式 | 指定使用Mycat全局序列的類型。 | # 這里應(yīng)該是mycat的顯示bug,配置成了時間戳序列方式了,顯示的還是本地文件方式插入等測試
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 # 上面的出錯,是因為我們的表插入的路由方式是rule="auto-sharding-long",找不到這么多的序列對應(yīng)的datanode # 調(diào)整 rule="mod-long",并修改三個真實分庫的id未bigint(20) 并重啟mycat insert into travelrecord(name) values("20180808 15:01"); # 受影響的行: 1 # 時間: 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,配置成了時間戳序列方式了,顯示的還是本地文件方式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插入等測試
select next value for MYCATSEQ_GLOBAL; # 5328679401562341409 select next value for MYCATSEQ_GLOBAL; # 5328680350783668258 insert into travelrecord(name) values("20180808 15:58"); # 受影響的行: 1 # 時間: 0.048s select * from travelrecord; ... | 5328681411405709347 | 20180808 15:58 | 0 | ...總結(jié)
我們在mycat分布式的環(huán)境下,建議全局序列id的順序: zookeeper > mysql > timestamp(SnowFlake) > localfile
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29158.html
摘要:通過完成可視化配置,及智能監(jiān)控,自動運維。通過本地節(jié)點,完整的解決數(shù)據(jù)擴容難度,實現(xiàn)自動擴容機制,解決擴容難點。支持基于的主從切換及集群化管理。通過智能優(yōu)化,分析分片熱點,提供合理的分片建議,索引建議,及數(shù)據(jù)切分實時業(yè)務(wù)建議。 Mycat Mycat簡介 1. 一個徹底開源的,面向企業(yè)應(yīng)用開發(fā)的大數(shù)據(jù)庫集群 2. 支持事務(wù)、ACID、可以替代MySQL的加強版數(shù)據(jù)庫 3. 一個可以視為...
閱讀 728·2021-11-24 10:30
閱讀 1264·2021-09-24 09:48
閱讀 3082·2021-09-24 09:47
閱讀 3599·2019-08-29 17:11
閱讀 2882·2019-08-29 15:38
閱讀 2278·2019-08-29 11:03
閱讀 3602·2019-08-26 12:15
閱讀 1015·2019-08-26 10:45