seq

分布式架构下,唯一序列号生成是我们在设计一个系统,尤其是数据库使用分库分表的时候常常会遇见的问题。当分成若干个sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。

基于mysql的全局唯一序列号生成器,用go实现,同时支持worker和db模式。对于订单号,可以选择worker模式,对于用户id这种,可以采用db模式。

特性

分布式:可任意横向扩展

高性能:分配ID只能访问内存

易用性:对外提供HTTP服务

唯一性:MySQL自增ID,永不重复

高可靠:MySQL持久化

依赖项

本项目使用下列优秀的项目作为必要组件。

gopkg.in/yaml.v2

github.com/go-sql-driver/mysql

github.com/satori/go.uuid

安装

注意:需要在启动之前创建数据库并修改配置文件中数据库的配置。

单独编译:

git clone https://github.com/spcent/seq.git

cd seq

go build .

./seq

Docker 方式:

Dockerfile 使用了 Docker 多阶段构建功能,需保证 Docker 版本在 17.05 及以上。详见:Use multi-stage builds

git clone https://github.com/spcent/seq.git

cd seq

docker build -t seq:latest .

docker run -p 8000:8000 seq:latest

初始化数据库

数据库名称可以自定义,修改config.yml即可。

然后导入下面的SQL生成数据表。

create database seq;

CREATE TABLE `seq_number` (

`id` bigint unsigned NOT NULL AUTO_INCREMENT,

`uuid` char(36) NOT NULL COMMENT '机器识别码',

PRIMARY KEY (`id`),

UNIQUE KEY `uniq_uuid` (`uuid`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

使用

curl http://localhost:8000/nextId

{"code":0,"msg":"ok","data":{"id":101}}

curl http://localhost:8000/nextIdSimple

102

curl http://localhost:8000/worker/1

{"code":0,"msg":"ok","data":{"id":390637407633936384}}

原理

服务初始化后第一次请求会在 MySQL 数据库中插入一条数据,以生成初始 ID。

后续的请求,都会在内存中进行自增返回,并且保证返回的 ID 不会超过设置的上限,到达上限后会再次从 MySQL 中更新数据,返回新的初始 ID 。

参考

Tinyid(https://github.com/didi/tinyid): 是用Java开发的一款分布式id生成系统,基于数据库号段算法实现,关于这个算法可以参考美团leaf或者tinyid原理介绍。Tinyid扩展了leaf-segment算法,支持了多db(master),同时提供了java-client(sdk)使id生成本地化,获得了更好的性能与可用性。Tinyid在滴滴客服部门使用,均通过tinyid-client方式接入,每天生成亿级别的id。

百度uid-generator(https://github.com/baidu/uid-generator): 这是基于snowflake方案实现的开源组件,借用未来时间、缓存等手段,qps可达600w+

美团leaf(https://tech.meituan.com/MT_Leaf.html): 该篇文章详细的介绍了db号段和snowflake方案,近期也进行了Leaf开源

核心SQL

REPLACE INTO `seq_number` (uuid) VALUES ("54f5a3e2-e04c-4664-81db-d7f6a1259d01");

TODO

高可用(在ab测试中,发现存在请求被hang住的情况,响应时间不是太稳定)

批量获取

提高rpc接口

mysql 初始化序列_GitHub - IMAUZS/seq: 基于mysql的序列号生成器相关推荐

  1. mysql查询语句详解_基于mysql查询语句的使用详解

    1> 查询数据表除了前三条以外的数据. 起初我想到的是这条语句 SELECT * FROM admin WHERE userid NOT IN (SELECT userid FROM admin ...

  2. keepalived mysql双主架构图_基于MySQL双主的高可用解决方案理论及实践

    MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段.本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求.各高可用技术特点对比.实施.测试等过程进行整理,完善Mysql ...

  3. mysql数据库约束详解_基于MySQL数据库的数据约束实例及五种完整性约束介绍

    为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确.有效.相容. ...

  4. mysql数据库加密设备_一种基于MySQL数据库加密方法与流程

    本发明涉及数据库加密技术技术领域,具体的讲涉及一种基于MySQL数据库加密方法. 背景技术: 聚通达DBSecurity是一款基于透明加密技术的数据防泄漏产品,该产品能够实现对数据库中的敏感数据加密存 ...

  5. mysql中时间处理函数_基于mysql时间处理函数的应用详解

    DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=星期一, --7=星期六).这些索引值对应于ODBC标准. mysql> select DAYOFWEEK('1998 ...

  6. javascript mysql 知乎_GitHub - JobsDong/zhihudaily: 基于tornado,sae的网页版知乎日报

    修改配置文件config.py: # 配置数据存储引擎(基于kvdb, mysql)由于数据库需要租金,建议使用kvdb from base.daily_store import DailyStore ...

  7. mysql 模拟序列_【原创】MySQL 模拟PostgreSQL generate_series 表函数

    PostgreSQL 提供了一个很强大的造数据的函数generate_series,基于Common Table Expression. MySQL 没有复杂的应用程序类型,该如何实现这样的功能呢? ...

  8. mysql表 c#实体类,创建基于MySQL表中的C#类

    Is there anything built into .Net or visual studio that will allow my to create classes based off of ...

  9. mysql 2个排序规则_基于mysql 默认排序规则的坑

    mysql默认varchar类型是对大小写不敏感(不区分),如果想要mysql区分大小写需要设置排序规则: utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写. utf8_genera ...

  10. mysql中的exists嵌套_基于mysql 的exists 嵌套查询的详解

    select Sname from Student where not exists (select * from Course where not exists (select * from SC ...

最新文章

  1. 用原始方法解析复杂字符串,json一定要用JsonMapper么?
  2. php把数组函数封装,PHP删除Array数组里指定的key(完整版,已封装成函数,附测试代码)...
  3. perl中的几个模块使用.
  4. libtorch Compiler Error C2951
  5. Java中线程池,你真的会用吗
  6. javascript-定时器的使用
  7. windows server 2012 st 版本的php环境问题修复 与删除
  8. 无人驾驶时代指日可待?2035年将取代传统汽车
  9. 50 岁的他笑谈码农真相,看完清醒了!| 人物志
  10. day4 函数的包装+装饰器+迭代器
  11. java实训鉴定表_java实习自我鉴定材料定稿(资料4)
  12. 一个 可以在线播放 m3u8 的网页
  13. Riverbed:SDN向广域网扩展为企业带来哪些价值
  14. phabricator 结合 arcanist 使用
  15. 按Right-BICEP的测试用例
  16. Nginx下上传图片404
  17. HINSTANCE初了解
  18. 数据加密解决方案有哪些?
  19. Linux下的画图软件
  20. ssm+JSP计算机毕业设计学校小卖部收银系统uwf3w【源码、程序、数据库、部署】

热门文章

  1. matlab结果导入ug,matlab与UG数据交换.docx
  2. Ubuntu删除用户和卸载服务命令
  3. 服务器采集协议,H3C设备服务器采集参数认证过程(包含redfish和restfull协议)
  4. javascript简易的动画效果
  5. qlikview 地图插件制作教程
  6. 微软原版win10系统启动盘的使用
  7. kettle 使用教程(入门)
  8. IDEA如何开启远程调试
  9. 学生管理系统IPO图_基于BIM技术的医院建筑运维管理系统构建
  10. 基于ipv6的多分支大学校园网设计与实现