色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

分布式系統的主鍵生成方案對比

OSC開源社區 ? 來源:OSCHINA 社區 ? 2023-09-20 10:36 ? 次閱讀

來源| OSCHINA 社區

作者 |京東云開發者-京東物流 金越

UUID

UUID(通用唯一識別碼)是由 32 個十六進制數組成的無序字符串,通過一定的算法計算出來。為了保證其唯一性,UUID 規范定義了包括網卡 MAC 地址、時間戳、名字空間(Namespace)、隨機或偽隨機數、時序等元素,以及從這些元素生成 UUID 的算法。一般來說,算法可以保證任何地方產生的任意一個 UUID 都不會相同,但這個唯一性是有限的,只在特定的范圍內才能得到保證。 UUID 的一個非常明顯的特點就是本身較長,格式是這樣的:

xxxxxxxx-xxxx-Mxxx-xxxx-xxxxxxxxxxxx
467e8542-2275-4163-95d6-7adc205580a9
其中 M 位置,代表版本號,由于 UUID 的標準實現有 5 個版本,所以只會是 1、2、3、4、5;

各版本介紹

UUID 現有的 5 種版本,是根據不同的使用場景劃分的,而不是根據精度,所以 Version5 并不會比 Version1 精度高,在精度上大家都能保證唯一性,重復的概率近乎于 0。 總結:

使用 UUID,每個人都可以創建不與其它人沖突的唯一值,在所有空間和時間上都可以被視為唯一的標識。

UUID 可單機自行生成,且生成速度快,QPS 高,各個語言都有對應的生成供直接調用使用。

如果只是需要生成一個唯一 ID,可以使用 V1 或 V4。v1 基于時間戳和 Mac 地址,這些 ID 有一定的規律,而且會暴露你的 Mac 地址。v4 是完全隨機 (偽) 的。

如果對于相同的參數需要輸出相同的 UUID, 你可以使用 V3 或 V5。

Version1: 基于時間戳及 MAC 地址的實現

其中包括了 48 位的 MAC 地址和 60 位的時間戳。且 v1 為了保證唯一性,當時間精度不夠時,會使用 13~14 位的 clock sequence 來擴展時間戳,比如:當 UUID 的生產成速率太快,超過了系統時間的精度。時間戳的低位部分會每增加一個 UUID 就 + 1 的操作來模擬高精度的時間戳,換句話說,就是當系統時間精度無會區分 2 個 UUID 的時間先后時,為了保證唯一性,會在其中一個 UUID 上 + 1。所以 UUID 重復的概率幾乎為 0,時間戳加擴展的 clock sequence 一共有 74bits,(2 的 74 次方,約為 1.8 后面加 22 個零), 即在每個節點下,每秒可產生 1630 億不重復的 UUID。 但由于 v1 中最后的 12 位是網卡的 MAC 地址,會導致隱私問題以及安全問題,這是這個版本 UUID 受到批評的地方。

Version2: DCE 安全的 UUID

DCE(Distributed Computing Environment)安全的 UUID 和基于時間的 UUID 算法相同,但會把時間戳的前 4 位置換為 POSIX 的 UID 或 GID。這個版本的 UUID 在實際中較少用到。

Version3: 5 基于名稱空間和名字

v3 和 v5 都是通過計算 namespace 和名稱的哈希值生成的。不同的點在于 v3 使用的 hash 算法為 MD5,v5 使用 SHA-1。因為算法中沒有不確定的部分,所以當 namespace 與名稱確定時,得到的 UUID 都是確定唯一的。比如:

$ uuid -n 3 -v3 ns:URL www.jd.com
7e963853-8fce-3085-bb2c-8424745d73a2
7e963853-8fce-3085-bb2c-8424745d73a2
7e963853-8fce-3085-bb2c-8424745d73a2
算法實現中會將 namespace 和輸入參數拼接在一起,計算 hash 結果,再進行截斷格式化等操作來保證唯一性。

Version4: 基于隨機數

v4 的 UUID 中 4 位代表版本,2-3 位代表 variant。余下的 122-121 位都是全部隨機的。即有 2 的 122 次方 (5.3 后面 36 個 0) 個 UUID。一個標準實現的 UUID 庫在生成了 2.71 萬億個 UUID 會產生重復 UUID 的可能性也只有 50% 的概率。這相當于每秒產生 10 億的 UUID,持續 85 年,而把這些 UUID 都存入文件,每個 UUID 占 16bytes, 總需要 45EB (exabytes),比目前最大的數據庫 (PB) 還要大很多倍。 在 java 中使用 v4:

# java 1.5+ 
# java.util.UUID

for (int i = 0; i < 3; i++) {
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
}

生成的 UUID 如下:

8bca474b-214d-4ce8-8446-b99f30147f94
c38588cf-a1c4-4758-9d86-b2ee5552ae59
febf5a46-bd1b-43f8-89a8-d5606e5d1ce0
由于這個版本使用非常簡單,因此使用最為廣泛。

SnowFlake 算法

雪花算法,是 Twitter 開源的分布式 ID 生成算法。雪花算法中利用了時間戳,機器 ID,以及同毫秒內的不同序列號來保證分布式生成 ID 的唯一性。 雪花算法總結 1. 時間戳在高位,自增序列在低位的特征可以保證整個 ID 的趨勢是遞增有序的。 2. 但由于其依賴機器時鐘,如果機器時鐘回撥,可能會導致重復 ID 生成。其在分布式環境下,每臺機器上的時鐘不可能完全同步,有時候會出現不是全局遞增的情況。 SnowFlake 算法生成 id 的結果是一個 64bit 大小的整數,它的結構如下圖: f13ace08-56de-11ee-939d-92fbcf53809c.png

1bit,不用。二進制中最高位為 1 的都是負數,但是我們生成的 id 一般都使用整數,所以這個最高位固定是 0

41bit,用來記錄時間戳(毫秒)。41 位可以表示 2^{41}-1 個數字,如果只用來表示正整數(計算機中正數包含 0),可以表示的數值范圍是 0 至 2^{41}-1,也就是說 41 位可以表示 2^{41}-1 個毫秒的值,轉化成單位年則是 (2^{41} - 1) / (1000*60*60*24*365) = 69 年。

10bit,用來記錄工作機器 id。可以部署在 2^{10} = 1024 個節點,包括 5 位 datacenterId 和 5 位 workerId,5 位(bit)可以表示的最大正整數是 2^{5}-1 = 31,即可以用 0、1、2、3、....、31 這 32 個數字,來表示不同的 datecenterId 或 workerId。

12 位,序列號,用來記錄同毫秒內產生的不同 ID;12bit 可以表示的最大正整數是 2^{12}-1 = 4095 ,即可以用 0、1、2、3、....4094 這 4095 個數字,來表示同一機器同一時間截(毫秒) 內產生的 4095 個 ID 序號。

有序主鍵 or 隨機主鍵 ?

使用 UUID 這些隨機 ID 生成算法作為 MySQL 主鍵的生成方案呢?答案是:不可以! 眾所周知,當 MySQL 數據表使用 InnoDB 作為存儲引擎時,每一個索引都對應一個 B + 樹,若表定義了主鍵(沒有時,MySQL 則會自動生成不可見的自增主鍵),主鍵對應的索引就是聚簇索引,表的所有數據都存儲在聚簇索引上。索引中鍵值的邏輯順序決定了表中相應行的物理順序(索引中的數據物理存放地址和索引的順序是一致的)。可以這么理解:只要是索引是連續的,那么數據在存儲介質上的存儲位置也是連續的。 基于以上特性,由于自增鍵的值是有序的,插入數據時,Innodb 會把每一條記錄都存儲在上一條記錄的后面。當達到頁面的最大填充因子時候 (innodb 默認的最大填充因子是頁大小的 15/16, 會留出 1/16 的空間留作以后的修改),會進行如下操作:下一條記錄就會寫入新的頁中,一旦數據按照這種順序的方式加載,主鍵頁就會近乎于順序的記錄填滿,提升了頁面的最大填充率,不會有頁的浪費;且由于新插入的行一定會在原有的最大數據行下一行,mysql 定位和尋址很快,不會為計算新行的位置而做出額外的消耗。 而 UUID 相對于有序的自增 ID,它的值是毫無規律可言的,新行的主鍵不一定要比之前數據主鍵的值大,所以 innodb 無法做到總是把新行插入到索引的最后,而是需要為新行尋找新的合適的位置從而來分配新的空間。這個過程需要做很多額外的操作,而且最終分布散亂的數據會導致以下問題:

寫入的目標頁很可能已經刷新到磁盤上并且從緩存上移除,或者還沒有被加載到緩存中,innodb 在插入之前不得不先找到并從磁盤讀取目標頁到內存中,這將導致大量的隨機 IO;

因為寫入是亂序的,innodb 不得不頻繁的做頁分裂操作,以便為新的行分配空間,頁分裂導致移動大量的數據,一次插入最少需要修改三個頁以上,且由于頻頁分裂,頁會變得稀疏并被不規則的填充,最終會導致數據會有碎片;

在把值載入到聚簇索引 (innodb 默認的索引類型) 以后,有時候會需要做一次 OPTIMEIZE TABLE 來重建表并優化頁的填充,這將又需要一定的時間消耗。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4629

    瀏覽量

    93193
  • Mac
    Mac
    +關注

    關注

    0

    文章

    1109

    瀏覽量

    51608
  • 分布式系統
    +關注

    關注

    0

    文章

    146

    瀏覽量

    19285
  • UUID
    +關注

    關注

    0

    文章

    22

    瀏覽量

    8153

原文標題:分布式系統的主鍵生成方案對比

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    分布式軟件系統

    。更重要的是,NI LabVIEW 8的分布式智能提供的解決方案不僅令這些挑戰迎刃而解,且易于實施。LabVIEW 8的分布式智能具體包括: 可對分布式
    發表于 07-22 14:53

    使用分布式I/O進行實時部署系統的設計

    的8插槽機箱,與LabVIEW Real-Time的強大功能相結合,為確定性分布式I/O提供了便捷的解決方案。介紹當你需要在實時控制系統中設計分布式I/O時,你將怎么辦?首要問題就是如
    發表于 03-12 17:47

    關于分布式系統的全面介紹

    操作系統-----分布式系統概述
    發表于 07-25 06:59

    如何設計分布式干擾系統

    什么是分布式干擾系統分布式干擾系統是一種綜合化、一體化、小型化、網絡化和智能化系統,是將眾多體積小,重量輕,廉價的小功率偵察干擾機裝置在易
    發表于 08-08 06:57

    分布式系統的優勢是什么?

    當討論分布式系統時,我們面臨許多以下這些形容詞所描述的 同類型: 分布式的、刪絡的、并行的、并發的和分散的。分布式處理是一個相對較新的領域,所以還沒有‘致的定義。與順序計算相比、并行的
    發表于 03-31 09:01

    Qorvo分布式Wi-Fi網格解決方案

    實現互聯世界的創新RF解決方案提供商Qorvo宣布,正使用 802.11ax 產品組合擴大分布式 Wi-Fi 解決方案在住宅中的適用范圍。該產品組合可改善 Wi-Fi 覆蓋范圍,幫助實現更小的器件
    發表于 11-02 07:01

    分布式KVM坐席拼控系統解決方案

    ,形成一個信息共享的云管理平臺。 視通科技經過多年來對技術的深入研究和對用戶使用習慣的積累,推出了AS-ADS 4K分布式KVM坐席拼控解決方案,本系統是一套技術先進、功能完善、性能穩定、安全可靠、操作
    發表于 02-26 15:15

    求一種獨特的DCS分布式系統的測試方案

    本文介紹一種獨特的DCS分布式系統的測試方案,對分布在一個網絡中多臺電腦上的各個系統模塊(每臺電腦運行多個
    發表于 04-26 06:57

    如何對分布式天線系統(DAS)進行優化?

    什么是分布式天線系統?如何對分布式天線系統(DAS)進行優化?
    發表于 05-24 06:03

    分布式系統時鐘解決方案

    )Naive HLC改進HLC本文將首先依次簡單介紹分布式系統下的物理時鐘(Physical Time,也稱PT),邏輯時鐘(Logical Clock,也稱LC),向量時鐘(Vector Clock,也稱VC
    發表于 06-28 10:46

    萌新求助,求一個分布式光伏發電監測系統解決方案

    萌新求助,求一個分布式光伏發電監測系統解決方案
    發表于 10-22 07:59

    如何高效完成HarmonyOS分布式應用測試?

    作者:liuxun,HarmonyOS測試架構師HarmonyOS是新一代的智能終端操作系統,給開發者提供了設備發現、設備連接、跨設備調用等豐富的分布式API。隨著越來越多的開發者投入到
    發表于 12-13 18:07

    【學習打卡】OpenHarmony的分布式任務調度

    、同步、注冊、調用)機制。分布式任務調度程序是能夠跨多個服務器啟動調度作業或工作負載的軟件解決方案,整個過程是不需要人來值守的。舉個例子,我們可以在一臺或多臺機器上安裝分布式調度器,用戶可以通過它在
    發表于 07-18 17:06

    關于分布式系統的幾個問題

    本文摘自:華為云社區 作者:華為加拿大研究院軟件專家 Jet老師 小引 分布式系統是一個古老而寬泛的話題,而近幾年因為 大數據 概念的興起,又煥發出了新的青春與活力。本文將會通過對如下幾個問題展開談
    的頭像 發表于 09-23 16:28 ?3080次閱讀

    為什么需要分布式ID?求一種分布式ID生成方案

    對于單體系統來說,主鍵ID可能會常用主鍵自動的方式進行設置,這種ID生成方法在單體項目是可行的,但是對于分布式
    的頭像 發表于 01-09 10:43 ?1249次閱讀
    主站蜘蛛池模板: 99精品国产免费观看视频 | 俄罗斯兽交XXXXX在线 | 噜妇插内射精品 | 精品国产国产精2020久久日 | 色欲精品国产AV久久久 | 再深点灬舒服灬太大了在线视频 | 囯产精品久久久久久久久蜜桃 | 啊片色播电影 | 999久久久国产 | 亚洲精品无码专区在线播放 | 少妇被躁爽到高潮无码久久 | 成人精品视频在线 | 秋霞伦理电影在2017韩国在线伦 | 免费xxx成年大片 | 欧美三级黄色大片 | 亚洲不卡视频在线观看 | 偷窥欧美wc经典tv | 亚洲AV美女成人网站P站 | 欧美阿v在线天堂 | yellow高清免费观看日本 | 亚洲欧美一区二区三区四区 | 伦理片 qvod 伦理片 a在线线版韩国 | 久久日本精品国产精品 | 九九热最新视频 | 亚洲永久精品ww47 | 亚洲精品天堂在线 | 97无码欧美熟妇人妻蜜 | 亚洲精品一二三 | 英国video性精品高清最新 | 欧美三级在线完整版免费 | 国产露脸150部国语对白 | 久久re热线视频国产 | 樱桃视频高清免费观看在线播放 | 国产精品白浆精子流水合集 | 午夜不卡av免费 | 色尼玛亚洲综合 | 国产免费怕怕免费视频观看 | 亲胸摸下面激烈免费网站 | 极品少妇粉嫩小泬啪啪AV | 香蕉精品国产高清自在自线 | 亚洲AV久久无码精品国产网站 |