自從我接手公司的時(shí)候,公司的數(shù)據(jù)庫(kù)基本就是單點(diǎn)裆熙,為了省錢端礼,一律低配,那個(gè)時(shí)候的數(shù)據(jù)庫(kù)和現(xiàn)在用的一樣入录,對(duì)于業(yè)務(wù)庫(kù)蛤奥,我們還是用的阿里云的RDS(MYSQL)。
我記得當(dāng)時(shí)線上就一個(gè)core庫(kù)僚稿,core庫(kù)就是存放一切業(yè)務(wù)數(shù)據(jù)凡桥,做了讀寫分離。
當(dāng)時(shí)為什么這么做呢蚀同,簡(jiǎn)單來說就是方便快捷缅刽,因?yàn)闃I(yè)務(wù)簡(jiǎn)單,最多的一張表的數(shù)據(jù)當(dāng)時(shí)也就100多萬(wàn)吧就是當(dāng)時(shí)的報(bào)名單的一個(gè)子表蠢络,那時(shí)候還做了個(gè)事兒衰猛,報(bào)名單有個(gè)查詢,就算加了索引速度也提不起來刹孔,當(dāng)時(shí)這個(gè)表的寬度巨寬啡省,各種字符集都在這張表里;查詢一次基本要在1S以上,當(dāng)時(shí)的解決方案就是把這個(gè)表的引擎改成myisam了卦睹,查詢立馬降低在120ms的樣子畦戒。
后來,隨著業(yè)務(wù)的發(fā)展结序,業(yè)務(wù)拆的越來越細(xì)障斋,流量也越來越大,core庫(kù)已經(jīng)不堪重負(fù)了徐鹤,于是垃环,開始拆分?jǐn)?shù)據(jù)庫(kù),同時(shí)把服務(wù)化也做了進(jìn)一步的拆分凳干,工程也獨(dú)立出來了(之前所有的項(xiàng)目都在一個(gè)project下晴裹,打個(gè)包這個(gè)酸爽)被济,這樣也做到了各個(gè)數(shù)據(jù)庫(kù)的隔離救赐,但帶來的問題是,很多級(jí)聯(lián)查詢查不到了只磷,運(yùn)營(yíng)的很多數(shù)據(jù)統(tǒng)計(jì)都做不了经磅,怎么辦嘞?
我們把core庫(kù)的核心業(yè)務(wù)獨(dú)立出來钮追,分離出商戶预厌、用戶、兼職元媚、報(bào)名單轧叽,并且把dubbo的服務(wù)化體系一個(gè)個(gè)和這幾個(gè)庫(kù)對(duì)齊,做到一個(gè)工程對(duì)應(yīng)一個(gè)DB刊棕,而core庫(kù)則是歷史老坑遺留地炭晒,沒有人敢碰,一碰就沾包甥角。
但因?yàn)槌杀镜膯栴}网严,2017年的時(shí)候,我們還是一分分錢的省下來過日子的嗤无,非常節(jié)儉震束;除了core庫(kù)之外,其他的RDS都是單點(diǎn)的当犯,并非高可用垢村,也不支持讀寫分離;可能這時(shí)候有些人說嚎卫,你這么做太危險(xiǎn)了嘉栓,這玩意數(shù)據(jù)庫(kù)跪了的話,這段時(shí)間業(yè)務(wù)就受很大影響了。實(shí)際上這事兒還真發(fā)生了胸懈,我記得當(dāng)時(shí)我們有一個(gè)庫(kù)担扑,整整掛了有5分鐘,5分鐘后才恢復(fù)的趣钱;但5分鐘對(duì)于當(dāng)年的公司來說涌献,影響還沒有到承受不了的程度,因此首有,單點(diǎn)數(shù)據(jù)庫(kù)在很長(zhǎng)時(shí)間內(nèi)燕垃,都是支撐業(yè)務(wù)的主要戰(zhàn)力。
隨著公司的發(fā)展井联,產(chǎn)品運(yùn)營(yíng)越來越多卜壕,運(yùn)營(yíng)后臺(tái)的需求與數(shù)據(jù)需求與日俱增,于是我們?yōu)樗麄儗iT重構(gòu)了一個(gè)運(yùn)營(yíng)后臺(tái)(簡(jiǎn)稱YY后臺(tái))烙常;那數(shù)據(jù)需求是怎么解決的呢轴捎,很簡(jiǎn)單,讓運(yùn)營(yíng)們直接去生產(chǎn)庫(kù)上去查蚕脏,當(dāng)然用戶敏感信息我們還是保密的侦副;但如果讓運(yùn)營(yíng)去線上去查,如果胡亂執(zhí)行sql驼鞭,那不是要對(duì)線上庫(kù)產(chǎn)生較大的影響了嗎秦驯?于是我們有了以下的改進(jìn)
我們通過dts將每個(gè)庫(kù)合成一個(gè)大庫(kù)third庫(kù),他自身也是個(gè)rds挣棕,負(fù)責(zé)和所有的業(yè)務(wù)庫(kù)做線上同步译隘,這個(gè)庫(kù)本身就相當(dāng)于我們的一個(gè)線上的備庫(kù),對(duì)他進(jìn)行查詢操作洛心,不會(huì)對(duì)線上造成影響固耘。
隨著公司的進(jìn)一步發(fā)展,數(shù)據(jù)量越來越大皂甘,并且也出現(xiàn)了埋點(diǎn)的數(shù)據(jù)玻驻,因此,我們建立了另一條埋點(diǎn)鏈路偿枕,這套鏈路最終會(huì)進(jìn)入離線計(jì)算maxcompute璧瞬;另外,業(yè)務(wù)數(shù)據(jù)也要進(jìn)入maxcompute里渐夸。
上圖的業(yè)務(wù)我們大概跑了有一整年嗤锉,在這一整年了,出現(xiàn)了一個(gè)問題墓塌,也就是出現(xiàn)在業(yè)務(wù)庫(kù)向third庫(kù)通過DTS這個(gè)環(huán)節(jié)的問題瘟忱;當(dāng)我們業(yè)務(wù)庫(kù)出現(xiàn)了表級(jí)的操作奥额,比如alter語(yǔ)句的時(shí)候,會(huì)觸發(fā)大量的binlog產(chǎn)生访诱,dts收到大量binlog后垫挨,會(huì)向third進(jìn)行同步;而third庫(kù)因?yàn)橐瑫r(shí)接收所有端的數(shù)據(jù)触菜,他的寫入能力遭遇瓶頸九榔,因此會(huì)阻塞在DTS上,導(dǎo)致third庫(kù)嚴(yán)重延時(shí)涡相,maxcompute也出現(xiàn)嚴(yán)重超時(shí)哲泊。我曾經(jīng)為了解決這個(gè)問題,去尋找高性能寫的數(shù)據(jù)庫(kù)的時(shí)候催蝗,會(huì)發(fā)現(xiàn)市面上大多數(shù)據(jù)庫(kù)都不滿足我這個(gè)場(chǎng)景及切威,高性能的rmdb,又要支持海量數(shù)據(jù)丙号;目前我所知道的基本就是oceanbase和tidb這兩者先朦。tidb不考慮,坑太多槽袄,oceanbase目前在公測(cè)烙无,不支持內(nèi)網(wǎng)锋谐,也不考慮遍尺;那后來采取的策略是,讓運(yùn)營(yíng)遷移到maxcompute上去查詢涮拗,雖然時(shí)效性不好乾戏,但也是一個(gè)長(zhǎng)期的方案,總不能讓運(yùn)營(yíng)一直去在線上數(shù)據(jù)庫(kù)是隨便玩耍呀三热,于是這個(gè)方案就變成這樣了鼓择,此時(shí)mysql的各個(gè)實(shí)例已經(jīng)進(jìn)化到了高可用,支持讀寫分離就漾。
我們通過maxcompute來直接從只讀庫(kù)拉取數(shù)據(jù)呐能,主要是依賴于maxcompute的高性能寫,并且只讀庫(kù)在同步binlog下抑堡,比dts的性能要高出一個(gè)數(shù)量級(jí)摆出,具體為什么可以去看一下dts的實(shí)現(xiàn);另外首妖,這個(gè)只讀庫(kù)一定不要做讀寫分離偎漫,因?yàn)樵趍axcompute去拉取數(shù)據(jù)庫(kù)的時(shí)候,這個(gè)時(shí)候mysql的iops可能是很高的有缆,如果這個(gè)時(shí)候有線上的請(qǐng)求過來象踊,是會(huì)造成請(qǐng)求阻塞延時(shí)的温亲,因此,只讀庫(kù)一定不能作為讀寫分離的實(shí)例杯矩。
到這里為止栈虚,和我們目前的架構(gòu)就基本一樣了,可能這里面缺少ES史隆、Redis等一些存儲(chǔ)节芥,這些主要是為業(yè)務(wù)服務(wù)的,我這里主要是側(cè)重講關(guān)于數(shù)據(jù)的持久化方案的演進(jìn)逆害。
——————————華麗的分割線————————————
那么我開始講一下我們后面要做的事情头镊,隨著數(shù)據(jù)量越來越大,公司對(duì)數(shù)據(jù)的實(shí)時(shí)性越來越高魄幕,maxcompute的離線處理相艇,已經(jīng)不能滿足我們的需求;線上很多業(yè)務(wù)要做流式處理纯陨,實(shí)時(shí)推薦坛芽;比如,一個(gè)用戶瀏覽了某些兼職翼抠,但沒有點(diǎn)擊報(bào)名咙轩,這說明這個(gè)用戶對(duì)這類兼職是不感興趣的,同時(shí)我們要把用戶行為實(shí)時(shí)發(fā)送到流式處理里阴颖,給用戶推送其他的類目活喊。我們采用行業(yè)標(biāo)桿FLINK做流式處理,用redis保存一些數(shù)據(jù)統(tǒng)計(jì)結(jié)果集量愧;我們也會(huì)有一些數(shù)據(jù)UI界面的產(chǎn)品钾菊,通過訪問redis來拿到實(shí)施的結(jié)果,比如偎肃,每天的日活煞烫、收入、使用時(shí)長(zhǎng)等累颂。
網(wǎng)關(guān)的加入滞详,我們會(huì)把記錄訪問的所有鏈路日志,通過網(wǎng)關(guān)做鑒權(quán)紊馏、限流料饥、輸出日志、黑白名單校驗(yàn)瘦棋、灰度等功能稀火,那在這張圖中,網(wǎng)關(guān)主要是把訪問的所有日志赌朋,上傳到KAFKA中凰狞,再轉(zhuǎn)交到FLINK中篇裁,通過FLINK來做用戶的數(shù)據(jù)做清洗,再將結(jié)構(gòu)化數(shù)據(jù)導(dǎo)入到安全中心赡若。而安全中心要做的就是所有的風(fēng)控判斷达布,最后把數(shù)據(jù)沉淀到maxcompute里做機(jī)器學(xué)習(xí),不斷優(yōu)化風(fēng)控規(guī)則逾冬。