日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL分布式ID_分布式唯一ID系列(3)——数据库自增ID机制适合做分布式ID吗

發(fā)布時間:2023/12/4 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL分布式ID_分布式唯一ID系列(3)——数据库自增ID机制适合做分布式ID吗 小編覺得挺不錯的,現(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ù)庫里面的實現(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。