关于分布式:分布式-ID-解决方案之美团-Leaf

31次阅读

共计 1904 个字符,预计需要花费 5 分钟才能阅读完成。

分布式 ID

在宏大简单的分布式系统中,通常须要对海量数据进行惟一标识,随着数据日渐增长,对数据分库分表当前须要有一个惟一 ID 来标识一条数据,而数据库的自增 ID 显然不能满足需要,此时就须要有一个可能生成全局惟一 ID 的零碎,须要满足以下条件:

  • 全局唯一性:最根本的要求就是不能呈现反复的 ID。
  • 递增:保障下一个 ID 肯定大于上一个 ID。
  • 信息安全:如果 ID 是间断的,用户就能够依照程序进行歹意爬取数据,所以 ID 生成无规则。

上述的 2 和 3 点需要是互斥的,无奈应用同一个计划满足。

解决方案

数据库生成

以 MySQL 为例,利用给字段设置 auto_increment_incrementauto_increment_offset 来实现 ID 自增。每次业务能够应用下列 SQL 进行读写失去 ID:

begin;
REPLACE INTO Tickets64 (stub) VALUES (‘a’);
SELECT LAST_INSERT_ID();
commit;

  • 长处:应用非常简单,ID 枯燥递增。
  • 毛病:十分依赖数据库,当数据库异样时则整个零碎不可用。

UUID

  • 长处:本地生成,没有网络耗费,性能高。
  • 毛病:过长不易于存储;造成信息不平安,基于 MAC 地址生成可能会造成 MAC 地址泄露。

Snowflake

Snowflake(雪花算法)是由 Twitter 公布的分布式 ID 生成算法,它可能保障不同过程主键的不重复性,以及雷同过程主键的有序性。它是通过工夫位实现枯燥递增,且各个服务器如果都做了工夫同步,那么生成的 ID 能够认为是总体有序的。

Leaf

Leaf 最晚期需要是各个业务线的订单 ID 生成需要。在美团晚期,有的业务间接通过数据库自增的形式生成 ID,有的业务通过 Redis 缓存来生成 ID,也有的业务间接用 UUID 这种形式来生成 ID。以上的形式各自有各自的问题,因而决定实现一套分布式 ID 生成服务来满足需要。

Leaf-segment

Leaf-segment 数据库计划,在应用数据库的计划上,做了以下扭转:

  • 原计划每次获取 ID 都得读写一次数据库,造成数据库压力大。改为利用 proxy server 批量获取一个 segment 号段,用完之后再去数据库获取新的号段,大大加重数据库的压力。
  • 各个业务不同的发号需要用 biz_tag 字段来辨别,每个 big_tag 的 ID 获取互相隔离互不影响。

长处:

  • Leaf 服务能够很不便的线性扩大,性能齐全可能撑持大多数业务场景。
  • ID 是趋势递增的 8 字节的 64 位数字,满足数据库存储的主键要求。
  • 容灾性高:Leaf 服务外部有号段缓存,即便数据库宕机,短时间内仍能能够失常对外提供服务。
  • 能够自定义 max_id 大小。

毛病:

  • ID 不够随机,可能泄露发号数量的信息,不平安。
  • 数据库宕机可能会造成整个零碎不可用。
Leaf-snowflake

该计划齐全沿用 snowflake 方案设计。对于 workerID 的调配,当服务器集群数量较小的状况下,齐全能够手动配置。服务规模较大时,入手配置老本太高,所以应用 Zookeeper 长久程序节点的个性主动对 snowflake 节点配置。

启动步骤如下:

  1. 启动 Leaf-snowflake 服务,连贯 Zookeeper,在 leaf_forever 父节点下查看本人是否曾经注册过。
  2. 如果有注册过间接取回本人的 workerID,启动服务。
  3. 如果没有注册过,就在该父节点上面创立一个长久程序节点,创立胜利后取回顺序号当做本人的 workerID 号。

应用 Docker Compose 部署 Leaf

克隆我的项目

$ git clone https://github.com/antoniopen…

$ cd leaf

$ mvn clean install -DskipTests

构建

$ cd leaf-docker

$ chmod +x build.sh

$ ./build.sh

启动

$ docker-compose up -d

测试

生成地址:http://localhost:8080/api/snowflake/get/test

$ curl http://localhost:8080/api/snowflake/get/test

  • 文章作者:彭超
  • 本文首发于集体博客:https://antoniopeng.com/2020/07/22/%E5%88%86%E5%B8%83%E5%BC%8F/%E5%88%86%E5%B8%83%E5%BC%8F%20ID%20%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%B9%8B%E7%BE%8E%E5%9B%A2%20Leaf/
  • 版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自 彭超 | Blog!
正文完
 0