【转】MySQL分库分表环境下全局ID生成方案
轉(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è)表:
當(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。
最后,在客戶(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)題。
- 上一篇: BZOJ 2038: [2009国家集训
- 下一篇: jQuery获取Select选择的Tex