摘要:數據庫自增機制原理介紹在分布式里面,數據庫的自增機制的主要原理是數據庫自增和數據庫的函數實現的。
數據庫自增ID機制原理介紹
在分布式里面,數據庫的自增ID機制的主要原理是:數據庫自增ID和mysql數據庫的replace_into()函數實現的。這里的replace數據庫自增ID和mysql數據庫的replace_into()函數實現的。這里的replace into跟insert功能類似,不同點在于:replace into首先嘗試插入數據列表中,如果發現表中已經有此行數據(根據主鍵或唯一索引判斷)則先刪除,再插入。否則直接插入新數據。
單機mysql數據庫的自增id實現如下所示 :首先表結構如下所示
create table t_test( id bigint(20) unsigned not null auto_increment PRIMARY KEY, stub char(1) not null default "", unique key stub (stub) )
然后我們插入的sql語句和查詢的語句如下所示
replace into t_test (stub) values("b"); select last_insert_id();
此時可以看到看到我們剛剛插入的id值是1
以上就是單機版mysql的自增id的實現過程,但是這里講的是分布式id,所以我們要分析一下數據庫的自增ID機制在分布式里面是怎么實現的。
既然是分布式id,那么最少要使用兩個數據庫,這里我們使用3臺來講解,為了保證每一臺數據庫里面的id自增的時候不會重復,那么我們就要給每一臺數據庫設置auto-increment-increment和auto-increment-offset這兩個屬性值(auto-increment-increment表示每一臺數據庫的起始id值,然后auto-increment-offset表示每一臺數據庫每一次的增加數字),設置值如下所示
Server1: auto-increment-increment = 1 auto-increment-offset = 3 Server2: auto-increment-increment = 2 auto-increment-offset = 3 Server2: auto-increment-increment = 3 auto-increment-offset = 3
那么如果我們有n臺數據庫的話,那么上面的auto-increment-increment和auto-increment-offset這兩個屬性值應該怎么設計呢,我們給每一臺數據庫設置初始值分別為1,2,3...N,然后每一臺數據庫自增步長為機器的臺數N,如下圖所示
那數據庫自增ID機制適合作分布式ID嗎?答案是不太適合,為什么呢,我總結了下面兩個原因:
1:系統水平擴展比較困難,比如定義好了步長和機器臺數之后,如果要添加機器該怎么做?假設現在只有一臺機器發號是1,2,3,4,5(步長是1),這個時候需要擴容機器一臺。可以這樣做:把第二臺機器的初始值設置得比第一臺超過很多,比如14(注意這里設置14的前提是:在擴容期間第一臺機器的ID不可能增加到14),同時設置步長為2,那么這臺機器下發的號碼都是14以后的偶數。然后把第一臺機器的ID值保留為奇數,比如7,然后修改第一臺的步長為2。讓它符合我們定義的號段標準。擴容方案看起來復雜嗎?貌似還好,現在想象一下如果我們線上有100臺機器,這個時候要擴容該怎么做?簡直是噩夢。所以系統水平擴展方案復雜難以實現。
2:數據庫壓力還是很大,每次獲取ID都得讀寫一次數據庫,非常影響性能,不符合分布式ID里面的延遲低和要高QPS的規則(在高并發下,如果都去數據庫里面獲取id,那是非常影響性能的)
原文鏈接
其他分布式ID系列快捷鍵:
分布式ID系列(1)——為什么需要分布式ID以及分布式ID的業務需求
分布式ID系列(2)——UUID適合做分布式ID嗎
分布式ID系列(3)——數據庫自增ID機制適合做分布式ID嗎
分布式ID系列(4)——Redis集群實現的分布式ID適合做分布式ID嗎
分布式ID系列(5)——Twitter的雪法算法Snowflake適合做分布式ID嗎
大佬網址
https://www.itqiankun.com/art...
https://blog.csdn.net/hengyun...
https://tech.meituan.com/2017...
https://segmentfault.com/a/11...
https://www.jianshu.com/p/9d7...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76149.html
摘要:同時除了對號碼自身的要求,業務還對號生成系統的可用性要求極高,想象一下,如果生成系統癱瘓,整個美團點評支付優惠券發券騎手派單等關鍵動作都無法執行,這就會帶來一場災難。 分布式id主要用到哪些地方 在復雜分布式系統中,往往需要對大量的數據和消息進行唯一標識。如在美團點評的金融、支付、餐飲、酒店、貓眼電影等產品的系統中,數據日漸增長,對數據分庫分表后需要有一個唯一ID來標識一條數據或消息,...
摘要:用戶指定一個名字空間和一個字符串,通過散列,生成。字符串本身需要是唯一的。。雖然是基于隨機數,但是重復的可能性可以忽略不計,因此該版本也是被經常使用的版本。。當前正在使用的。。 UUID的生成策略: UUID的方式能生成一串唯一隨機32位長度數據,它是無序的一串數據,按照開放軟件基金會(OSF)制定的標準計算,UUID的生成用到了以太網卡地址、納秒級時間、芯片ID碼和許多可能的數字。U...
摘要:原文鏈接其他分布式系列快捷鍵分布式系列為什么需要分布式以及分布式的業務需求分布式系列適合做分布式嗎分布式系列數據庫自增機制適合做分布式嗎分布式系列集群實現的分布式適合做分布式嗎分布式系列的雪法算法適合做分布式嗎大佬網址 今天我們來講一下Redis集群實現的分布式ID的過程,總結一下Redis集群是否適合做分布式ID? 首先是項目地址: https://github.com/maqian...
摘要:結合對做如下調整的毫秒時間戳的數據邏輯分區以及的自增序列。為了解決這個問題,便引入了邏輯分區。參考文章批量插入返回自增的問題美團點評分布式生成系統 這里的博客版本都不會被更新維護。查看最新的版本請移步:http://neojos.com 全稱Universally Unique Identifier,UUID占128bit,也就是16個英文字符的長度(16byte),需要強調的是,它...
閱讀 3527·2021-11-22 11:59
閱讀 944·2021-09-27 13:36
閱讀 3602·2021-09-24 09:47
閱讀 2250·2021-09-01 11:39
閱讀 970·2021-08-31 09:37
閱讀 2303·2021-08-05 10:01
閱讀 1664·2019-08-30 15:55
閱讀 692·2019-08-30 15:54