分布式 | dble 中分布式时间戳方式的全局序列

分布式 | dble 中分布式时间戳方式的全局序列作者:吴金玲 爱可生 dble 项目团队成员,主要负责 dble 相关的日常测试工作,擅长对 dble 中出现的问题进行排查。热爱测试工作,余生欲将测试工作进行到底。 本文来源:原创投稿 *爱可生开…

分布式 | dble 中分布式时间戳方式的全局序列

作者:吴金玲 爱可生 dble 项目团队成员,主要负责 dble 相关的日常测试工作,擅长对 dble 中出现的问题进行排查。热爱测试工作,余生欲将测试工作进行到底。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


dble 中目前有 4 种方式的全局序列,分别是 MySQL offset-step 方式、时间戳方式、分布式时间戳方式、分布式 offset-step 方式全局序列。本文将会从测试的角度简单讲述一下分布式时间戳方式的全局序列的环境搭建及使用。

一、分布式时间戳方式的全局序列简介

此种方式提供一个基于 Zookeeper(以下简称 ZK)的分布式 ID 生成器,可以生成全局唯一的 63 位(首位恒为 0,保证全局序列为正数)二进制 ID。

正数的 63 位模式如下:

分布式 | dble 中分布式时间戳方式的全局序列

其中:

  • a – e 为从高位到低位;

  • a 为线程 id 的低 9 位值;

  • b 为 5 位实例 id 值; 此值为配置文件 sequence_distributed_conf.properties 中的 INSTANCEID 值或者从 zookeeper 服务器获取的值;

  • c 为 4 位数据中心 id 值; 即配置文件 sequence_distributed_conf.properties 中的 CLUSTERID 的值;

  • d 为 6 位自增长值;

  • e 为系统当前时间戳的低 39 位值(可以使用 17 年)。

二、搭建使用分布式时间戳方式的全局序列的环境

1. 配置 ZK 环境

搭建 dble & ZK 环境请参见社区的另外一篇文章《利用 ZooKeeper 手工部署 dble 集群环境》。本文中一个 ZK 管理 3 台 dble(dble-1,dble-2,dble-3)构成集群,3 台 dble 的版本均为 2.20.04.0。

2.dble 的配置要求

1)集群中各 dble 的 sequence_distributed_conf.properties 配置

dble-1 中的 sequence_distributed_conf.properties 配置为:

INSTANCEID=zk
CLUSTERID=01
START_TIME=2010-11-04 09:42:54

代码100分

dble-2 中的 sequence_distributed_conf.properties 配置为:

代码100分INSTANCEID=zk
CLUSTERID=02
START_TIME=2010-11-04 09:42:54

dble-3 中的 sequence_distributed_conf.properties 配置为:

INSTANCEID=zk
CLUSTERID=03
START_TIME=2010-11-04 09:42:54

sequence_distributed_conf.properties 中:

INSTANCEID:指定实例 ID 值,可以为‘zk’或者 n(n 为区间 [0,31] 中的一个整数)。如果配成 zk,则序列的维护(主要是 INSTANCEID 值的维护)用 zookeeper 的临时自增节点来维持。每次生成全局序列时,向 zk 申请一个临时自增节点,通过计算自增节点数 %32 获取 INSTANCEID。如果 INSTANCEID 值不为”zk”, 序列的维护仅依赖于单实例(主要是 INSTANCEID 值的维护),此时序列类似于时间戳方式。

CLUSTERID:指定组 ID 值,可以为 m(m 为区间 [0, 15] 中的一个整数)。

START_TIME:指定开始时间,时间格式固定,必须为 2010-11-04 09:42:54 这种格式。

2)将 dble-1 中的 schema.xml 及 server.xml 配置修改如下:

schema.xml 关键配置为:

代码100分<schema name="schema1" dataNode="dn1">
<table name="tb_autoIncre" dataNode="dn1,dn2,dn3,dn4" rule="hash-four" cacheKey="id" incrementColumn="id"/>
</schema>

server.xml 关键配置为:

<system>
    <pro
perty name="sequenceHandlerType">3</property>
</system>

3)登录 dble-1 的管理端口并执行管理命令 reload @@config_all,然后依次重启 3 台 dble,使配置在集群中生效。

三、操作及结果验证

1.建表及插入数据

创建一张含有 bigint 类型的自增列的表,登录 dble-1 的业务端口,执行:

mysql -p111111 -utest -P8066 -Dschema1 -e "create table tb_autoIncre(id bigint,time char(120));"

插入数据,执行:

datestr=`date +%Y%m%d`
mysql -p111111 -utest -P8066 -Dschema1 -e "insert tb_autoIncre values("${datestr}");"

查询插入的数据,执行:

mysql -p111111 -utest -P8066 -Dschema1 -e "select * from tb_autoIncre ;"

分布式 | dble 中分布式时间戳方式的全局序列

2.验证插入的 id 自增列值是否正确:

上图中的 id 是个正数,将此正数转化成二进制,然后按照上文简介中的 63 位二进制数组成规则反推各组成部分的是否和设计一致。具体步骤如下:

1)将步骤二中得到的 id 转换成二进制记录为 (a),若结果不足 64 位,前面加 0 补足 64 位

select conv(id, 10, 2) from  tb_autoIncre;

分布式 | dble 中分布式时间戳方式的全局序列

所以补足 64 位后的二进制为:0000000000000000001000000100011000100001001011100011111101011000

2)记录二进制 (a) 的前 [16~19] 位闭区间为 0001,转化为十进制为 1,值与配置中 CLUSTERID 值相等;取前 [11~15] 位闭区间为 00000,转化为十进制为 0,而 zk 中临时自增节点 instance 值为,

分布式 | dble 中分布式时间戳方式的全局序列

0%32 也为 0,所以符合预期;截取二进制的后 39 位为一个新的二进制 100011000100001001011100011111101011000,记为 (b)‬。

3)将二进制 (b) 转化成十进制

select conv(100011000100001001011100011111101011000, 2, 10);

分布式 | dble 中分布式时间戳方式的全局序列

所以 (b) 转化为十进制为:301204389720,记为 (c)。

4)将 (c) 转化成日期 (t1)

set @unixtime=301204389720/1000;
select from_unixtime(@unixtime);

分布式 | dble 中分布式时间戳方式的全局序列

5)将得到的日期 (t1)-1970/01/01,得到时间差记为 (t2)

select datediff("1979-01-08 08:53:58.752000","1970-01-01");

分布式 | dble 中分布式时间戳方式的全局序列

6)用 start time(2010/11/04 09:42:54) + (t2) 得到最终的时间 (t3):

select date_add("2010-11-04 09:42:54", interval 3486 day);

分布式 | dble 中分布式时间戳方式的全局序列

(t3) 与 select 出的 time 列的值近似相等。

结论:从以上分析可以看出,插入到自增列的值是正确的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8119.html

(0)
上一篇 2023-03-07
下一篇 2023-03-07

相关推荐

  • MySql变量说明

    MySql变量说明1 #变量 2 /* 3 系统变量: 4 全局变量 5 会话变量 6 7 自定义变量: 8 用户变量 9 局部变量 10 11 */ 12 #一、系统变量 13 /* 14 说明:变量由系统定义,不…

    2023-03-26
    146
  • Oracle入门学习一

    Oracle入门学习一oracle的安装,用户授权,表格操作,数据类型,ddl表格,dml数据。 下一篇:Oracle入门学习二 学习视频:https://www.bilibili.com/video/BV1tJ411r7

    2023-02-23
    141
  • ETC 读卡出错_etc未检测到标签

    ETC 读卡出错_etc未检测到标签摘要:本文通过对ETCD服务异常问题分析,代码展示解决方案。 本文分享自华为云社区《【实例状态】GaussDB ETCD服务异常》,作者:酷哥。 首先确认是否是虚拟机、网络故障 虚拟机故障导致ETCD

    2023-06-13
    148
  • 使用plot函数进行数据可视化

    使用plot函数进行数据可视化在数据分析和数据建模中,数据的可视化是非常重要的环节,它能帮助我们更好地理解数据、找出数据的特点和规律、进行更准确的数据分析和决策。python中的matplotlib包中的plot函数是一个非常强大的数据可视化工具,它能够帮助我们进行各种各样的数据可视化操作,如散点图、折线图、柱状图、箱线图等等。

    2024-06-05
    45
  • MySQL优化之索引解析[通俗易懂]

    MySQL优化之索引解析[通俗易懂]索引的本质 MySQL索引或者说其他关系型数据库的索引的本质就只有一句话,以空间换时间。 索引的作用 索引关系型数据库为了加速对表中行数据检索的(磁盘存储的)数据结构 索引的分类 数据结构上面的分类

    2023-05-09
    134
  • 使用Python实现鼠标点击操作

    使用Python实现鼠标点击操作鼠标点击操作指的是通过鼠标模拟用户的点击动作,触发相应的操作或事件。例如在图形界面中,用户可以通过鼠标点击按钮实现提交操作;在游戏中,玩家可以通过鼠标点击屏幕实现角色行动等。

    2024-07-27
    40
  • 哪个网盘文件分享做的最好?「终于解决」

    哪个网盘文件分享做的最好?「终于解决」哪个网盘文件分享做的最好?随着互联网科技的发展,特别是移动互联网的飞速发展,互联网已成为我们生活、工作不可缺少的重要组成部分。我们在享受互联网带来的各种便捷,然而互联网的安全也严重干扰了我们的生活。…

    2023-04-12
    151
  • 以Python配置文件为中心的管理

    以Python配置文件为中心的管理在软件开发的过程中,我们需要将程序中的各种配置单独提取出来进行管理,以便于在不同的环境中以及不同的部署情况下进行配置的修改和传递。Python作为一门广泛应用于Web开发、运维等领域的编程语言,它的配置文件管理也有诸多优化和方便的手段。本篇文章就是要探讨如何通过Python配置文件实现程序的管理与部署。

    2024-08-05
    23

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注