一、简介

上一篇文件主要讲解了在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全局序列之本地时间戳方式相关推荐

  1. 分表扩展全局序列原理_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0025

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们来说一下全局序列,现在我们做了分布式以后,东西都是全局的了 都要加个全局,以前可是没有,都 ...

  2. 分表扩展全局序列实际操作_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0026

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们动手配置: 全局序列,来给咱们的集群,保证id的自增长和不重复. 首先我们在dn1上创建这 ...

  3. mycat全局表一致性检查

    mycat全局表一致性检查通过内部列_mycat_op_time来实现,具体实现方式如下 1.检测全局表的内部列是否存在 checker.checkInnerColumnExist(); 检测的实现是 ...

  4. nodejs全局安装和本地安装的区别

    作者:白树 转载自http://www.cnblogs.com/PeunZh... 上一篇文章<npm 常用命令详解>主要是整理了最常使用的npm命令及相关介绍,其中有提到全局安装(npm ...

  5. node.js全局安装和本地安装的区别

    上一篇文章<npm 常用命令详解>主要是整理了最常使用的npm命令及相关介绍,其中有提到全局安装(npm install gulp -g)和本地安装(npm install gulp),下 ...

  6. Python time 获取本地时间戳(包含毫秒)

    Python time 获取本地时间戳(包含毫秒) #!/usr/bin/python # -*- coding: UTF-8 -*- import timedef get_current_time( ...

  7. java Redis Jedis存储Java对象 - (Java序列化为byte数组方式)

    2019独角兽企业重金招聘Python工程师标准>>> Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) Redis入门 – Jedis存储J ...

  8. npm全局安装和本地安装及卸载

    NPM是 1)npm是第三方模块的托管网站 1.node包括ECMAscript核心 2.全局成员 3.模块系统成员  (包括  核心模块,第三方模块,自定义模块) 2)npm是node包的管理工具  ...

  9. MyCAT全局序列号-数据库方式

    1.MyCat中的全局序列号介绍 在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一.为此,MyCat 提供了全局 sequence,并且提供了包含本地配置和数据库配置等多种实现方式. ...

  10. angular cli全局版本大于本地版本 把本地版本升级方式

    查看 angular 版本  ng version 如出现提示 Your global Angular CLI version (xxx) is greater than your local ver ...

最新文章

  1. 前端每周清单第 33 期:React 16 发布与特性介绍,Expo AR 教程,ExtJS 从崛起到沉寂...
  2. 程序员面试题精选100题(51)-顺时针打印矩阵[算法]
  3. 图形处理(五)基于旋转不变量的网格变形-Siggraph 2007
  4. 快速幂算法相关题目(Leetcode题解-Python语言)
  5. Java:计算类的serialVersionUID
  6. 三段式状态机_Verilog实战篇(5)——FIFO amp; 状态机
  7. 排序周赛(no stl)
  8. VC字符处理(二)转换(修改)
  9. new QPushbutton 时程序崩溃
  10. 正规手游代理该怎么选?
  11. 网络攻防之http host字段
  12. 又让马儿跑又不让吃草,微服务化如何完成低成本改造?
  13. 【Leetcode】1925. Count Square Sum Triples
  14. 学信网学位认证报告在哪
  15. JAVA实现无损word转pdf文件完整代码教程
  16. MySQL各种引擎特点简述
  17. fedora17下nvidia双显卡闭源驱动的安装
  18. Lua获取本地IP地址
  19. outlook邮件标题乱码_如何在Outlook中阅读邮件标题
  20. TL-1到底是什么?

热门文章

  1. 跃迁 成为高手的技术
  2. 阿里云云计算 37 PolarDB MySQL的连接
  3. 极客大学产品经理训练营:产品经理的项目管理 第14课总结
  4. 2021-09-09321. 拼接最大数 单调栈
  5. 11矩阵的QR分解(1)
  6. 冒泡、选择、快速、归并、堆排序算法 python实现
  7. python中小用法之assert,*arg,**arg用法全解
  8. 【CF 706】(C.Hard problem) + (D.Vasiliy's Multiset) + (E.Working routine)【最短路、01字典树、十字链表模拟】
  9. 使用SecretScanner发现容器镜像和文件系统中的敏感数据
  10. 226.翻转二叉树 (力扣leetcode) 博主可答疑该问题