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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

【转】MySQL分库分表环境下全局ID生成方案

發(fā)布時(shí)間:2025/5/22 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】MySQL分库分表环境下全局ID生成方案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載一篇博客,里面有很多的知識(shí)和思想值得我們?nèi)ニ伎肌?/p>

——————————————————————————————————————————————————————————————————————

在大型互聯(lián)網(wǎng)應(yīng)用中,隨著用戶(hù)數(shù)的增加,為了提高應(yīng)用的性能,我們經(jīng)常需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行分庫(kù)分表操作。在單表時(shí)代,我們可以完全依賴(lài)于數(shù)據(jù)庫(kù)的自增ID來(lái)唯一標(biāo)識(shí)一個(gè)用戶(hù)或數(shù)據(jù)對(duì)象。但是當(dāng)我們對(duì)數(shù)據(jù)庫(kù)進(jìn)行了分庫(kù)分表后,就不能依賴(lài)于每個(gè)表的自增ID來(lái)全局唯一標(biāo)識(shí)這些數(shù)據(jù)了。因此,我們需要提供一個(gè)全局唯一的ID號(hào)生成策略來(lái)支持分庫(kù)分表的環(huán)境。下面來(lái)介紹兩種非常優(yōu)秀的解決方案:

1. 數(shù)據(jù)庫(kù)自增ID——來(lái)自Flicker的解決方案

因?yàn)镸ySQL本身支持auto_increment操作,很自然地,我們會(huì)想到借助這個(gè)特性來(lái)實(shí)現(xiàn)這個(gè)功能。Flicker在解決全局ID生成方案里就采用了MySQL自增長(zhǎng)ID的機(jī)制(auto_increment + replace into + MyISAM)。一個(gè)生成64位ID方案具體就是這樣的:?
先創(chuàng)建單獨(dú)的數(shù)據(jù)庫(kù)(eg:ticket),然后創(chuàng)建一個(gè)表:

CREATE TABLE Tickets64 (id bigint(20) unsigned NOT NULL auto_increment,stub char(1) NOT NULL default '',PRIMARY KEY (id),UNIQUE KEY stub (stub)) ENGINE=MyISAM

當(dāng)我們插入記錄后,執(zhí)行SELECT * from Tickets64,查詢(xún)結(jié)果就是這樣的:

+-------------------+------+ | id | stub | +-------------------+------+ | 72157623227190423 | a | +-------------------+------+

在我們的應(yīng)用端需要做下面這兩個(gè)操作,在一個(gè)事務(wù)會(huì)話(huà)里提交:

REPLACE INTO Tickets64 (stub) VALUES ('a'); SELECT LAST_INSERT_ID();

這樣我們就能拿到不斷增長(zhǎng)且不重復(fù)的ID了。?
到上面為止,我們只是在單臺(tái)數(shù)據(jù)庫(kù)上生成ID,從高可用角度考慮,接下來(lái)就要解決單點(diǎn)故障問(wèn)題:Flicker啟用了兩臺(tái)數(shù)據(jù)庫(kù)服務(wù)器來(lái)生成ID,通過(guò)區(qū)分auto_increment的起始值和步長(zhǎng)來(lái)生成奇偶數(shù)的ID。

TicketServer1: auto-increment-increment = 2 auto-increment-offset = 1TicketServer2: auto-increment-increment = 2 auto-increment-offset = 2

最后,在客戶(hù)端只需要通過(guò)輪詢(xún)方式取ID就可以了。

  • 優(yōu)點(diǎn):充分借助數(shù)據(jù)庫(kù)的自增ID機(jī)制,提供高可靠性,生成的ID有序。
  • 缺點(diǎn):占用兩個(gè)獨(dú)立的MySQL實(shí)例,有些浪費(fèi)資源,成本較高。

參考:http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/

2. 獨(dú)立的應(yīng)用程序——來(lái)自Twitter的解決方案

Twitter在把存儲(chǔ)系統(tǒng)從MySQL遷移到Cassandra的過(guò)程中由于Cassandra沒(méi)有順序ID生成機(jī)制,于是自己開(kāi)發(fā)了一套全局唯一ID生成服務(wù):Snowflake。GitHub地址:https://github.com/twitter/snowflake。根據(jù)twitter的業(yè)務(wù)需求,snowflake系統(tǒng)生成64位的ID。由3部分組成:

41位的時(shí)間序列(精確到毫秒,41位的長(zhǎng)度可以使用69年) 10位的機(jī)器標(biāo)識(shí)(10位的長(zhǎng)度最多支持部署1024個(gè)節(jié)點(diǎn)) 12位的計(jì)數(shù)順序號(hào)(12位的計(jì)數(shù)順序號(hào)支持每個(gè)節(jié)點(diǎn)每毫秒產(chǎn)生4096個(gè)ID序號(hào))

最高位是符號(hào)位,始終為0。

  • 優(yōu)點(diǎn):高性能,低延遲;獨(dú)立的應(yīng)用;按時(shí)間有序。
  • 缺點(diǎn):需要獨(dú)立的開(kāi)發(fā)和部署。

轉(zhuǎn)載于:https://www.cnblogs.com/kaiblog/p/4322012.html

總結(jié)

以上是生活随笔為你收集整理的【转】MySQL分库分表环境下全局ID生成方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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