分散式ID系列(3)——資料庫自增ID機制適合做分散式ID嗎

IT乾坤發表於2019-08-07

資料庫自增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
分散式ID系列(3)——資料庫自增ID機制適合做分散式ID嗎
以上就是單機版mysql的自增id的實現過程,但是這裡講的是分散式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系列(3)——資料庫自增ID機制適合做分散式ID嗎

資料庫自增ID是否適合做分散式ID:

那資料庫自增ID機制適合作分散式ID嗎?答案是不太適合,為什麼呢,我總結了下面兩個原因:

1:系統水平擴充套件比較困難,比如定義好了步長和機器臺數之後,如果要新增機器該怎麼做?假設現在只有一臺機器發號是1,2,3,4,5(步長是1),這個時候需要擴容機器一臺。可以這樣做:把第二臺機器的初始值設定得比第一臺超過很多,比如14(主要這裡設定14的前提是:在擴容期間第一臺機器的ID不可能增加到14),同時設定步長為2,那麼這臺機器下發的號碼都是14以後的偶數。然後摘掉第一臺,把ID值保留為奇數,比如7,然後修改第一臺的步長為2。讓它符合我們定義的號段標準。擴容方案看起來複雜嗎?貌似還好,現在想象一下如果我們線上有100臺機器,這個時候要擴容該怎麼做?簡直是噩夢。所以系統水平擴充套件方案複雜難以實現。
2:資料庫壓力還是很大,每次獲取ID都得讀寫一次資料庫,非常影響效能,不符合分散式ID裡面的延遲低和要高QPS的規則(在高併發下,如果都去資料庫裡面獲取id,那是非常影響效能的)

看到這裡的同學,覺得好的話就幫忙推薦下吧,Thanks♪(・ω・)ノ

分散式ID其他系列快捷鍵:
分散式ID系列(1)——為什麼需要分散式ID以及分散式ID的業務需求
分散式ID系列(2)——UUID適合做分散式ID嗎
分散式ID系列(3)——資料庫自增ID機制適合做分散式ID嗎

大佬網址:
https://tech.meituan.com/2017/04/21/mt-leaf.html
https://segmentfault.com/a/1190000011282426
https://www.jianshu.com/p/9d7ebe37215e
https://tech.meituan.com/2017/04/21/mt-leaf.html

相關文章