`

MySQL分库分表环境下全局ID生成方案

 
阅读更多

在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作。在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象。但是当我们对数据库进行了分库分表后,就不能依赖于每个表的自增ID来全局唯一标识这些数据了。因此,我们需要提供一个全局唯一的ID号生成策略来支持分库分表的环境。下面来介绍两种非常优秀的解决方案:

1. 数据库自增ID——来自Flicker的解决方案

因为MySQL本身支持auto_increment操作,很自然地,我们会想到借助这个特性来实现这个功能。Flicker在解决全局ID生成方案里就采用了MySQL自增长ID的机制(auto_increment + replace into + MyISAM)。一个生成64位ID方案具体就是这样的: 
先创建单独的数据库(eg:ticket),然后创建一个表:

CREATE TABLE Tickets64 (
            id bigint(20) unsigned NOT NULL auto_increment,
            stub char(1) NOT NULL default '',
            PRIMARY KEY  (id),
            UNIQUE KEY stub (stub)
    ) ENGINE=MyISAM

当我们插入记录后,执行SELECT * from Tickets64,查询结果就是这样的:

+-------------------+------+
| id                | stub |
+-------------------+------+
| 72157623227190423 |    a |
+-------------------+------+

在我们的应用端需要做下面这两个操作,在一个事务会话里提交:

REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();

这样我们就能拿到不断增长且不重复的ID了。 
到上面为止,我们只是在单台数据库上生成ID,从高可用角度考虑,接下来就要解决单点故障问题:Flicker启用了两台数据库服务器来生成ID,通过区分auto_increment的起始值和步长来生成奇偶数的ID。

TicketServer1:
auto-increment-increment = 2
auto-increment-offset = 1

TicketServer2:
auto-increment-increment = 2
auto-increment-offset = 2

最后,在客户端只需要通过轮询方式取ID就可以了。

  • 优点:充分借助数据库的自增ID机制,提供高可靠性,生成的ID有序。
  • 缺点:占用两个独立的MySQL实例,有些浪费资源,成本较高。

参考:http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/

2. 独立的应用程序——来自Twitter的解决方案

Twitter在把存储系统从MySQL迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。GitHub地址:https://github.com/twitter/snowflake。根据twitter的业务需求,snowflake系统生成64位的ID。由3部分组成:

41位的时间序列(精确到毫秒,41位的长度可以使用69年)
10位的机器标识(10位的长度最多支持部署1024个节点)
12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)

最高位是符号位,始终为0。

  • 优点:高性能,低延迟;独立的应用;按时间有序。
  • 缺点:需要独立的开发和部署。

from:http://my.oschina.net/u/142836/blog/174465

分享到:
评论

相关推荐

    MySQL分库分表技术

    **MySQL分库分表技术** 随着互联网业务的快速发展,数据量呈现爆炸性增长,单个数据库的性能瓶颈问题日益突出。在这种背景下,MySQL的分库分表技术应运而生,旨在解决高并发、大数据量场景下的性能挑战。本篇将深入...

    Python+MySQL分表分库实战

    在数据库架构设计和系统性能优化的领域中,MySQL分库分表技术是处理大规模数据和应对高并发请求的重要手段。随着数据量的快速增长和业务需求的不断提升,传统的单一数据库架构已经很难满足现代互联网应用的性能要求...

    MySQL 分库分表的实现原理及演示案例.zip

    MySQL数据库在面临大数据量时,性能可能会显著下降,此时就需要采用分库分表的技术来解决...通过学习和实践这些案例,你将能够更好地理解和掌握MySQL分库分表技术,从而为你的项目提供更高效、可扩展的数据库解决方案。

    50_一个关键的问题!分库分表之后全局id咋生成?.zip

    在IT行业中,数据库扩展是常见的需求,特别是在高并发、大数据量的应用场景下,分库分表成为提升系统性能的有效手段。然而,随着数据的分散,一个新的挑战也随之而来:如何在分库分表后生成全局唯一ID(Global ...

    Mysql分库分表实例-Sub-LibriryTable.zip

    "Mysql分库分表实例-Sub-LibriryTable"提供了一个实践性的数据库扩展解决方案,帮助应对大数据量和高并发场景下的性能挑战。通过学习这个实例,我们可以深入了解分库分表的原理、策略以及实际操作,提升在大型...

    sharding + mybatis-plus 分库分表

    "Sharding + Mybatis-Plus 分库分表"的主题就是针对这个问题提出的解决方案。Sharding-JDBC是一个轻量级的Java框架,它可以在不改变任何数据库语义和业务代码的情况下,实现数据库的水平拆分,从而提高系统的并行...

    第五节课交易分库分表详解一1

    - **全局ID生成**:结合美团的方案,使用业务ID加上区间自增ID,以确保全局唯一性。 综上所述,应对超大表和数据库压力,需要综合运用各种策略,包括硬件升级、数据库系统更换、分库分表技术以及优化业务流程。在...

    第六节课交易分库分表详解二1

    总的来说,分布式环境下处理交易数据的分库分表是一项复杂的工作,涉及到多方面的技术和策略。开发者需要根据业务需求、系统规模以及可用资源来选择最适合的解决方案,以确保系统的稳定运行和高效性能。

    SpringCobar分库分表

    在现代企业级应用程序开发中,随着数据量的不断增长,单个数据库往往难以承载庞大的业务数据,这使得分库分表成为一种必要的解决方案。本文将深入探讨“SpringCobar分库分表”这一主题,结合SpringMVC、Cobar、...

    基于mybatis插件实现轻量级分库分表方案-亿级数据mysql存储解决方案-mybatis-sharding.zip

    MyBatis-Sharding 是一种基于 MyBatis 的轻量级分库分表解决方案,它可以帮助开发者有效地解决亿级数据量下的 MySQL 存储问题。下面将详细介绍 MyBatis-Sharding 的核心概念、实现原理以及如何在实际项目中进行应用...

    分库分表入门级-lzg

    分库分表是应对大数据量、高并发场景下的数据库优化策略,旨在解决单表数据量过大、并发处理能力不足等问题。本文将深入探讨分库分表的基本概念、关键问题及其解决方案,并介绍相关开源工具和实际应用案例。 **一、...

    Mycat数据库分库分表

    2. 表结构设计:在分库分表后,表的主键需要调整,通常采用全局唯一ID生成器生成分布式主键,保证数据的唯一性。 3. SQL改写:由于分片的存在,SQL不能再直接操作全量数据,需要对SQL进行改写,Mycat会自动完成这个...

    U8改造-分库分表1

    ### U8改造-分库分表实施细节 #### 一、背景与目标 在现代互联网应用中,随着用户数量的增长及业务复杂度的提升,单一数据库往往难以满足高性能、高可用性的需求。针对U8系统(以下简称“系统”),本文档详细介绍...

    全局自增ID设计方案

    在大型互联网应用中,随着用户数量的急剧增加,为了提升应用性能、确保系统的稳定运行,常常需要对数据库进行分库分表处理。在传统的单表环境中,数据库自带的自增ID功能能够有效地为每一个数据条目提供唯一的标识符...

    分布式系统ID生成器解决方案.docx

    随着数据量的不断增长,数据库的分库分表策略需要一个全局唯一的ID来标识每条记录,传统的数据库自增ID不再适用。因此,引入专门的分布式ID生成器解决方案成为必要。 ### UUID方案 UUID(Universally Unique ...

    Springboot2.x+ShardingSphere实现分库分表的示例代码

    分库分表是一种数据库优化策略,用于处理大数据量和高并发场景下的性能问题。ShardingSphere 是一个分布式数据库解决方案,提供分片、读写分离、数据库事务一致性等能力。 首先,我们要理解分库分表的基本概念。...

    mysql面试题100题,包含答案和解析.docx

    - 分库分表面临事务处理、跨节点查询、数据迁移、ID生成和排序分页等挑战。 5. **InnoDB与MyISAM的区别**: - InnoDB支持事务和外键,MyISAM不支持。 - InnoDB支持MVCC,适合并发环境,而MyISAM更适合读密集型...

    Java 数据库主键生成类 IdWorker

    数据在分片时,典型的是分库分表,就有一个全局ID生成的问题。 单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求: 1 不能有单点故障。 2 以时间为序,或者ID里包含时间。这样一是可以少一...

    Java开发面试必备知识技能总结视频合集

    - **ID生成方案**:介绍在分布式环境中保证ID全局唯一性的几种常见方案,如UUID、Snowflake算法等。 - **具体实现**:结合分库分表的场景,探讨如何在实际项目中实现全局唯一ID的生成与分配。 #### 6. RPC底层通讯...

    mycat_建库建表_SQL.rar

    总结来说,Mycat通过分库分表解决了大数据量下的性能瓶颈,而SQL脚本则是在Mycat环境中进行数据库和表结构构建的基本工具。理解Mycat的分片策略和SQL语句的使用是成功部署和管理分布式数据库的关键。"mycat_建库建表...

Global site tag (gtag.js) - Google Analytics