細說分布式ID

針對高并發寫,分布式ID是其業務基礎,本文從一個面試題細細展開。

面試官:

1.對于Mysql的InnoDB引擎下,自增ID和UUID作為主鍵各自有什么優劣,對于一張表的主鍵你建議使用哪種ID?

2.除了UUID是否還了解其他類型的唯一ID?

對于這兩個問題,我們需要深入了解的知識有兩個:

1.mysql的innodb引擎的數據組織結構是什么樣的

2.分布式ID都有幾種各自的優劣是什么

還有這里要關注一點,為什么強調了InnoDB 引擎,還有什么引擎(MyISAM這個后續再說)?


Mysql-InnoDB 引擎

通常InnoDB為mysq的默認引擎,此引擎也是我們最熟識的B+樹作為我們數據的基礎組織結構,B+樹作為一個“矮胖子”,通過4層高度就能組織千萬數據,極大的減少了磁盤IO次數提升了數據訪問效率,這也是它可以作為大多數公司數據持久化基石的原因。


(此圖非原創-侵刪)


對于此B+樹結構,數據庫的數據新增,順序新增還是隨機新增對于它的執行效率有很大影響,如果新增數據是隨機的,那可能增加大量的IO,因為每次新增都可能頁分裂與頁合并,涉及數據挪移,而對于順序新增,每次都會在頁尾進行操作,這大大減小了磁盤IO,因此對于一個業務主鍵,它應該是單調遞增的,這樣可以大大提升數據插入效率。

自增ID和UUID作為主鍵對比

其實這個問題,面試官最主要就是要考察的UUID對于mysql 隨機寫入的影響,當然其他的了解越多越好。

特點對比

自增ID

UUID(v4)

實現方式

數據庫支持

工具包支持

生成速率限制

取決于數據庫的TPS,比較低

無上限

寫入效率*

順序寫入,性能很高

隨機寫入導致數據寫入性能急劇下降

查詢效率

數字查詢效率更高(數字比較)

36位字符(32+4個‘-’)比較效率稍低

存儲空間

BigInt 8字節

Varchar(36) 1字節前綴+36字節=37字節

業務量推測

根據id相減可推測業務量

隨機無法推測

其實可以看出,這兩種方案都會存在一個致命性問題,自增id強依賴數據庫且生成效率低,UUID對于寫入效率又有很大問題。針對上面分析其實我們需要的分布式id 需要具有以下特性:全局唯一、單調遞增、高效生成。很多大家熟悉的方案都是針對上面兩種方案的優化產生,整理目前的解決方案如下:




分布式ID-Snowflake

先說說名字(個人猜測)之所以取雪花這個名字,是威爾遜·奧爾溫·賓利(Wilson Bentley)他通過顯微鏡和顯微攝影技術拍攝了5382張雪花照片,證實了雪花形態的獨特性,因此產生觀點“世界上沒有兩片完全相同的雪花”,美團的leaf名字異曲同工。

直接上圖吧,原始snowflake 和mongo的objectId 原理相似。

而經典的雪花算法和類雪花算法,由于整體ID的組成使用了時間戳,所以都會存在一個重要的bug情況“時鐘回撥”。

時鐘回撥:是指一臺機器的操作系統時鐘,突然跳變到了一個比當前系統記錄的時間更早的時刻。

一旦產生時鐘回撥就可能產生致命的問題,分布式ID不能保證全局唯一,這樣會對業務造成嚴重影響。

產生時鐘回撥的原因:

NTP時間同步:一般毫秒級別回撥,當 NTP 客戶端發現自己的本地時鐘比時間服務器快時,為了逐步糾正這個誤差,它可能會選擇逐步減慢時鐘(斯步進,slewing),但在某些配置或差異過大時,NTP 服務可能會認為時鐘發生了嚴重故障,從而采取直接跳轉(步進,stepping)的方式,將系統時間瞬間調回正確時間。硬件時鐘(RTC)問題:回撥時間很嚴重,這個由CMOS電池供電(想不到吧),如果電池沒電了會重置一個比較早的時間例如1970-01-01,如果這系統重啟了,系統會先讀取RTC時間,再NTP同步時間,在NTP同步之前時鐘都是錯誤的。

虛擬化環境:掛起后恢復,需要同步宿主機時間。

人為誤操作: 看修改情況了,誰腦子抽筋取修改系統時間或時區。

分布式ID-美團Leaf-Snowflake

美團leaf的雪花模式,針對于雪花算法做了兩處優化:

1.workerId 不手動分配使用zookeeper(弱依賴)獲取。

2.解決時鐘回撥問題(所有以雪花模式生成分布式ID都會去解決時鐘回撥)。

workerId 分配原理

對于workerId,當系統節點數過多的時候,很難手動維護,因此選擇啟動時通過zookeeper加載,在加載后會本地持久化一個workerId,當zooKeeper掛了了時則采用本地數據,提升SLA。



如何解決時鐘回撥問題

1.啟動時時間校準

如果啟動時校驗失敗,則此機器啟動失敗,不接入發號集群。

(1)連接zookeeper

(2)判斷是否節點已存在(Ip:port)本機時間>存在節點以前上報的時間

(3)存在則直接返回,不存在則新建

(4)獲取leaf_temporary下所有其他機器ip:port

(5)RPC 請求所有其他機器的時間abs( 本機時間-sum(time)/nodeSize ) < 閾值,如果大于預置則直接失敗

(6)成功后3s定時上報當前機器時間


2.發號過程等待或失敗

做一層自旋等待重試,然后上報報警系統,自動摘除或者人工接收報警處理。


總結:美團leaf的雪花算法通過檢測兩個方面保證生成分布式ID單調遞增,1.在啟動時依賴zookeeper存儲數據校驗,失敗則不允許加入集群,2.在每次發號時比較上次發號時間,小于5ms 則等待10ms再次校驗,失敗則報警或自動摘除。

分布式ID-百度uid-generator

百度主要實現了兩種generator:

DefaultUidGenerator

雪花算法(以秒位單位)+時鐘回撥報異常(沒有自旋等待)

  • sign(1bit)
    固定1bit符號標識,即生成的UID為正數。
  • delta seconds (28 bits)
    當前時間,相對于時間基點"2016-05-20"的增量值,單位:秒,最多可支持約8.7年
  • worker id (22 bits)
    機器id,最多可支持約420w次機器啟動。內置實現為在啟動時由數據庫分配,默認分配策略為用后即棄,后續可提供復用策略。
  • sequence (13 bits)
    每秒下的并發序列,13 bits可支持每秒8192個并發。

CachedUidGenerator

解決時鐘回撥

它不是每次實時獲取當前時間而是只啟動加載一次,之后通過原子自增實現

那如果啟動加載的時間有問題就是老時間呢,它通過每次重啟的自增ID解決

所以此方案通過自增的workerID +原子自增時間戳 解決了時鐘回撥問題

數據填充時機:

通過異步預生成uid環,提升整體tps性能。

初始化預填充:RingBuffer初始化時,預先填充滿整個RingBuffer。

即時填充:Take消費時,即時檢查剩余可用slot量(tail - cursor),如小于設定閾值,則補全空閑slots。閾值可通過paddingFactor來進行配置,請參考Quick Start中CachedUidGenerator配置。

周期填充:通過Schedule線程,定時補全空閑slots。可通過scheduleInterval配置,以應用定時填充功能,并指定Schedule時間間隔。

總結:百度CachedUidGenerator 通過于每次啟動自增workerID和原子自增時間戳解決了時鐘回撥問題;采用離線預生成的方案提升了整體生成的性能。

分布式ID-snowflake小結

主流的基于snowflake的從原理到實現與優化基本介紹完成,簡單做下小結。

方案

依賴

峰值TPS

優化方案

原生snowflake

409.6w

無,存在時鐘回撥問題

美團leaf-snowflake

zookeeper

409.6w

自動化workerID分配,自旋等待時鐘,回撥則報錯

百度uid-generator

mysql

600w+

自動化workerId分配,解決時鐘回撥問題,緩存環提升了生成性能

其實,目前基于雪花方式兩種優化方案基本上可以解決99.99%我們的分布式ID生成了,無論你要業務訂單號,還是業務唯一標識;當然從原理角度,我們還有另一種方案號段模式,

再回顧下這個圖,此文詳細描述了基于UUID的模式下的主流方案及原理,下一篇會講上半部分“自增ID”模式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96290.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96290.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96290.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年大數據專業證書報考指南:專科學歷必看的8大選擇?

對于大專學歷的同學來說&#xff0c;2025年進入大數據行業是一個充滿機遇的選擇。大數據領域發展迅速&#xff0c;各類證書能夠幫助求職者提升專業能力、增強就業競爭力。其中最推薦的是CDA數據分析師&#xff0c;這個證書適應了未來數字化經濟和AI發展趨勢&#xff0c;難度不高…

Python爬蟲實戰:研究Axis Artist模塊,構建電商數據采集和分析系統

1. 引言 1.1 研究背景與意義 在大數據時代,互聯網上蘊藏著海量有價值的信息,這些信息涵蓋了社會、經濟、科技等各個領域。高效地從互聯網獲取數據并進行深度分析,對于企業決策、學術研究、市場分析等都具有重要意義。Python 作為一種功能強大的編程語言,憑借其豐富的庫支…

突破大語言模型推理瓶頸:深度解析依賴關系與優化策略

突破大語言模型推理瓶頸&#xff1a;深度解析依賴關系與優化策略當ChatGPT需要5秒才能生成一個回答&#xff0c;當企業級大模型每秒只能處理3個用戶請求——這些性能瓶頸的背后&#xff0c;隱藏著大語言模型推理計算中復雜的依賴關系網。在大語言模型推理過程中&#xff0c;依賴…

整理了幾道前端面試題

1. 若是有兩個數組ar1和ar2&#xff0c;求它們的并集和交集&#xff0c;要怎么做&#xff1f; const ar1 [1, 2, 3, 4]; const ar2 [3, 4, 5, 6];一、求并集 (Union) 目標&#xff1a; 把兩個數組合并成一個新數組&#xff0c;新數組包含所有出現過的元素&#xff0c;但每個…

Mac M4環境下基于VMware Fusion虛擬機安裝Ubuntu24.04 LTS ARM版

Mac M4環境下基于VMware Fusion虛擬機安裝Ubuntu24.04 LTS ARM版 1 下載Ubuntu鏡像 在Ubuntu官網下載Ubuntu24.04 LTS的arm版鏡像&#xff0c;這里選擇ubuntu-24.04-live-server-arm64.iso&#xff0c;支持arm的似乎沒有合適的desktop版本&#xff0c;Server版本默認是不帶圖…

開源與定制化對比:哪種在線教育系統源碼更適合教育培訓APP開發?

如今&#xff0c;“在線教育系統源碼”已經成為許多教育培訓機構、創業者甚至傳統學校的高頻關鍵詞。無論是打造一款在線教育APP&#xff0c;還是開發企業內部培訓平臺&#xff0c;源碼選擇都決定了后續的開發效率、產品體驗與商業化潛力。 在實際開發中&#xff0c;常見的源碼…

中間件的日志分析

將日志文件access.log復制到kali中進行分析使用命令查看文件中各IP的訪問次數&#xff0c;依次分析其行為awk { print $1 } access.log | sort | uniq -c |sort -nr172.16.3.189cat access.log | grep 172.16.3.198行為模式分析使用固定弱密碼進行身份驗證 幾乎所有請求都使用用…

【Big Data】云原生與AI時代的存儲基石 Apache Ozone 的技術演進路徑

目錄 一、Apache Ozone是什么&#xff1f; 二、Ozone的誕生背景 三、Ozone的架構設計 1. 分層架構設計 2. Ozone Manager (OM) 3. Storage Container Manager (SCM) 4. DataNode 5. Raft協議應用 四、Ozone解決的關鍵問題 1. 元數據管理瓶頸 2. 小文件性能問題 3. …

抖音直播禮物彈幕抓取工具:技術實現與功能解析

基于Python的直播間數據采集技術實踐一、項目概述基于Python開發的直播間數據采集方案&#xff0c;采用最新簽名算法(dysign)實現穩定連接&#xff0c;實時獲取直播間各類互動數據&#xff0c;為直播數據分析和互動應用開發提供技術支持。二、核心功能實時消息監控用戶進入提醒…

添加地址頁面,可以添加復制粘貼,自動識別地址的功能uniapp實現方式

主要用uni.getClipboardData(OBJECT)&#xff0c;更多信息可以到uniapp官網查看以下實現方式 1利用api, 2針對判斷優化方案&#xff0c;在線APIhandleConfirm2(){let that this;promisRequest({url: https://wangzc.wang/smAddress,data: {"address": that.…

ESP32 驅動 PWM 舵機為什么必須共地?——從原理到實踐全解析

在使用 ESP32 控制 PWM 舵機 的過程中,新手經常遇到一個常見問題:舵機不動、亂動、甚至燒壞芯片。 其中最典型的原因,就是沒有正確共地。 很多初學者會疑惑:“外接電池只是給舵機供電,為什么還要把電池的地線接到 ESP32 的 GND 上呢?” 本文將從 信號邏輯、閉合回路、…

細菌基因組genome二代測序數據分析

kraken2去除污染conda create -n kraken2 conda activate kraken2 conda install kraken2 -c bioconda mkdir kraken2_outputkraken2 --db ../../kraken2_db/k2_pluspf_20250402/ --threads 8 --paired 250811_HS67EV0804_R1.fastq.gz 250811_HS67EV0804_R2.fastq.gz --use-nam…

工業網絡架構的未來:智慧化工廠中的低延遲與高可靠性設計

1. 引言工業網絡正經歷從傳統有線到無線、從低速到高速的全面升級。某鋁箔智慧工廠專注于新能源鋁箔的生產&#xff0c;依賴低延遲、高可靠的網絡支持實現生產控制與智能管理。本文將探討某鋁箔智慧工廠網絡架構設計的關鍵點及其實施策略。2. 某鋁箔智慧工廠的網絡挑戰多終端接…

Android14 init.rc中on boot階段操作4

Android14 init.rc中on early-init, init, late-init, early-fs, post-fs階段詳解1 Android14 init.rc的on late-fs, post-fs-data階段主要操作詳解2 Android14 init.rc中啟動Zygote詳解3 Android14 init.rc中on boot階段操作4 1 on boot和低內存設備的啟動優化 僅在ro.con…

CodeSandbox Desktop:零配置項目啟動工具,實現項目環境隔離與Github無縫同步

你有沒有過為了跑一個簡單的 Demo&#xff0c;花半小時配置環境還失敗的經歷&#xff1f;比如想測試一個 Vue3 組件&#xff0c;先裝 Node.js&#xff0c;結果版本太高和項目依賴不兼容&#xff1b;換低版本又提示 “找不到 python 環境”&#xff1b;好不容易裝完依賴&#xf…

人工智能-python-深度學習-經典神經網絡AlexNet

AlexNet&#xff08;詳解&#xff09;——從原理到 PyTorch 實現&#xff08;含訓練示例&#xff09; 文章目錄AlexNet&#xff08;詳解&#xff09;——從原理到 PyTorch 實現&#xff08;含訓練示例&#xff09;1. 發展歷史與比賽成績2. AlexNet 的核心思想&#xff08;一句話…

《sklearn機器學習——指標和評分1》

3個不同的API可供評估模型預測質量&#xff1a; 評估器評分方法&#xff1a;評估器有一個score方法&#xff0c;它給計劃解決的問題提供一個初始評估標準。這部分內容不在這里討論&#xff0c;但會出現在每一個評估器的文件中。 評分參數&#xff1a;使用交叉驗證&#xff08;…

人工智能中的線性代數總結--簡單篇

numpy庫中的dot函數來計算矩陣和向量的點積def matrix_vector_dot_product(a, b):import numpy as npif (len(a[0]) ! len(b)):return -1# 使用tolist()將結果轉換為列表return np.dot(a, b).tolist()原始方法def matrix_vector_dot_product(matrix, vector):if len(matrix[0])…

又是全網首創/純Qt實現28181設備模擬器/rtp視頻點播/桌面轉28181/任意文件轉28181/跨平臺

一、前言說明 這個工具前前后后也算是廢了不少功夫&#xff0c;最開始是因為28181服務端的組件已經完美實現&#xff0c;對照國標文檔看了很多遍&#xff0c;逐個實現需要的交互協議&#xff0c;整體上比onvif協議要難不少&#xff0c;主要是涉及到的東西比較多&#xff0c;有…

安卓逆向(一)Ubuntu環境配置

一、Ubuntu 1、虛擬機 首先準備一個Ubuntu的虛擬機&#xff0c;就隨便新建一個就行&#xff0c;我這里使用的是Ubuntu21.04&#xff0c;但是內存跟硬盤大小最好設置的稍微大一點。 2、基礎環境 &#xff08;1&#xff09;解決apt-get update報錯問題 apt-get是Linux系統中一個管…