MyCat全局序列之本地时间戳方式
一、简介
上一篇文件主要讲解了在MyCat中如何实现数据库方式的全局序列,除了上面讲过的本地文件方式以及数据库方式,其实还可以使用本地时间戳方式生成全局唯一序列作为主键,本文将总结时间戳方式实现全局序列作为主键。
二、时间戳方式
实现方式:
ID = 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加) 换算成十进制为 18 位数的 long 类型,每毫秒可以并发 12 位二进制的累加。
三、实现步骤
【a】创建数据库和表:
注意点:使用时间戳的方式实现全局唯一主键的话,主键的类型要是bigint,如果使用int类型的话长度不够,可能会报错。
create database testtimeseq1;
create database testtimeseq2;use testtimeseq1;
create table test(id bigint auto_increment primary key,xm varchar(32));use testtimeseq2;
create table test(id bigint auto_increment primary key,xm varchar(32));
【b】配置 server.xml : sequnceHandlerType 需要配置为 2,指定全局序列方式为本地时间戳方式。
<system><property name="sequnceHandlerType">2</property></system>
具体代码:
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/"><system><property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 --><property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 --><property name="sequnceHandlerType">2</property><!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议--><!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号--><!-- <property name="processorBufferChunk">40960</property> --><!-- <property name="processors">1</property> <property name="processorExecutor">32</property> --><!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena--><property name="processorBufferPoolType">0</property><!--默认是65535 64K 用于sql解析时最大文本长度 --><!--<property name="maxStringLiteralLength">65535</property>--><!--<property name="sequnceHandlerType">0</property>--><!--<property name="backSocketNoDelay">1</property>--><!--<property name="frontSocketNoDelay">1</property>--><!--<property name="processorExecutor">16</property>--><!--<property name="serverPort">8066</property> <property name="managerPort">9066</property> <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> --><!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志--><property name="handleDistributedTransactions">0</property><!--off heap for merge/order/group/limit 1开启 0关闭--><property name="useOffHeapForMerge">1</property><!--单位为m--><property name="memoryPageSize">1m</property><!--单位为k--><property name="spillsFileBufferSize">1k</property><property name="useStreamOutput">0</property><!--单位为m--><property name="systemReserveMemorySize">384m</property><!--是否采用zookeeper协调切换 --><property name="useZKSwitch">true</property></system><!-- 全局SQL防火墙设置 --><!-- <firewall> <whitehost><host host="127.0.0.1" user="mycat"/><host host="127.0.0.2" user="mycat"/></whitehost><blacklist check="false"></blacklist></firewall>--><user name="root"><property name="password">0905</property><property name="schemas">TESTTIME</property><!-- 表级 DML 权限设置 --><!-- <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges> --></user><user name="user"><property name="password">0905</property><property name="schemas">TESTTIME</property><property name="readOnly">true</property></user></mycat:server>
【c】配置sequence_time_conf.properties:
- WORKID=0-31 任意整数
- DATAACENTERID=0-31 任意整数
多个 mycat 节点下每个 mycat 配置的 WORKID,DATAACENTERID 不同,组成唯一标识,总共支持 32*32=1024 种组合。
#sequence depend on TIME
WORKID=05
DATAACENTERID=05
【d】schema.xml 的对应逻辑表位置配置 autoIncrement="true"指定主键自增, 然后重启mycat服务。
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTTIME" checkSQLschema="false" sqlMaxLimit="100"><table name="test" dataNode="dn1,dn2" primaryKey="id" autoIncrement="true" rule="mod-long" /></schema><dataNode name="dn1" dataHost="localhost1" database="testtimeseq1" /><dataNode name="dn2" dataHost="localhost1" database="testtimeseq2" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="192.168.1.10:3306" user="root" password="0905"></writeHost></dataHost></mycat:schema>
【e】使用示例:
登录MyCat:
mysql -uroot -p0905 -h192.168.1.10 -P8066
select next value for MYCATSEQ_GLOBAL;
插入数据进行测试:
insert into test(xm) values ("zhangsan");
insert into test(id,xm) values(next value for MYCATSEQ_GLOBAL,'lisi') ; insert into test(id,xm) values(next value for MYCATSEQ_GLOBAL,'lisi') ;
四、总结
使用时间戳方式的话,整体步骤总结如下:
- server.xml指定时间戳方式生成序列方式;
- schema.xml中配置分片表,注意分片表的主键为自增长,分片表的主键类型不能为int类型;
- 配置sequence_time_conf.properties;
- 使用 next value for MYCATSEQ_GLOBAL 获取全局序列;
至此,已经总结了三种方式(本地文件方式、数据库方式、本地时间戳方式)实现MyCat全局唯一主键,三种方式都有优点和缺点,总结如下:
1. 本地文件方式
缺点:在MyCat重启(或者MyCat所在主机发生宕机时)后,配置文件中sequence会恢复到初始值,造成下次操作序列重复。
优点:本地加载,读取速度较快2. 数据库方式
优点:在MyCat重启后,sequence值不会被初始化
缺点:如果存取sequence的数据库挂了,会遇到单点故障3. 本地时间戳方式
优点:不存在上面两种方式因为MyCat的重启导致id重复的现象
缺点:数据类型太长,建议采用bigint(最大取值18446744073709551615)
除了这三种方式, MyCat还集成了ZK实现全局唯一主键,到时候总结ZK的时候会进行研究。
MyCat全局序列之本地时间戳方式相关推荐
- 分表扩展全局序列原理_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0025
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们来说一下全局序列,现在我们做了分布式以后,东西都是全局的了 都要加个全局,以前可是没有,都 ...
- 分表扩展全局序列实际操作_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0026
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们动手配置: 全局序列,来给咱们的集群,保证id的自增长和不重复. 首先我们在dn1上创建这 ...
- mycat全局表一致性检查
mycat全局表一致性检查通过内部列_mycat_op_time来实现,具体实现方式如下 1.检测全局表的内部列是否存在 checker.checkInnerColumnExist(); 检测的实现是 ...
- nodejs全局安装和本地安装的区别
作者:白树 转载自http://www.cnblogs.com/PeunZh... 上一篇文章<npm 常用命令详解>主要是整理了最常使用的npm命令及相关介绍,其中有提到全局安装(npm ...
- node.js全局安装和本地安装的区别
上一篇文章<npm 常用命令详解>主要是整理了最常使用的npm命令及相关介绍,其中有提到全局安装(npm install gulp -g)和本地安装(npm install gulp),下 ...
- Python time 获取本地时间戳(包含毫秒)
Python time 获取本地时间戳(包含毫秒) #!/usr/bin/python # -*- coding: UTF-8 -*- import timedef get_current_time( ...
- java Redis Jedis存储Java对象 - (Java序列化为byte数组方式)
2019独角兽企业重金招聘Python工程师标准>>> Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) Redis入门 – Jedis存储J ...
- npm全局安装和本地安装及卸载
NPM是 1)npm是第三方模块的托管网站 1.node包括ECMAscript核心 2.全局成员 3.模块系统成员 (包括 核心模块,第三方模块,自定义模块) 2)npm是node包的管理工具 ...
- MyCAT全局序列号-数据库方式
1.MyCat中的全局序列号介绍 在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一.为此,MyCat 提供了全局 sequence,并且提供了包含本地配置和数据库配置等多种实现方式. ...
- angular cli全局版本大于本地版本 把本地版本升级方式
查看 angular 版本 ng version 如出现提示 Your global Angular CLI version (xxx) is greater than your local ver ...
最新文章
- 前端每周清单第 33 期:React 16 发布与特性介绍,Expo AR 教程,ExtJS 从崛起到沉寂...
- 程序员面试题精选100题(51)-顺时针打印矩阵[算法]
- 图形处理(五)基于旋转不变量的网格变形-Siggraph 2007
- 快速幂算法相关题目(Leetcode题解-Python语言)
- Java:计算类的serialVersionUID
- 三段式状态机_Verilog实战篇(5)——FIFO amp; 状态机
- 排序周赛(no stl)
- VC字符处理(二)转换(修改)
- new QPushbutton 时程序崩溃
- 正规手游代理该怎么选?
- 网络攻防之http host字段
- 又让马儿跑又不让吃草,微服务化如何完成低成本改造?
- 【Leetcode】1925. Count Square Sum Triples
- 学信网学位认证报告在哪
- JAVA实现无损word转pdf文件完整代码教程
- MySQL各种引擎特点简述
- fedora17下nvidia双显卡闭源驱动的安装
- Lua获取本地IP地址
- outlook邮件标题乱码_如何在Outlook中阅读邮件标题
- TL-1到底是什么?
热门文章
- 跃迁 成为高手的技术
- 阿里云云计算 37 PolarDB MySQL的连接
- 极客大学产品经理训练营:产品经理的项目管理 第14课总结
- 2021-09-09321. 拼接最大数 单调栈
- 11矩阵的QR分解(1)
- 冒泡、选择、快速、归并、堆排序算法 python实现
- python中小用法之assert,*arg,**arg用法全解
- 【CF 706】(C.Hard problem) + (D.Vasiliy's Multiset) + (E.Working routine)【最短路、01字典树、十字链表模拟】
- 使用SecretScanner发现容器镜像和文件系统中的敏感数据
- 226.翻转二叉树 (力扣leetcode) 博主可答疑该问题