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