分表分庫方案實現

前言:之所以要研究分表分庫這個技術點器联,是因為在開發(fā)的過程中蕉世,因為分表分庫踩了個小坑,雖然坑不算大狭姨,但是還是調試了很久宰啦。就是我在做推薦文章進入好友動態(tài)需求的時候,這個文章本身是一種type=51存儲在數據庫中饼拍,對應地轉發(fā)這篇文章的feed的type也是51赡模,只不過src_fid字段需要存儲源文章的feed_id。


image.png

而推薦文章這個需求需要給feed表新增一種類型type=56师抄,對應地在feed的分庫新增一種類型type=302漓柑。后面就發(fā)現遇到坑了,因為我把分庫的類型放到interaction_types中


image.png
,然后sync_feed_db.insert_data新增一種類型的時候
渲染的時候就查不到源文章欺缘,導致讀取數據庫失敗栋豫。然后調試了很久,發(fā)現在讀取源文章的時候讀取不到谚殊,然后這條數據讀取就失敗了
image.png

image.png

在往上找,發(fā)現是這里讀取失敗了蛤铜,這里是feed封裝的方法嫩絮,怎么會讀取不到呢,于是我就進去看了看里面的代碼

        if (table == conf.TBNAME_FEEDS and id_field in ('id', 'src_fid')) or \
                (table != conf.TBNAME_FEEDS and id_field == 'fid'):
            for global_fid in ids:
                if is_explore_fid(global_fid):
                    explore_fids.append(self.convert_global_fid_to_fid(global_fid))

                elif is_interaction_fid(global_fid):
                    interaction_fids.append(self.convert_global_fid_to_fid(global_fid))
                elif is_generalcard_fid(global_fid):
                    generalcard_fids.append(self.convert_global_fid_to_fid(global_fid))
image.png

因為源文章的類型是e_id围肥,所以在查詢出來某一條feed之后剿干,會給src_fid自動拼裝上前綴,如果一條feed是e_開頭穆刻,會給他的src_fid拼上e_置尔,但是由于前面把分庫的類型寫成i_類型,所以去expolore庫查詢就會查不到氢伟。還有一個坑就是explore類型的type不能大于300榜轿,大于300就會insert失敗,這里也還沒找到根因朵锣。
從這個bug中我就產生了很多疑問谬盐,為什么文章的src_fid需要放到一個庫上呢?以及為什么要在代碼中加上這種前綴呢诚些?feed為什么要做分表分庫飞傀,它是怎么做的呢?數據如何同步的诬烹?

一砸烦、分表分庫的原理

當然第一步我們需要先了解一下分表分庫的基本概念,分表分庫上解決寫請求越來越多的問題绞吁,以及數據量暴增的問題幢痘,因為對于讀請求頻繁的場景,可以加緩存或者用一主多從來解決掀泳,但是如果寫請求過于頻繁雪隧,那么壓力都會集中在master上,master上面的IO员舵,網絡脑沿,連接池都會成為一種瓶頸÷砥В或者如果單表一直膨脹庄拇,那么對于磁盤來說壓力山大,而且很容易帶來慢查詢。所以需要分表分庫來解決這個問題措近。

分表的方式

  1. 垂直拆分
    垂直拆分分為兩種溶弟,垂直分庫和垂直分表。如果單庫寫請求多瞭郑,并且分散在多張表的情況辜御,這種情況可以把庫里面的表分散到多個庫中,每個庫放在不同機器上屈张,不然還是會遇到機器的瓶頸問題擒权。如果壓力集中到一張表,那么可以大表拆小表阁谆,把不常用較長的字段遷移到擴展表碳抄,避免跨表查詢的壓力
  2. 水平拆分
    水平拆分是將單表的數據水平拆分到不同服務器上,可以是按照Hash场绿、地理位置剖效、或者用戶id進行分表。水平拆分的難度比垂直拆分更大一些焰盗。
    分表分庫需要解決的問題
  3. 事務支持
    在單庫或者單表中璧尸,可以用MySQL的事務解決一致性問題,但是分表分庫的話姨谷,就需要解決分布式事務的問題了逗宁。
  4. order by ,group by,join
    分表分庫之后order by 和group by要怎么實現梦湘?以及跨庫的join問題
    相關產品


    image.png

二瞎颗、實名分表分庫

為什么實名要做分表分庫

  1. feed庫硬盤將滿,單表過大捌议,性能下降哼拔。
  2. 慢sql難以優(yōu)化

遇到的問題怎么解決的?

  1. 如何拆分
    備選方案有幾種瓣颅,其中一種按照fid做hash倦逐,然后查詢的時候并行地讀取集群,跟業(yè)務無關宫补。優(yōu)點是邏輯簡單檬姥,易于擴展,缺點是存在無fid的表粉怕,而且有fid和無fid的跨庫join難以實現健民。還有一種是按照type來拆分,按照業(yè)務的type分在不同的庫贫贝,互動類型等等秉犹,優(yōu)點是業(yè)務邏輯清晰蛉谜,易于拆分,缺點是跨業(yè)務的查詢需要查詢多個集群崇堵。最終是選擇了按照type來拆分型诚,對于同一種業(yè)務來說,很少會跨集群鸳劳,這里也解釋了為什么src_fid和fid的前綴要一致狰贯,這是因為要避免跨集群訪問。
  2. 如何數據同步
    數據雙寫->老庫數據遷移到新庫->下掉老庫的寫入邏輯
  3. join棍辕,order by 暮现,group by怎么做

代碼實現細節(jié)

  1. 將存在badge的互動消息以及渲染的數據遷移到Redis,減輕數據庫壓力楚昭,能夠給分表分庫,提供一些時間拍顷。
  2. view層新增一個fid到gfid的轉換抚太,保證在后端的代碼,都是帶前綴(e表示探索類型昔案,i表示互動類型)的gfid尿贫,這樣能夠區(qū)分是在哪個集群。
  3. 新增一個feed_manager踏揣,提供分表分庫后的數據讀寫方法
  4. 將對新老數據庫進行數據雙寫封裝成api庆亡,方便調用,保持數據一致捞稿。
    三又谋、mycat的一些實現
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娱局,隨后出現的幾起案子彰亥,更是在濱河造成了極大的恐慌,老刑警劉巖衰齐,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件任斋,死亡現場離奇詭異,居然都是意外死亡耻涛,警方通過查閱死者的電腦和手機废酷,發(fā)現死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抹缕,“玉大人澈蟆,你說我怎么就攤上這事∏干ぃ” “怎么了丰介?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我哮幢,道長带膀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任橙垢,我火速辦了婚禮垛叨,結果婚禮上,老公的妹妹穿的比我還像新娘柜某。我一直安慰自己嗽元,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布喂击。 她就那樣靜靜地躺著剂癌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翰绊。 梳的紋絲不亂的頭發(fā)上佩谷,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音监嗜,去河邊找鬼谐檀。 笑死,一個胖子當著我的面吹牛裁奇,可吹牛的內容都是我干的桐猬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刽肠,長吁一口氣:“原來是場噩夢啊……” “哼溃肪!你這毒婦竟也來了?” 一聲冷哼從身側響起五垮,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤乍惊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后放仗,有當地人在樹林里發(fā)現了一具尸體润绎,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年诞挨,在試婚紗的時候發(fā)現自己被綠了莉撇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡惶傻,死狀恐怖棍郎,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情银室,我是刑警寧澤涂佃,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布励翼,位于F島的核電站,受9級特大地震影響辜荠,放射性物質發(fā)生泄漏汽抚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一伯病、第九天 我趴在偏房一處隱蔽的房頂上張望造烁。 院中可真熱鬧,春花似錦午笛、人聲如沸惭蟋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽告组。三九已至,卻和暖如春癌佩,著一層夾襖步出監(jiān)牢的瞬間惹谐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工驼卖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸿秆。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓酌畜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卿叽。 傳聞我的和親對象是個殘疾皇子桥胞,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容