• 读书笔记-Mycat权威指南-09-全局序列号


    全局序列号介绍

    在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,需要新的实现方式。

    本地文件方式

    原理:此方式 MyCAT 将 sequence 配置到文件中,当使用到 sequence 中的配置后,MyCAT 会更下 classpath 中的 sequence_conf.properties 文件中 sequence 当前的值。

    配置方式: 在 sequence_conf.properties 文件中做如下配置, 使用示例: insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,‘test’);

    缺点:当 MyCAT 重新发布后,配置文件中的 sequence 会恢复到初始值。

    优点:本地加载,读取速度较快。

    数据库方式

    在数据库中建立一张表,存放 sequence 名称(name),sequence 当前值(current_value),步长(increment int 类型每次读取多少个 sequence,假设为 K)等信息。

    Sequence 获取步骤:

    1).当初次使用该 sequence 时,根据传入的 sequence 名称,从数据库这张表中读取 current_value,和 increment 到 MyCat 中,并将数据库中的 current_value 设置为原 current_value 值+increment 值;

    2).MyCat 将读取到 current_value+increment 作为本次要使用的 sequence 值,下次使用时,自动加 1,当 使用 increment 次后,执行步骤 1)相同的操作

    3).MyCat 负责维护这张表,用到哪些 sequence,只需要在这张表中插入一条记录即可。若某次读取的 sequence 没有用完,系统就停掉了,则这次读取的 sequence 剩余值不会再使用。

    本地时间戳

    方式 ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加);

    换算成十进制为 18 位数的 long 类型,每毫秒可以并发 12 位二进制的累加;

    使用方式:

    a. 配置 server.xml 2

    b. 在 mycat 下配置:sequence_time_conf.properties WORKID=0-31 任意整数 DATAACENTERID=0-31 任意整数

    多个个 mycat 节点下每个 mycat 配置的 WORKID,DATAACENTERID 不同,组成唯一标识,总共支持 32*32=1024 种组合。

    ID 示例:56763083475511

    分布式 ZK ID 生成器

    <property name="sequnceHandlerType">3</property>

    Zk 的连接信息统一在 myid.properties 的 zkURL 属性中配置。

    基于 ZK 与本地配置的分布式 ID 生成器(可以通过 ZK 获取集群(机房)唯一 InstanceID,也可以通过配置文 件配置 InstanceID) ID 结构:long 64 位,ID 最大可占 63 位

    * |current time millis(微秒时间戳 38 位,可以使用 17 年)|clusterId(机房或者 ZKid,通过配置文件配置 5 位)|instanceId(实例 ID,可以通过 ZK 或者配置文件获取,5 位)|threadId(线程 ID,9 位) |increment(自增,6 位) * 一共 63 位,可以承受单机房单机器单线程 1000*(2^6)=640000 的并发。

    * 一共 63 位,可以承受单机房单机器单线程 1000*(2^7)=1280000 的并发。

    * 无悲观锁,无强竞争,吞吐量更高

    配置文件:sequence_distributed_conf.properties,只要配置里面:INSTANCEID=ZK 就是从 ZK 上获取 InstanceID。

    注:自增ID配置

    <property name="sequnceHandlerType">4</property>

    自增长主键

    MyCAT 自增长主键和返回生成主键 ID 的实现

  • 相关阅读:
    wayland学习笔记(八) wayland为什么要用libffi
    线程安全函数和可重入函数 辨析
    patch的基本使用
    c++ condition_variable的wait 语法糖
    系统启动知识 说道说道(一) 冰山之下
    DDR 带宽计算公式
    wayland学习笔记(七)config的结构分析
    功耗管理篇
    operator=() 重载的问题
    ABC216
  • 原文地址:https://www.cnblogs.com/shizheyangde/p/7434965.html
Copyright © 2020-2023  润新知