分布式系统中分布式ID生成方案的技术详解

news/2025/3/22 18:22:04/

分布式系统中分布式ID生成方案的技术详解

        • 一、分布式系统唯一ID的特点
        • 二、分布式系统唯一ID的实现方案
          • 1. UUID
          • 2. 数据库生成ID
          • 3. Redis生成ID
          • 4. Snowflake雪花算法
          • 5. 美团Leaf
        • 三、总结

在复杂的分布式系统中,数据被分散存储在不同的节点上,每个节点都有自己独立的数据库。为了保证数据的唯一性和一致性,我们需要为每个数据项生成一个全局唯一的主键ID。本文将详细解析几种常用的分布式ID生成方案,包括它们的工作原理、优缺点以及适用场景。

一、分布式系统唯一ID的特点
  1. 全局唯一性:不能出现重复的ID号,这是最基本的要求。
  2. 趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。
  3. 单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求。
  4. 信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。
  5. 高可用性:ID生成系统必须保证高可用,确保在任何时候都能正确生成ID。
  6. 高性能:ID生成速度要快,对本地资源消耗要小。
二、分布式系统唯一ID的实现方案
1. UUID

工作原理:UUID(Universally Unique Identifier)是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的唯一标识符。它由一个32位数的16进制数字组成,以连字号分隔的五组来显示,形式为8-4-4-4-12的36个字符。

优点

  • 性能非常高,本地生成,没有网络消耗。
  • 全球唯一,数据迁移容易。

缺点

  • 不易于存储,UUID太长,通常以36长度的字符串表示,很多场景不适用。
  • 信息不安全,基于MAC地址生成的UUID算法可能会暴露MAC地址。
  • ID作为主键时在特定的环境会存在一些问题,比如MySQL InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。

适用场景:适用于不需要ID有序性的场景,如会话ID、临时文件名等。

2. 数据库生成ID

工作原理:利用数据库的自增主键功能(如MySQL的AUTO_INCREMENT),每次插入记录时自动生成递增的ID。

优点

  • 实现简单,ID单调自增,数值类型查询速度快。

缺点

  • 强依赖数据库,当数据库异常时整个系统不可用。
  • 分布式系统中,多个数据库实例可能生成重复ID。
  • 数据库性能瓶颈可能限制ID生成速度。

改进方案

  • 数据库集群模式:通过多个数据库实例设置不同的起始值和步长来生成全局唯一的ID。例如,实例1从1开始,步长为2;实例2从2开始,步长为2。
  • 号段模式:每次从数据库取出一个号段范围(如1000-2000),在内存中分配,使用完后再获取下一段。这样可以减少对数据库的直接访问,提升生成性能。

适用场景:适用于单机数据库或主从复制的数据库环境,不适合分布式数据库。

3. Redis生成ID

工作原理:利用Redis的原子性操作(如INCR命令)生成递增的唯一ID。

优点

  • 不依赖于数据库,灵活方便,且性能优于数据库。
  • 数字ID天然排序,对分页或者需要排序的结果很有帮助。

缺点

  • 需要依赖Redis服务,若Redis故障,ID生成受影响。
  • 需要配置持久化机制以防数据丢失。
  • 如果系统中没有Redis,还需要引入新的组件,增加系统复杂度。

适用场景:适用于高并发、需要快速生成ID的场景,如秒杀系统、日志ID等。

4. Snowflake雪花算法

工作原理:由Twitter开发的分布式ID生成算法,使用64位ID,包含时间戳、机器ID和序列号等部分。

优点

  • ID基于时间戳递增,具有一定有序性。
  • 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高。
  • 生成ID的性能非常高,每秒能生成约26万个ID。
  • 可以根据自身业务特性分配bit位,非常灵活。

缺点

  • 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。
  • 需要确保机器ID唯一。

适用场景:适用于分布式系统需要唯一且有序ID的场景,如微博ID、评论ID等。

5. 美团Leaf

工作原理:美团开源的分布式ID生成系统,提供了两种生成方式:号段模式和雪花算法。

优点

  • 支持高性能、高可用和可伸缩的ID生成。
  • 适用于各种规模的分布式系统。

缺点

  • 需要根据业务需求进行配置和调优。

适用场景:适用于对ID生成有高性能、高可用要求的分布式系统。

三、总结

选择合适的分布式ID生成方案需要综合考虑系统的规模、性能需求、ID的顺序性和唯一性要求以及对网络的依赖程度。不同的方案各有优缺点和适用场景,在实际应用中需要根据具体情况进行权衡和选择。通过合理使用分布式ID生成方案,可以确保分布式系统中数据的唯一性和一致性,提高系统的可靠性和性能。


http://www.ppmy.cn/news/1581187.html

相关文章

【零基础入门unity游戏开发——unity3D篇】3D模型 —— Rig操纵页签和Avatar化身系统

参考原文:https://blog.csdn.net/linxinfa/article/details/116666936 考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,…

Python第六章07:元组的定义和操作

# tuple元组的定义和操作# tuple元组定义用小括号:(1,2,3,4,5),可以是不同类型元素 # 给变量定义元组时,写括号不写tuple: a (1,2,3,4,5) # 变量 () 变量 tuple() 空元组变量 # tuple…

C#零基础入门篇(18. 文件操作指南)

## 一、文件操作基础 在C#中,文件操作主要通过System.IO命名空间中的类来实现,例如File、FileStream、FileInfo等。 ## 二、常用文件操作方法 ### (一)文件读取 1. **使用File.ReadAllText方法读取文件内容为字符串** …

Linux系统中安装各种常用中间件

Linux安装docker 安装docker 定制软件源 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装最新版docker yum list docker-ce --showduplicates | sort -r…

什么是ETL

概述 ETL(Extract-Transform-Load)是一种数据集成过程,常用于数据仓库、数据分析、数据清洗等场景。ETL的主要目标是从不同数据源提取数据,进行清洗、转换,然后加载到目标数据仓库或分析系统。 ETL所描述的过程&…

【Leetcode 每日一题】2680. 最大或值

问题背景 给你一个下标从 0 0 0 开始长度为 n n n 的整数数组 n u m s nums nums 和一个整数 k k k。每一次操作中,你可以选择一个数并将它乘 2 2 2。 你最多可以进行 k k k 次操作,请你返回 n u m s [ 0 ] ∣ n u m s [ 1 ] ∣ . . . ∣ n u m …

Prometheus Exporter系列-Postgres_Exporter一键部署

这是postgresql exporter的一件安装&#xff0c;经测试可以稳定运行&#xff0c;重新运行会删除旧exporter相关信息创建新的 #!/bin/bash# PostgreSQL Exporter 一键安装脚本&#xff08;最终版&#xff09; # 使用方法: ./pg_exporter_setup.sh <导出端口>set -e# 版本…

DeepSeek写打台球手机小游戏

DeepSeek写打台球手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端打台球小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 有白球和其他颜色的球&am…