iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >分布式 | dble 中分布式时间戳方式的全局序列
  • 823
分享到

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

分布式|dble中分布式时间戳方式的全局序列 2020-11-16 12:11:32 823人浏览 猪猪侠
摘要

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

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

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


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

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

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

正数的 63 位模式如下:

其中:

  • 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

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

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 关键配置为:


server.xml 关键配置为:


    3

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

三、操作及结果验证

建表及插入数据

创建一张含有 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 ;"

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

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

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

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

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

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

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

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

select conv(100011000100001001011100011111101011000, 2, 10);

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

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

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

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

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

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

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

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

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

您可能感兴趣的文档:

--结束END--

本文标题: 分布式 | dble 中分布式时间戳方式的全局序列

本文链接: http://www.lsjlt.com/news/6436.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 什么是CSS3 Columns分列式布局
    这篇文章主要介绍“什么是CSS3 Columns分列式布局”,在日常操作中,相信很多人在什么是CSS3 Columns分列式布局问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • Redis中怎么序列化分布式锁
    今天就跟大家聊聊有关Redis中怎么序列化分布式锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。问题排查既然是释放锁有问题,那就先看看释放锁的代码吧...
    99+
    2024-04-02
  • Redis分布式锁的实现方式
    目录一、分布式锁是什么1、获取锁2、释放锁二、代码实例上面代码存在锁误删问题:三、基于SETNX实现的分布式锁存在下面几个问题1、不可重入2、不可重试3、超时释放4、主从一致性四、Redisson实现分布式锁1、pom2...
    99+
    2023-04-03
    Java Redis分布式锁实现方式 实现Redis分布式锁 Redis分布式锁实现
  • springboot分布式整合dubbo的方式
     Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用...
    99+
    2024-04-02
  • Golang 函数在分布式系统中的分布式追踪
    分布式追踪在 go 语言中的应用:分布式追踪有助于理解分布式系统中请求的流动。它使开发人员能够识别瓶颈、查找问题并提高系统性能。go 语言提供 opentracing 和 jaeger ...
    99+
    2024-04-19
    golang 分布式追踪
  • Jmerte分布式压测及分布式压测配置的方法
    这篇文章主要介绍“Jmerte分布式压测及分布式压测配置的方法”,在日常操作中,相信很多人在Jmerte分布式压测及分布式压测配置的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jmerte分布式压测及分...
    99+
    2023-06-30
  • ZooKeeper分布式锁的实现方式
    本篇内容介绍了“ZooKeeper分布式锁的实现方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录一、分布式锁方案比较二、ZooKeep...
    99+
    2023-06-20
  • Java几种分布式全局唯一ID生成方案
    目录缘起常见方案UUID数据库自增键TDDL SequenceLeaf-segment类雪花算法时间回拨问题Leaf-snowflakeSeata UUID总结缘起 在分布式微服务系...
    99+
    2023-01-30
    Java分布式全局唯一ID生成 Java分布式全局唯一ID
  • html中响应式布局的示例分析
    这篇文章主要为大家展示了“html中响应式布局的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“html中响应式布局的示例分析”这篇文章吧。 响应式布局...
    99+
    2024-04-02
  • Zookeeper的分布式锁的实现方式
    这篇文章主要讲解了“Zookeeper的分布式锁的实现方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Zookeeper的分布式锁的实现方式”吧!1. 背景最近在学习 Zookeeper,...
    99+
    2023-06-05
  • 利用Redis实现分布式全局ID生成
    利用Redis实现分布式全局ID生成随着互联网的发展,分布式系统的应用场景越来越多,如何生成全局唯一的ID成为了一个非常重要的问题。传统的自增ID,由于单点数据源的限制,无法满足分布式系统的需要。利用Redis作为分布式系统的全局ID生成器...
    99+
    2023-11-08
    分布式 redis ID生成
  • CSS样式表与格式布局的示例分析
    小编给大家分享一下CSS样式表与格式布局的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!样式表CSS(Cascading Style Sheets&nbs...
    99+
    2023-06-08
  • Redis分布式锁如何设置超时时间
    目录Redis分布式锁设置超时时间网络抖动Redis宕机Redis分布式锁的超时问题Redis分布式锁设置超时时间 Redis分布式锁主要依靠Redis服务来完成,我们的应用程序其实是Redis节点的客户端,一旦客户端没...
    99+
    2022-11-18
    Redis分布式锁 Redis设置超时时间 分布式锁设置超时时间
  • Netty分布式ByteBuf的分类方式源码解析
    目录ByteBuf根据不同的分类方式 会有不同的分类结果1.Pooled和Unpooled2.基于直接内存的ByteBuf和基于堆内存的ByteBuf3.safe和unsafe上一小...
    99+
    2024-04-02
  • Redisson分布式延时队列RedissonDelayedQueue运行流程
    目录前言基本使用内部数据结构介绍基本流程发送延时消息获取延时消息初始化延时队列总结前言 因为工作中需要用到分布式的延时队列,调研了一段时间,选择使用 RedissonDelayedQ...
    99+
    2024-04-02
  • css3中media响应式布局的示例分析
    这篇文章主要介绍了css3中media响应式布局的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。响应式布局可以为不同终端的用户提供更...
    99+
    2024-04-02
  • 分布式ID的生成方式有哪些
    本篇内容主要讲解“分布式ID的生成方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分布式ID的生成方式有哪些”吧!一、为什么要用分布式ID?在说分布式I...
    99+
    2024-04-02
  • Redis分布式锁的正确实现方式
    Redis分布式锁的正确实现方式?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。可靠性首先,为了确保分布式锁可用,我们至少要确保...
    99+
    2024-04-02
  • 分布式系统中 Golang 函数与分布式数据库的交互
    在分布式系统中,go 函数可以与分布式数据库交互。具体步骤如下:安装必要依赖项。使用 spanner.newclient 函数连接到数据库。使用 query 方法执行查询,并获取迭代器。...
    99+
    2024-04-19
    分布式系统 分布式数据库 golang
  • PHP中的分布式事务
    随着信息化时代的迅速发展,电商行业不断壮大,相应的技术也在不断地更新迭代。其中,分布式系统是当前电商行业的主流架构之一,它旨在提高系统的可用性和可扩展性。在分布式系统中,事务处理是不可避免的问题,而分布式事务又是事务处理的关键。本文将介绍P...
    99+
    2023-05-23
    PHP编程 分布式事务 事务处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作