国产乱子轮XXX农村-精品久久国产字幕高潮-精品国产乱码久久久久久1区2区-国产AV一区二区三区传媒

mysql多條數據存到不同表id唯一分布式系統中的唯一ID生成

發布時間:2025-06-08 點擊:14
我們目前主流的服務端系統都是分布式的架構。業務分布在不同的機器節點上產生數據,數據也存儲在不同的機器節點。為了方便標識數據,我們使用 唯一且有序 的id來標識數據。即:
整個分布式系統中,新生成的id永遠不會產生與之前已經生成的id重復;
生成的所有id可以根據生成的時間進行排序(生成時間晚的排序順序靠后)
我們來看一下市面上的幾種主流的id生成方案。
一、mysql 集群
由于我們的討論前提是分布式架構的系統,所以這里的 mysql 我們默認是集群版。
眾所周知,mysql 有自帶的唯一id機制,即自增主鍵,可以保證在同一個數據庫中,表內生成的每一條記錄都是唯一且有序的。
但是如果放在分布式系統里面,我們用分庫/分表的架構存儲記錄,那就會導致在系統中產生重復的id。
如下圖,表1 2 3都是存儲相同記錄的不同表(可以在同一個數據庫里,也可以在不同數據庫里),表1 2 3都會產生id相同的數據。
為了解決這個問題,mysql 官方支持數據庫 id 生成時設置步長,可以保證不同數據庫中相同表的id唯一性。
如上圖,每個表都有 不同的起始id和相同的步長 ,這就能保證業務記錄id的唯一性。
設置步長的方案雖然解決了id生成的唯一性,但是也有很大的缺點
不能保證id的有序性和時間的強相關。(由于是分布式系統,不能保證id=4的數據一定在id=3的數據后面生成)
每次新增加一個節點,要重置所有節點的起始值和步長。
第二點只是數據庫管理會麻煩一些,但是第一點不能滿足我們對有序性的要求。
二、id數據庫
這里泛指一套單獨維護的id數據庫,目的是為了保證業務系統內所有的id的唯一性和有序性。
舉幾個例子,比如mysql維護一條表記錄,redis 維護一個key,zookeeper 維護一個序列號。當所有業務都通過調用這些存儲服務來生成+獲取唯一id的時候,就可以保證生成id的唯一性和有序性。
缺點:
需要資源單獨維護一個服務
如果id數據庫掛掉,整個業務就會停擺。如果id數據庫出現數據錯亂,可能會影響到唯一性和有序性
總結一下就是,id數據庫可以提供唯一有序的id,但是有一定的維護成本且系統的風險很高。
三、雪花算法
snowflake是twitter公司采用的一種算法,目的是在分布式系統中產生 全局唯一且整體遞增 的id。
3.1 生成id的結構
3.2 生成原理
我們先看一下雪花id的生成過程:
生成毫秒級別的時間戳,填充到 41bit 的位置
序列號默認為 000000000000 。如果 新生成的時間戳上次生成的相等 ,序列號就會 + 1。將序列號填充到 12bit 位置
存儲當前生成的時間戳到內存中,以便下次生成時判斷
獲取到當前機器+進程的唯一標識,填充到 10bit 的位置
通過上述整個流程我們可以看到,雪花算法可以確保唯一性,單機內在同一毫秒生成的id會有序列號的遞增,多機環境在同一毫秒生成的id會有機器+進程的唯一標識。
但是無法保證強有序性,比如多個機器在同一毫秒內生成的id,就無法按照時間規則進行排序
3.3 缺點
雪花算法除了無法實現嚴格按照時間的有序性之外,還有一個可能存在的風險點,就是 單機時鐘回撥 。
如果一個機器之前已經生成過id,將機器的時間改為之前的時間,那么就有一定幾率會生成與之前相同的id。
四、mongodb 的唯一id生成策略
mongo唯一id生成策略——objectid,和雪花算法相似度極高。區別在于雪花算法要占用64個字節,而 objectid 只需要占用 12個字節,但是objectid只能存儲秒級別時間戳。
objectid如果用字符串表示則有24個字符,但實際上它是由一組十六進制的字符構成,每個字節兩位的十六進制數字,總共用了12字節的存儲空間。
比如:6331500a7cac81af7136236b 這個id
秒級時間戳
機器碼
進程的pid
序號
mongodb 的 objectid 和雪花算法一樣,無法實現嚴格按照時間的有序性,并且由于是秒級別的時間戳,所以不同機器生成的id,不按照時間排序的可能性會大很多。而且如果單機時鐘回撥,也會產生與之前重復的id。
總結
特性/方案mysql 集群id數據庫雪花算法mongodb objectid
唯一性 :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
按照生成時間的有序性 :x: :white_check_mark: :x: :x:
維護的難易程度 難 較難 易維護 易維護
在分布式系統中:
以上四種方案都可以保證生成id的唯一性
如果并發量很小的系統,可以考慮 雪花算法/mongodb objectid 方案來保證有序性
如果并發量很大,只能用id數據庫來保證有序性,但是會比 雪花算法/mongodb objectid 方案增加維護成本?


河池網站優化的秘訣就是布局好網站關鍵詞位置
蘇州到惠東物流專線
蘇州到巢湖物流專線
中山到宜陽物流專線
如何提高外鏈的效率
濟南到建湖物流專線
濟南到陽泉物流專線
代理防火墻如何工作?代理服務器防火墻的優缺點