共勉
"诸君离学校而去了。在社会上立身的困难,恐怕比在学校里求学还要加甚。若非立志奋斗,则以前所受的教育,反足以增加人生的苦恼,或转为堕落的工具。这是诸君所当特别注意的。事业的成功,须经过长时间的辛苦艰难——成功的代价,走过了许多荆棘的路,方才能寻获康庄大道。立志是砍荆棘斧斤,奋斗是劳力。万不可希望以最少的劳力,获最大的成功。" -- 蒋梦麟
Knight's Blog
滴滴海浪技术主管, 前百度资深研发工程师,现居上海。 擅长于大规模的系统平台服务架构。在

- 亿级别搜索平台(sov5.com)
- 大规模分布式爬虫
- 中间件架设(disconf,CanalX)
- 广告平台(百度联盟广告)
- 租车平台(滴滴租车)
- 语言招聘平台(51tra.com)
- 内容平台(100weidu.com)
- 社区平台(python88.com)
- 资源下载平台(misou.com)
- 计算机图形图像技术(一篇一作)
- 机器学习(一篇一作)

等领域具有颇有经验。
联系方式: knightliao AT gmail.com
联系
Knight's Blog » 工作

通用全局唯一ID生成器

2015-02-12 13:10

通用全局唯一ID生成器

前言

全局唯一生成器在很多场景下需要,例如,sharding时。

下面介绍几种方法来解决这个问题。

双db方案

flickr开发团队在2010年撰文介绍了flickr使用的一种主键生成测策略,同时表示该方案在flickr上的实际运行效果也非常令人满意。

http://techv5.com/topic/1199/

其主要的想法 是

  • 双DB
  • DB分别生成奇、偶的ID
  • ID生成是事务的

此种方案的优缺点:

  • 优点:速度快,稳定性高,一致性高,没有单点问题。
  • 缺点:需要部署两个db,ID生成不连续

redis+lua方案

采用redis+lua的id generato算法,可以非常方便的实现一个ID生成服务。

若在redis-client里采用预取技术,可以保证ID的连续性。如果redis-client实例经常会重启,更甚者,可以将使用的ID dump成文件,方便重启时不必浪费ID。

http://ww4.sinaimg.cn/bmiddle/60c9620fjw1ep6hn9hrw9j20dm084dfz.jpg

优缺点是:

  • 优点:速度极快,ID连续性较高
  • 缺点:单点问题,存在不一致问题。如果主redis挂机,备redis切换成主redis。这个过程可能ID会有不一致。

增强版

模仿第一种方案,采用双redis方案,各台redis来生成奇偶ID。稳定性和单点问题可以大部分解决掉。

ID生成服务化

http://ww2.sinaimg.cn/bmiddle/60c9620fjw1ep6hk9rw4wj20fm0dvaaq.jpg

  • ID服务以服务化RPC开放出来
  • 采用预取ID技术保证大部分时间内ID的连续性
  • mysql采用mysqlproxy方案

优缺点:

  • 优点:稳定性高,一致性。ID连续性较高。比较适合服务化。
  • 缺点:
    • 可能存在id不连续,但比 双DB方案 要好。
    • mysql是单点。

总结

除了第一种方案外,第二、第三种方案均存在着单点DB的问题。

第二种方案部署最简单,一台redis可以搞定一切。如果害怕单点问题,也可以采用增强版方案。

鉴于大型企业mysql运维技术的稳定性,第一、第三方案均属于较大型企业的选择方案,部署起来比较复杂。

本文链接地址:通用全局唯一ID生成器
5009 次点击