掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
星球水友“寫代碼的”提問:

創(chuàng)新互聯(lián)服務(wù)項目包括澄江網(wǎng)站建設(shè)、澄江網(wǎng)站制作、澄江網(wǎng)頁制作以及澄江網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,澄江網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到澄江省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
沈老師,我們現(xiàn)在用戶中心是單庫單表,uid使用數(shù)據(jù)庫自增主鍵,uid被很多業(yè)務(wù)關(guān)聯(lián),不能變化。
現(xiàn)在用戶中心數(shù)據(jù)量逐步變大,有分庫需求了,如何由單庫升級為多庫,保持歷史uid不變,并且新生成的數(shù)據(jù)不沖突,有什么好辦法么?
==問題描述完==
應(yīng)該有不少公司都會利用數(shù)據(jù)庫“插入數(shù)據(jù)自動自增id”來作為業(yè)務(wù)id,這種方法會使得業(yè)務(wù)與id生成強耦合,導致id生成算法難以升級。
今天和大家一起簡單探討下,id生成要考慮哪些要素。畫外音:別誤會,不是說“自增id”不好,是說它與業(yè)務(wù)耦合了,難以升級。
一、id生成要考慮的技術(shù)點
幾乎所有業(yè)務(wù),都會有一個業(yè)務(wù)唯一標識:
這個標識,在存儲系統(tǒng)里通常是主鍵,主鍵使用聚集索引(clustered-index),即在物理存儲上以這個id排序。于是,對這個id有:唯一性,趨勢遞增性的要求。
畫外音:索引《1分鐘了解不同索引的差異》。
這個標識,也經(jīng)常被用來做流量負載均衡,數(shù)據(jù)負載均衡的依據(jù),即這個id必須在統(tǒng)計上必須是完全隨機的。于是,對這個id有:隨機性的要求。
同時,id生成算法升級,理論上對業(yè)務(wù)系統(tǒng)是透明的。于是,對這個id的生成有:獨立性需求。
為了保證id生成的上述特性,要有一個:
- uint64_t GenID()
的獨立方法(或者獨立接口)來生成id,生成id具體做什么用,該方法不關(guān)心,可以是用來做uid,也可以是用來做oid,甚至log-id。
當然,id生成的具體細節(jié),業(yè)務(wù)也不用關(guān)心。即,GenID()的內(nèi)部實現(xiàn),可以是利用數(shù)據(jù)庫的自增id,也可以使用時間遞增,目前行業(yè)內(nèi)最流行的,是仿照snowflake生成分布式id。
這個封裝,屏蔽了id生成的細節(jié),保留方案升級的可能性,是系統(tǒng)設(shè)計中,解耦的體現(xiàn)。 如果使用了此類方法生成業(yè)務(wù)id,數(shù)據(jù)庫由單庫擴展多庫就很容易了:
假如架構(gòu)設(shè)計前期沒有提前考慮獨立的id生成,后期又要實施單庫拆多庫,該怎么辦呢?
二、針對星球水友提到的例子
歷史的坑已經(jīng)鑄成,沒有解耦id生成方法,而且也沒法批量修改id,該怎么辦呢?
假設(shè)由單庫拆分為3庫,可以這么玩:
做一個1主2從數(shù)據(jù)庫集群,相當于每條數(shù)據(jù)復制成了3份;
搞定,拆庫擴容達成:
希望這個取巧的方法對你有幫助。
但更希望,大伙提前考慮id生成的唯一性、隨機性、趨勢遞增性、獨立性。
系統(tǒng)性考慮問題,知其然,知其所以然。
【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流