全局id生成器试用之叶

  

数据量上来后,单库单表承受不住的时候,我们就需要引入分库分表。但是分库分表后,主键id就不能依赖于MySQL,需要从外部去获取id。


目前我们生产环境在用的DBLE作为中分库分表中间件,其自带了类似雪花方案的全局id生成器,也可以基于数据库来实现。


但是,在一个大点的公司里面,全局id是一个用处很广泛的服务,通常会独立作为一个公共服务对外提供。


这里我们就以美团点评出的叶片为例,看下它的效果。


相关文档:https://tech.meituan.com/2019/03/07/open-source-project-leaf.html

https://tech.meituan.com/2017/04/21/mt-leaf.html

https://blog.csdn.net/bskfnvjtlyzmv867/article/details/90175306源码详解


官方的2篇文档,介绍的很详细了,我们就不啰嗦了。



下面的演示,是基于数据库做id分发(数据库的SLA可以使用尼古拉斯,pxc或经理来保证)



<强>

OS版本:CentOS7

node1 IP: 192.168.20.10

node2 IP: 192.168.20.17

MySQL地址:192.168.20.10


创建数据库叶;      使用叶;      创建表“leaf_alloc”(   ‘biz_tag varchar (128) NOT NULL违约”,——你的商业唯一的名称   max_id的bigint (20) NOT NULL默认' 1 ',   “步骤”int(11)不是零,   “描述”varchar(256)默认为空,   “update_time”默认时间戳NOT NULL CURRENT_TIMESTAMP> cd/usr/local/git克隆https://github.com/Meituan-Dianping/Leaf.git   乳糜泻叶   安装-DskipTests mvn干净   cd leaf-server


vim leaf-server/src/main/资源/叶。属性修改配置文件中数据库的连接方式

leaf.name=com.sankuai.leaf.opensource.test      leaf.segment.enable=true   leaf.jdbc.url=jdbc: mysql://192.168.20.10:3306/叶? useUnicode=true& characterEncoding=utf8& characterSetResults=utf8   leaf.jdbc.username=叶   leaf.jdbc.password=leaf1234      leaf.snowflake.enable=false   # leaf.snowflake.zk.address=# leaf.snowflake。端口=


<强>

cd/usr/local/leaf/leaf-server   运行mvn spring-boot:


测试我上面插入的3个biz_tag的发号器情况:

curl http://192.168.20.10:8080/api/部分/会/leaf-segment-test

curl http://192.168.20.10:8080/api/部分/会/优惠券

旋度http://192.168.20.10:8080/api/部分/get/tid


号段模式自带了个监控界面:http://192.168.20.10:8080缓存


测试id的生成效果:

我在{1 . . 2000};curl http://192.168.20.17:8080/api/部分/会/优惠券;完成   因为我在{1 . . 2000};curl http://192.168.20.10:8080/api/部分/会/优惠券;以前做


然后,我们在为循环获取id的时候,人为的把MySQL关闭掉,可以看到如下的,可以看到刚开始叶因为号段+双缓冲的存在,可以继续发号,但是当预分配的id都用光后,就会报错了:

全局id生成器试用之叶”> </p> <p> <br/> </p> <p>只要我们的MySQL数据库故障切换的时候不要太久,并且配合设置不同biz_tag以不同大小的步骤,通不会对对叶服务造成影响。</p> <p> <br/> </p> <p> <br/> </p> <p>下面是双缓冲在web界面上的体现:</p> <p> <img src=全局id生成器试用之叶