傳統資料庫軟體開發中,主鍵自動生成技術各大資料庫對於該需求也提供了相應的支援,比如MySQL的自增。
分散式ID特性包括:唯一性:確保生成的ID是全網唯一的;高可用性:確保任何時候都能正確的生成ID。
github上對分散式ID這個特性的描述是:分散式唯一和時間序列。
主要方案方案包括
MongoDB的ObjectId設計成輕量型的,不同的機器都能用全域性唯一
它的格式:
前4 個位元組是從標準紀元開始的時間戳,單位為秒。時間戳,與隨後的5 個位元組組合起來,提供了秒級別的唯一性。由於時間戳在前,這意味著ObjectId 大致會按照插入的順序排列。這對於某些方面很有用,如將其作為索引提高效率。這4 個位元組也隱含了文件建立的時間。絕大多數客戶端類庫都會公開一個方法從ObjectId 獲取這個資訊。
接下來的3 位元組是所在主機的唯一識別符號。通常是機器主機名的雜湊值。這樣就可以確保不同主機生成不同的ObjectId,不產生衝突。 為了確保在同一臺機器上併發的多個程序產生的ObjectId 是唯一的,接下來的兩位元組來自產生ObjectId 的程序識別符號(PID)。
機器ID是伺服器主機標識,通常是機器主機名的雜湊值。
同一臺機器上可以執行多個mongod例項,因此也需要加入程序識別符號PID。
前9個位元組保證了同一秒鐘不同機器不同程序產生的ObjectId的唯一性。後三個位元組是一個自動增加的計數器(一個mongod程序需要一個全域性的計數器),保證同一秒的ObjectId是唯一的。同一秒鐘最多允許每個程序擁有(256^3 = 16777216)個不同的ObjectId。
總結一下:時間戳保證秒級唯一,機器ID保證設計時考慮分散式,避免時鐘同步,PID保證同一臺伺服器執行多個mongod例項時的唯一性,最後的計數器保證同一秒內的唯一性(選用幾個位元組既要考慮儲存的經濟性,也要考慮併發效能的上限)。
"_id"既可以在伺服器端生成也可以在客戶端生成,在客戶端生成可以降低伺服器端的壓力。
主要參考:
https://blog.csdn.net/forezp/article/details/69056017
https://www.cnblogs.com/xjk15082/archive/2011/09/18/2180792.html
傳統資料庫軟體開發中,主鍵自動生成技術各大資料庫對於該需求也提供了相應的支援,比如MySQL的自增。
分散式ID特性包括:唯一性:確保生成的ID是全網唯一的;高可用性:確保任何時候都能正確的生成ID。
github上對分散式ID這個特性的描述是:分散式唯一和時間序列。
主要方案方案包括
使用reids的incr命令使用UUIDTwitter的snowflake演算法利用zookeeper生成唯一IDMongoDB的ObjectIdMongoDB的ObjectId設計成輕量型的,不同的機器都能用全域性唯一
它的格式:
前4 個位元組是從標準紀元開始的時間戳,單位為秒。時間戳,與隨後的5 個位元組組合起來,提供了秒級別的唯一性。由於時間戳在前,這意味著ObjectId 大致會按照插入的順序排列。這對於某些方面很有用,如將其作為索引提高效率。這4 個位元組也隱含了文件建立的時間。絕大多數客戶端類庫都會公開一個方法從ObjectId 獲取這個資訊。
接下來的3 位元組是所在主機的唯一識別符號。通常是機器主機名的雜湊值。這樣就可以確保不同主機生成不同的ObjectId,不產生衝突。 為了確保在同一臺機器上併發的多個程序產生的ObjectId 是唯一的,接下來的兩位元組來自產生ObjectId 的程序識別符號(PID)。
前9 位元組保證了同一秒鐘不同機器不同程序產生的ObjectId 是唯一的。後3 位元組就是一個自動增加的計數器,確保相同程序同一秒產生的ObjectId 也是不一樣的。同一秒鐘最多允許每個程序擁有2563(16 777 216)個不同的ObjectId。機器ID是伺服器主機標識,通常是機器主機名的雜湊值。
同一臺機器上可以執行多個mongod例項,因此也需要加入程序識別符號PID。
前9個位元組保證了同一秒鐘不同機器不同程序產生的ObjectId的唯一性。後三個位元組是一個自動增加的計數器(一個mongod程序需要一個全域性的計數器),保證同一秒的ObjectId是唯一的。同一秒鐘最多允許每個程序擁有(256^3 = 16777216)個不同的ObjectId。
總結一下:時間戳保證秒級唯一,機器ID保證設計時考慮分散式,避免時鐘同步,PID保證同一臺伺服器執行多個mongod例項時的唯一性,最後的計數器保證同一秒內的唯一性(選用幾個位元組既要考慮儲存的經濟性,也要考慮併發效能的上限)。
"_id"既可以在伺服器端生成也可以在客戶端生成,在客戶端生成可以降低伺服器端的壓力。
主要參考:
https://blog.csdn.net/forezp/article/details/69056017
https://www.cnblogs.com/xjk15082/archive/2011/09/18/2180792.html