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

  

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

     
                       

     

     <李类=" osc_h4 ">   1. 数据库自增ID——来自闪烁的解决方案   李   <李类=" osc_h4 ">   2. 独立的应用程序,来自Twitter的解决方案   李            

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

     

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

  

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

  
 Tickets64 (
  无符号auto_increment id (),
  存根(),(id)、存根(stub)
  )=MyISAM 
  

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

  
 - - - - - - + 
  

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

  <>以前Tickets64(存根)();();之前   

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

  <>以前TicketServer1: -increment-increment=-increment-offset=TicketServer2: -increment-increment=-increment-offset=   

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

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

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

     

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

  

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

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

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

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

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