`

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分库分表是数据库架构设计中用于处理大规模数据量以及高并发请求的一种技术手段。通过将数据拆分到不同的数据库服务器中,能够有效降低单个数据库的负载,提高系统的扩展性和性能。Python作为一种流行的编程...

    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