MongoDB文档(Document)全局唯一ID的设计思路

文章转自:http://www.cnblogs.com/liuhao/archive/2011/12/01/2270649.html


MongoDB中数据的基本单元称为文档(Document)。文档是MongoDB的核心概念,多个键极其关联的值有序的放置在一起便是文档。

在一个特定集合内部,需要唯一的标识文档。因此MongoDB中存储的文档都由一个"_id"键,用于完成此功能。这个键的值可以是任意类型的,默认试ObjectId对象。ObjectId对象的生成思路是本文的主题,也是很多分布式系统可以借鉴的思路。

为了考虑分布式,“_id”要求不同的机器都能用全局唯一的同种方法方便的生成它。因此不能使用自增主键(需要多台服务器进行同步,既费时又费力),因此选用了生成ObjectId对象的方法。

ObjectId使用12字节的存储空间,其生成方式如下:

|0|1|2|3|4|5|6 |7|8|9|10|11|

|时间戳  |机器ID|PID|计数器   |

前四个字节时间戳是从标准纪元开始的时间戳,单位为秒,有如下特性:

  1. 时间戳与后边5个字节一块,保证秒级别的唯一性;
  2. 保证插入顺序大致按时间排序;
  3. 隐含了文档创建时间;

时间戳的实际值并不重要,不需要对服务器之间的时间进行同步(因为加上机器ID和进程ID已保证此值唯一,唯一性是ObjectId的最终诉求)。

机器ID是服务器主机标识,通常是机器主机名的散列值。

同一台机器上可以运行多个mongod实例,因此也需要加入进程标识符PID。

前9个字节保证了同一秒钟不同机器不同进程产生的ObjectId的唯一性。后三个字节是一个自动增加的计数器(一个mongod进程需要一个全局的计数器),保证同一秒的ObjectId是唯一的。同一秒钟最多允许每个进程拥有(256^3 = 16777216)个不同的ObjectId。

总结一下:时间戳保证秒级唯一,机器ID保证设计时考虑分布式,避免时钟同步,PID保证同一台服务器运行多个mongod实例时的唯一性,最后的计数器保证同一秒内的唯一性(选用几个字节既要考虑存储的经济性,也要考虑并发性能的上限)。

 

"_id"既可以在服务器端生成也可以在客户端生成,在客户端生成可以降低服务器端的压力。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
7.4 7.4 文档 文档型数据库 型数据库 1 数据库原理及应用 电子科技大学-张凤荔 数据库系统原理与开发 MongoDB数据库的组成 MongoDB的集群架构 【 【本节学习目标 本节学习目标】 】 2 数据库原理及应用 电子科技大学-张凤荔 数据库系统原理与开发 一、文档数据库的组成 面向集合且模式自由的文档型数据库。面向集合--数据被分组为集 合(文档);数据模式自由;存储的数据是键值对的集合,键是字符 串,值是任意类型,包括数组和文档文档MongoDB中数据的基本单元,集合可以被看作没有模式的表, MongoDB每个实例都可容纳多个独立数据库,每个数据库都有自己 的集合和权限(数据库)。 文档 (Document)--- 文档组集合 :Collection -- 多个集合 : 数据库 (database)。一个实例支持多个数据库(database) 3 数据库原理及应用 电子科技大学-张凤荔 数据库系统原理与开发 1 数据库对应的文件信息 默认数据目录是/daba/db,存储所有的数据文件,每个数据库都包 含一个.ns文件和一些数据文件,例如test数据库,数据库的文件 就会由test.ns、test.0、test.1、test.2等组成。 预分配空间的机制,用0进行填充。 每新分配一次,它的大小都会 是上一个数据文件大小的2倍,每个数据文件最大2G。 数据库的每张表都对应一个命名空间,每个索引也有对应的命名空 间,这些命名空间的元数据集中在*.ns文件中。 4 数据库原理及应用 电子科技大学-张凤荔 数据库系统原理与开发 例子– 数据库的相关文件 test数据库包含3个文件用于存储表和索引数据,test.2预分配的 空文件,test.0和test.1分到相应的盘区对应不同的名字空间。 每个命名空间可以包含多个不同的盘区,不是连续的,命名空间对 应的盘区随着分配的次数不断增长的。 不用释放回收空闲的磁盘 空间。 mongodb的数据将会保存在底层文件系统中,dbpath设定为 "/data/db"目录,创建一个database为"test",collection为 "sample",然后在此collection中插入数条documents。我们查 看dbpath下生成的文件列表: 5 数据库原理及应用 电子科技大学-张凤荔 数据库系统原理与开发 例子– 数据库的相关文件 test已经有6个数据文件(data files),每个文件以 "database"的名字 + 序列数字组成,序列号从0开始,逐个递增, 数据文件从16M开始,每次扩张一倍(16M、32M、64M、128M...) > ls -lh -rw------- 1 mongo mongo 16M 11 6 17:24 test.0 -rw------- 1 mongo mongo 32M 11 6 17:24 test.1 -rw------- 1 mongo mongo 64M 11 6 17:24 test.2 -rw------- 1 mongo mongo 128M 11 6 17:24 test.3 -rw------- 1 mongo mongo 256M 11 6 17:24 test.4 -rw------- 1 mongo mongo 512M 11 6 17:24 test.5 -rw------- 1 mongo mongo 512M 11 6 17:24 test.6 -rw------- 1 mongo mongo 16M 11 6 17:24 test.ns 6 数据库原理及应用 电子科技大学-张凤荔 数据库系统原理与开发 数据库存储--collection 数据库中所有的collections以及索引信息分散存储在多个数据文 件中,数据分块的单位为extent(范围,区域),即一个data file中有多个extents组成,extent中可以保存collection数据或 者indexes数据,一个extent只能保存同一个collection数据,不 同的collections数据分布在不同的extents中,indexes数据也保 存在各自的extents中; 在每个database的namespace文件中,每个collection只保存了第 一个extent的位置信息,每个extent都维护者一个链表关系。 7 数据库原理及应用 电子科技大学-张凤荔 数据库系统原理与开发 2 Namespace文件 对于namespace文件,比如"test.ns"文件,默认大小为16M,此 文件中主要用于保存"collection"、index的命名信息, 可保存collection的"属性"信息、每个索引的属性类型等 通

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值