国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL分庫分表環(huán)境下全局ID生成方案

2024-07-24 12:34:32
字體:
供稿:網(wǎng)友
  目錄[-]
 
  1. 數(shù)據(jù)庫自增ID——來自Flicker的解決方案
  2. 獨(dú)立的應(yīng)用程序——來自Twitter的解決方案
  在大型互聯(lián)網(wǎng)應(yīng)用中,隨著用戶數(shù)的增加,為了提高應(yīng)用的性能,我們經(jīng)常需要對(duì)數(shù)據(jù)庫進(jìn)行分庫分表操作。在單表時(shí)代,我們可以完全依賴于數(shù)據(jù)庫的自增ID來唯一標(biāo)識(shí)一個(gè)用戶或數(shù)據(jù)對(duì)象。但是當(dāng)我們對(duì)數(shù)據(jù)庫進(jìn)行了分庫分表后,就不能依賴于每個(gè)表的自增ID來全局唯一標(biāo)識(shí)這些數(shù)據(jù)了。因此,我們需要提供一個(gè)全局唯一的ID號(hào)生成策略來支持分庫分表的環(huán)境。下面來介紹兩種非常優(yōu)秀的解決方案:
 
  1. 數(shù)據(jù)庫自增ID——來自Flicker的解決方案
  因?yàn)镸ySQL本身支持auto_increment操作,很自然地,我們會(huì)想到借助這個(gè)特性來實(shí)現(xiàn)這個(gè)功能。Flicker在解決全局ID生成方案里就采用了MySQL自增長(zhǎng)ID的機(jī)制(auto_increment + replace into + MyISAM)。一個(gè)生成64位ID方案具體就是這樣的:
  先創(chuàng)建單獨(dú)的數(shù)據(jù)庫(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,查詢結(jié)果就是這樣的:
 
  +-------------------+------+ | id                | stub |
  +-------------------+------+ | 72157623227190423 |    a |
  +-------------------+------+
  在我們的應(yīng)用端需要做下面這兩個(gè)操作,在一個(gè)事務(wù)會(huì)話里提交:
 
  REPLACE INTO Tickets64 (stub) VALUES ('a'); SELECT LAST_INSERT_ID();
  這樣我們就能拿到不斷增長(zhǎng)且不重復(fù)的ID了。
  到上面為止,我們只是在單臺(tái)數(shù)據(jù)庫上生成ID,從高可用角度考慮,接下來就要解決單點(diǎn)故障問題:Flicker啟用了兩臺(tái)數(shù)據(jù)庫服務(wù)器來生成ID,通過區(qū)分auto_increment的起始值和步長(zhǎng)來生成奇偶數(shù)的ID。
 
  TicketServer1: auto-increment-increment = 2 auto-increment-offset = 1 TicketServer2: auto-increment-increment = 2 auto-increment-offset = 2
  最后,在客戶端只需要通過輪詢方式取ID就可以了。
 
  優(yōu)點(diǎn):充分借助數(shù)據(jù)庫的自增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)用程序——來自Twitter的解決方案
  Twitter在把存儲(chǔ)系統(tǒng)從MySQL遷移到Cassandra的過程中由于Cassandra沒有順序ID生成機(jī)制,于是自己開發(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ú)立的開發(fā)和部署。

(編輯:武林網(wǎng))

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镶黄旗| 南江县| 海口市| 平罗县| 棋牌| 波密县| 衡南县| 九寨沟县| 黄大仙区| 黑河市| 海南省| 万盛区| 赫章县| 保康县| 新密市| 临潭县| 五家渠市| 深圳市| 衡阳县| 界首市| 东方市| 玛曲县| 高青县| 元氏县| 古交市| 五莲县| 镇雄县| 上高县| 巴塘县| 望江县| 衡东县| 盐山县| 威宁| 甘肃省| 廉江市| 高邑县| 读书| 葫芦岛市| 韩城市| 周至县| 托克逊县|