数据量上来后,单库单表承受不住的时候,我们就需要引入分库分表。但是分库分表后,主键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都用光后,就会报错了: