MySQL分布式ID_分布式唯一ID系列(3)——数据库自增ID机制适合做分布式ID吗
數(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ù)庫里面的實現(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:
那數(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,那是非常影響性能的)
看到這里的同學,覺得好的話就幫忙推薦下吧,Thanks?(・ω・)ノ
總結(jié)
以上是生活随笔為你收集整理的MySQL分布式ID_分布式唯一ID系列(3)——数据库自增ID机制适合做分布式ID吗的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漫步者即将推出皮纹版 M230 蓝牙音箱
- 下一篇: mysql改表字段类型导致数据丢失_故障