日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
用單庫自增鍵來生成id了,后期怎么分庫?哎,這個(gè)坑大!

星球水友“寫代碼的”提問:

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括澄江網(wǎng)站建設(shè)、澄江網(wǎng)站制作、澄江網(wǎng)頁制作以及澄江網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,澄江網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到澄江省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

沈老師,我們現(xiàn)在用戶中心是單庫單表,uid使用數(shù)據(jù)庫自增主鍵,uid被很多業(yè)務(wù)關(guān)聯(lián),不能變化。

現(xiàn)在用戶中心數(shù)據(jù)量逐步變大,有分庫需求了,如何由單庫升級(jí)為多庫,保持歷史uid不變,并且新生成的數(shù)據(jù)不沖突,有什么好辦法么?

==問題描述完==

應(yīng)該有不少公司都會(huì)利用數(shù)據(jù)庫“插入數(shù)據(jù)自動(dòng)自增id”來作為業(yè)務(wù)id,這種方法會(huì)使得業(yè)務(wù)與id生成強(qiáng)耦合,導(dǎo)致id生成算法難以升級(jí)。

今天和大家一起簡單探討下,id生成要考慮哪些要素。畫外音:別誤會(huì),不是說“自增id”不好,是說它與業(yè)務(wù)耦合了,難以升級(jí)。

一、id生成要考慮的技術(shù)點(diǎn)

幾乎所有業(yè)務(wù),都會(huì)有一個(gè)業(yè)務(wù)唯一標(biāo)識(shí):

  • 用戶標(biāo)識(shí):uid(user-id)
  • 消息標(biāo)識(shí):mid(msg-id)
  • 訂單標(biāo)識(shí):oid(order-id)

這個(gè)標(biāo)識(shí),在存儲(chǔ)系統(tǒng)里通常是主鍵,主鍵使用聚集索引(clustered-index),即在物理存儲(chǔ)上以這個(gè)id排序。于是,對(duì)這個(gè)id有:唯一性,趨勢(shì)遞增性的要求。

畫外音:索引《1分鐘了解不同索引的差異》。

這個(gè)標(biāo)識(shí),也經(jīng)常被用來做流量負(fù)載均衡,數(shù)據(jù)負(fù)載均衡的依據(jù),即這個(gè)id必須在統(tǒng)計(jì)上必須是完全隨機(jī)的。于是,對(duì)這個(gè)id有:隨機(jī)性的要求。

同時(shí),id生成算法升級(jí),理論上對(duì)業(yè)務(wù)系統(tǒng)是透明的。于是,對(duì)這個(gè)id的生成有:獨(dú)立性需求。

為了保證id生成的上述特性,要有一個(gè):

 
 
 
 
  1. uint64_t GenID() 

的獨(dú)立方法(或者獨(dú)立接口)來生成id,生成id具體做什么用,該方法不關(guān)心,可以是用來做uid,也可以是用來做oid,甚至log-id。

當(dāng)然,id生成的具體細(xì)節(jié),業(yè)務(wù)也不用關(guān)心。即,GenID()的內(nèi)部實(shí)現(xiàn),可以是利用數(shù)據(jù)庫的自增id,也可以使用時(shí)間遞增,目前行業(yè)內(nèi)最流行的,是仿照snowflake生成分布式id。

這個(gè)封裝,屏蔽了id生成的細(xì)節(jié),保留方案升級(jí)的可能性,是系統(tǒng)設(shè)計(jì)中,解耦的體現(xiàn)。 如果使用了此類方法生成業(yè)務(wù)id,數(shù)據(jù)庫由單庫擴(kuò)展多庫就很容易了:

  • 確定一個(gè)路由算法,例如hash取模;
  • 將單庫中的數(shù)據(jù),通過這個(gè)路由算法遷移到多庫中去,以實(shí)現(xiàn)單庫數(shù)據(jù)量的減少;
  • 通過這個(gè)路由算法尋找數(shù)據(jù)(讀);
  • 通過這個(gè)路由算法插入數(shù)據(jù)(寫);

假如架構(gòu)設(shè)計(jì)前期沒有提前考慮獨(dú)立的id生成,后期又要實(shí)施單庫拆多庫,該怎么辦呢?

二、針對(duì)星球水友提到的例子

歷史的坑已經(jīng)鑄成,沒有解耦id生成方法,而且也沒法批量修改id,該怎么辦呢?

假設(shè)由單庫拆分為3庫,可以這么玩:

做一個(gè)1主2從數(shù)據(jù)庫集群,相當(dāng)于每條數(shù)據(jù)復(fù)制成了3份;

  • 將路由算法,設(shè)為取模hash算法,%3;
  • 第一個(gè)庫,%3=0,把余1和余2的uid刪掉;
  • 第二個(gè)庫,%3=1,把余0和余2的uid刪掉;
  • 第三個(gè)庫,%3=2,把余0和余1的uid刪掉;
  • 將每個(gè)庫的自增步長設(shè)置為3,這樣每個(gè)庫的id生成就不會(huì)重復(fù)了;
  • 升級(jí)用戶中心,按照路由算法查詢uid數(shù)據(jù);

搞定,拆庫擴(kuò)容達(dá)成:

  • 單庫數(shù)據(jù)量下降為了原來的1/3;
  • 讀寫實(shí)例個(gè)數(shù)擴(kuò)充為了原來的3倍;
  • 并且id生成與查詢都不會(huì)沖突;

希望這個(gè)取巧的方法對(duì)你有幫助。

但更希望,大伙提前考慮id生成的唯一性、隨機(jī)性、趨勢(shì)遞增性、獨(dú)立性。

系統(tǒng)性考慮問題,知其然,知其所以然。

【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】


新聞標(biāo)題:用單庫自增鍵來生成id了,后期怎么分庫?哎,這個(gè)坑大!
標(biāo)題路徑:http://www.5511xx.com/article/coogeje.html