天天看點

MongoDB文檔全局唯一ID的設計思路

導讀:本文介紹了MongoDB文檔全局唯一ID的設計思路,MongoDB中資料的基本單元稱為文檔(Document)。文檔是MongoDB的核心概念,多個鍵極其關聯的值有序的放置在一起便是文檔。

關鍵詞:MongoDB 文檔資料庫 全局唯一ID NoSQL 

    MongoDB中資料的基本單元稱為文檔(Document)。文檔是MongoDB的核心概念,多個鍵極其關聯的值有序的放置在一起便是文檔。

Advertisement

    在一個特定集合内部,需要唯一的辨別文檔。是以MongoDB中存儲的文檔都由一個”_id”鍵,用于完成此功能。這個鍵的值可以是任意類型的,預設試ObjectId對象。ObjectId對象的生成思路是本文的主題,也是很多分布式系統可以借鑒的思路。

    為了考慮分布式,“_id”要求不同的機器都能用全局唯一的同種方法友善的生成它。是以不能使用自增主鍵(需要多台伺服器進行同步,既費時又費力),是以選用了生成ObjectId對象的方法。

    ObjectId使用12位元組的存儲空間,其生成方式如下:

1 2 3 4 5 6 7 8 9 10 11
時間戳 機器ID PID 計數器

    前四個位元組時間戳是從标準紀元開始的時間戳,機關為秒,有如下特性:

  1. 時間戳與後邊5個位元組一塊,保證秒級别的唯一性;
  2. 保證插入順序大緻按時間排序;
  3. 隐含了文檔建立時間;

    機器ID是伺服器主機辨別,通常是機器主機名的散列值。

    同一台機器上可以運作多個mongod執行個體,是以也需要加入程序辨別符PID。

    前9個位元組保證了同一秒鐘不同機器不同程序産生的ObjectId的唯一性。後三個位元組是一個自動增加的計數器(一個mongod程序需要一個全局 的計數器),保證同一秒的ObjectId是唯一的。同一秒鐘最多允許每個程序擁有(256^3 = 16777216)個不同的ObjectId。

    總結一下:時間戳保證秒級唯一,機器ID保證設計時考慮分布式,避免時鐘同步,PID保證同一台伺服器運作多個mongod執行個體時的唯一性,最後的計數器保證同一秒内的唯一性(選用幾個位元組既要考慮存儲的經濟性,也要考慮并發性能的上限)。

    “_id”既可以在伺服器端生成也可以在用戶端生成,在用戶端生成可以降低伺服器端的壓力。

原文出處:http://www.cnblogs.com/liuhao/archive/2011/12/01/2270649.html