news 2026/7/5 4:18:09

美团 Leaf-snowflake 分布式 ID 生成器 k8s 改造的想法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
美团 Leaf-snowflake 分布式 ID 生成器 k8s 改造的想法

美团 Leaf-snowflake 分布式 ID 生成器 k8s 改造的想法

+--------------------------------------------------------------------------+ | 1 Bit Unused | 41 Bit Timestamp | 10 Bit workerID | 12 Bit Sequence ID | +--------------------------------------------------------------------------+

snowflake 生成的 ID 共 64 位:

  1. 1 bit 符号位,固定 0,保证 ID 永远为正数
  2. 41 bit 毫秒时间戳,相对于起始基准时间的毫秒偏移量
  3. 10 bit 机器号,用于标识数据中心和机器节点
  4. 12 Bit,同一毫秒内自增序号

原始的 snowflake 有两个问题:

  1. workerId 需要手动配置,服务规模较大的话手动配置成本太高
  2. 时钟回拨导致生成的 ID 重复

美团 Leaf-snowflake 解决了这两个问题。

自动生成 workerID

服务启动时遍历 zookeeperPATH_FOREVER节点的所有子节点,子节点的 key 格式为{ip}:{port}-xxxxxxxxxx,然后截取-的前面和本机的{ip}:{port}对比,如果一样则说明之前注册过,截取-后面的字符串转为int作为workerId。若不存在,则会在 zookeeper 创建一个格式为{PATH_FOREVER}/{ip}:{port}-持久顺序 znode(比如/snowflake/com.sankuai.leaf.opensource.test/forever/192.168.124.1:8080-0000000000),截取出workerId存入本地文件workerID.properties中。如果服务启动时无法连接 zookeeper,本地文件workerID.properties中的workerId可以作为一个 failover。

本地启动后 zookeeper 内容如下,forever 只有一个节点192.168.124.1:8080-0000000000,节点的值中包含了服务器的 ip、port、当前时间戳:

[zk:127.0.0.1:2181(CONNECTED)40]ls/snowflake/com.sankuai.leaf.opensource.test/forever[192.168.124.1:8080-0000000000][zk:127.0.0.1:2181(CONNECTED)18]get /snowflake/com.sankuai.leaf.opensource.test/forever/192.168.124.1:8080-0000000000{"ip":"192.168.124.1","port":"8080","timestamp":1783139487629}

时钟回拨

  1. 在自动生成workerID的同时在 value 中上报了机器的当前时间,除此之外还会开启一个定时任务每 3s 上报一次机器的当前时间。

  2. 在启动时会去查询最后一次上报的时间,如果当前时间小于最后一次上报的时间则直接抛出异常,停止服务,防止生成的 ID 重复。

  3. 如果是新服务节点,需要综合对比其余 Leaf 节点的系统时间来判断自身系统时间是否准确,具体做法是取leaf_temporary下的所有临时节点(所有运行中的Leaf-snowflake节点)的服务IP:Port,然后通过RPC请求得到所有节点的系统时间,计算sum(time)/nodeSize

    1. abs( 系统时间-sum(time)/nodeSize ) < 阈值,认为当前系统时间准确,正常启动服务,同时写临时节点leaf_temporary/${self}维持租约。
    2. 否则认为本机系统时间发生大步长偏移,启动失败并报警。
  4. 如果时钟回拨时间较短,可以 wait 一会,等本机时间追上上次上报时间后再提供服务。

在 GitHub - Meituan-Dianping/Leaf: Distributed ID Generate Service 中我只找到了 1、2,第 3、4 条是在 Leaf——美团点评分布式ID生成系统 | 美团 · 技术团队 提到的。

k8s 改造的想法

k8s StatefulSet 可以为 pod 提供稳定的 hostname、稳定唯一的网络标识符、稳定的存储,完全可以替代 zookeeper 的作用。

假设 StatefulSet 名称为 leaf,则各个 pod 的 hostname 为 leaf-0、leaf-1、leaf-2,Headless Service 名称为 leaf.svc 提供稳定的网络标识符,且使用 PVC 挂载了存储,leaf-0 会使用 pvc-0,leaf-1 会使用 pvc-1,pod 和 pvc 之间的关联是稳定的,重启后也是如此。使用 8080 端口启动所有 leaf 服务。

  1. 自动workerID:直接解析 hostname 使用-后面的序号作为workerID即可,甚至不需要本地workerID.properties文件作为 failover。
  2. 上报本机时间:不再上报给 zookeeper,而是存储在 pvc 挂载目录的本地文件中。
  3. 获取其他 leaf 节点的服务IP、Port:不再使用leaf_temporary临时节点,改为直接调用 k8s API 查询 StatefulSet 下的 pod name。
  4. 访问其他 leaf 节点获取系统时间:通过<pod-name>.<headless-svc-name>访问,例如访问 leaf-3 使用leaf-3.leaf.svc:8080

参考

  • Leaf——美团点评分布式ID生成系统 | 美团 · 技术团队
  • GitHub - Meituan-Dianping/Leaf: Distributed ID Generate Service · GitHub
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 4:17:52

164、PCIE在VMware中的虚拟化:当硬件变成“软件定义”

164、PCIE在VMware中的虚拟化:当硬件变成“软件定义” 最近帮同事排查一个诡异的问题:他的驱动在物理机上跑得好好的,一到虚拟机里就报PCIE配置空间访问错误。我让他把VMware的虚拟硬件配置截图发过来,一眼就看到问题所在——他给虚拟机配了“PCIE设备直通”,但宿主机的I…

作者头像 李华
网站建设 2026/7/5 4:14:04

Unitree RL Gym:四足机器人强化学习框架完全指南

Unitree RL Gym&#xff1a;四足机器人强化学习框架完全指南 【免费下载链接】unitree_rl_gym 项目地址: https://gitcode.com/GitHub_Trending/un/unitree_rl_gym 想要让四足机器人像真实动物一样灵活行走、奔跑甚至跳跃吗&#xff1f;Unitree RL Gym正是这样一个强大…

作者头像 李华
网站建设 2026/7/5 4:12:19

轻量级AI智能体:安全、场景与硬件穿透的工程实践

1. 项目概述&#xff1a;轻量级AI智能体不是“减配版”&#xff0c;而是精准适配的生产力工具最近在技术圈和办公软件社群里&#xff0c;“养龙虾”这个词火了——它不是水产养殖指南&#xff0c;而是对 OpenClaw 架构下各类 AI 智能体&#xff08;Agent&#xff09;产品的戏称…

作者头像 李华
网站建设 2026/7/5 4:10:24

AI绘画本地插件部署指南:实现“指哪改哪”的精准图像编辑

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 在实际 AI 绘画和图像编辑工作流中&#xff0c;一个常见的痛点在于修改的精确性。传统的 AI 绘图工具往往需要用户用文字反复描述修改…

作者头像 李华