mysql 初始化序列_GitHub - IMAUZS/seq: 基于mysql的序列号生成器
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的序列号生成器相关推荐
- mysql查询语句详解_基于mysql查询语句的使用详解
1> 查询数据表除了前三条以外的数据. 起初我想到的是这条语句 SELECT * FROM admin WHERE userid NOT IN (SELECT userid FROM admin ...
- keepalived mysql双主架构图_基于MySQL双主的高可用解决方案理论及实践
MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段.本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求.各高可用技术特点对比.实施.测试等过程进行整理,完善Mysql ...
- mysql数据库约束详解_基于MySQL数据库的数据约束实例及五种完整性约束介绍
为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确.有效.相容. ...
- mysql数据库加密设备_一种基于MySQL数据库加密方法与流程
本发明涉及数据库加密技术技术领域,具体的讲涉及一种基于MySQL数据库加密方法. 背景技术: 聚通达DBSecurity是一款基于透明加密技术的数据防泄漏产品,该产品能够实现对数据库中的敏感数据加密存 ...
- mysql中时间处理函数_基于mysql时间处理函数的应用详解
DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=星期一, --7=星期六).这些索引值对应于ODBC标准. mysql> select DAYOFWEEK('1998 ...
- javascript mysql 知乎_GitHub - JobsDong/zhihudaily: 基于tornado,sae的网页版知乎日报
修改配置文件config.py: # 配置数据存储引擎(基于kvdb, mysql)由于数据库需要租金,建议使用kvdb from base.daily_store import DailyStore ...
- mysql 模拟序列_【原创】MySQL 模拟PostgreSQL generate_series 表函数
PostgreSQL 提供了一个很强大的造数据的函数generate_series,基于Common Table Expression. MySQL 没有复杂的应用程序类型,该如何实现这样的功能呢? ...
- mysql表 c#实体类,创建基于MySQL表中的C#类
Is there anything built into .Net or visual studio that will allow my to create classes based off of ...
- mysql 2个排序规则_基于mysql 默认排序规则的坑
mysql默认varchar类型是对大小写不敏感(不区分),如果想要mysql区分大小写需要设置排序规则: utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写. utf8_genera ...
- mysql中的exists嵌套_基于mysql 的exists 嵌套查询的详解
select Sname from Student where not exists (select * from Course where not exists (select * from SC ...
最新文章
- 用原始方法解析复杂字符串,json一定要用JsonMapper么?
- php把数组函数封装,PHP删除Array数组里指定的key(完整版,已封装成函数,附测试代码)...
- perl中的几个模块使用.
- libtorch Compiler Error C2951
- Java中线程池,你真的会用吗
- javascript-定时器的使用
- windows server 2012 st 版本的php环境问题修复 与删除
- 无人驾驶时代指日可待?2035年将取代传统汽车
- 50 岁的他笑谈码农真相,看完清醒了!| 人物志
- day4 函数的包装+装饰器+迭代器
- java实训鉴定表_java实习自我鉴定材料定稿(资料4)
- 一个 可以在线播放 m3u8 的网页
- Riverbed:SDN向广域网扩展为企业带来哪些价值
- phabricator 结合 arcanist 使用
- 按Right-BICEP的测试用例
- Nginx下上传图片404
- HINSTANCE初了解
- 数据加密解决方案有哪些?
- Linux下的画图软件
- ssm+JSP计算机毕业设计学校小卖部收银系统uwf3w【源码、程序、数据库、部署】