數(shù)據(jù)庫編程大賽:一條SQL計(jì)算撲克牌24點(diǎn)
近期,GitHub全面升級到了MySQL 8.0。ITPUB特別邀請了NineData創(chuàng)始人、資深技術(shù)專家葉正盛老師,為大家解析GitHub歷年數(shù)據(jù)庫架構(gòu)的發(fā)展歷程,以及大型網(wǎng)站何時(shí)進(jìn)行分庫分表的改造。
Hello,各位朋友!今天,我們一起來回顧GitHub,這個(gè)被程序員親切地戲稱為“全球最大的男性交友網(wǎng)站”的平臺,在過去十五年的數(shù)據(jù)庫架構(gòu)演進(jìn)歷程。
GitHub自2008年上線以來,已經(jīng)演變成全球最大的開源軟件托管平臺。在這里,約有1億名程序員在這里貢獻(xiàn)代碼、交流思想。這背后,GitHub根據(jù)業(yè)務(wù)發(fā)展需求完成了數(shù)據(jù)庫架構(gòu)的多次升級,讓我們一探究竟。尤其是大家比較關(guān)注的大型網(wǎng)站何時(shí)做分庫分表的改造。
2008年:單機(jī)的簡約之始
最初,GitHub非常簡單,僅僅使用了一個(gè)單機(jī)的MySQL 5.0數(shù)據(jù)庫。應(yīng)用開發(fā)語言是Ruby on Rails,這個(gè)也是當(dāng)時(shí)非常流行的開發(fā)語言和框架。
2009年:邁向主備架構(gòu)
單機(jī)的數(shù)據(jù)庫肯定是不合格的,可靠性風(fēng)險(xiǎn)太高,到了2009年,隨著業(yè)務(wù)發(fā)展,GitHub邁向MySQL的主備架構(gòu),并采用了基于數(shù)據(jù)塊同步的DRBD軟件來執(zhí)行主備復(fù)制,硬件上則是兩臺配備了8核32G內(nèi)存和15,000轉(zhuǎn)的SAS機(jī)械硬盤的服務(wù)器。
2013年:性能提升與IDC搬遷
2011到2012年,GitHub將MySQL升級至5.1。
2013年,為了進(jìn)一步增強(qiáng)數(shù)據(jù)庫性能,GitHub執(zhí)行了一次IDC搬遷,數(shù)據(jù)庫硬件也得到了顯著升級,尤其是采用了SSD固態(tài)硬盤和萬兆網(wǎng)卡,這使得性能提升了一倍以上。期間,GitHub還進(jìn)行了一次在線遷移,并宣布整個(gè)停機(jī)時(shí)間僅為13分鐘,顯示出了其在數(shù)據(jù)庫管理上的高效能力。
細(xì)節(jié)上,GitHub通過進(jìn)行大量歷史數(shù)據(jù)清理,不僅節(jié)省了空間,并且提升了緩存的命中率。
這次升級后,GitHub的網(wǎng)頁加載時(shí)間加快了一倍以上。
2015-2016年:MySQL5.6/5.7
到了2015年初,GitHub進(jìn)一步邁向MySQL 5.6,并在2016年升級至5.7。由于5.6到5.7都屬于小版本升級,所以操作過程比較簡單。根據(jù)業(yè)務(wù)拆分了很多集群,中間使用了ProxySQL代理服務(wù),整體都是讀寫分離的技術(shù)架構(gòu)。
發(fā)布GHOST,創(chuàng)新地解決MySQLDDL鎖表難題
MySQL表結(jié)構(gòu)的變更往往會(huì)帶來鎖表問題。之前,通常使用Trigger(觸發(fā)器)方案來解決。當(dāng)時(shí)我在阿里巴巴集團(tuán)工作時(shí),對這個(gè)問題也非常關(guān)注,我們內(nèi)部開發(fā)了一個(gè)名為MyDDL的軟件。雖然我們考慮過通過解析binlog來減少服務(wù)器的影響,但由于技術(shù)難度,這個(gè)想法并未去實(shí)踐。
2016年,GitHub推出了基于解析Binlog的GHOST(GitHub Online Schema Transformer)工具,實(shí)現(xiàn)了在線DDL的功能。這一解決方案現(xiàn)在在業(yè)界頗受歡迎,并且已經(jīng)開源到了社區(qū)。
重磅:分庫分表架構(gòu)升級
到了2019年,根據(jù)GitHub的公開數(shù)據(jù),數(shù)據(jù)庫每秒有95萬次請求,其中主庫請求5萬次/秒,從庫達(dá)到90萬次/秒,這是一個(gè)典型的“讀多寫少”的負(fù)載。隨著業(yè)務(wù)不斷增長,單純的主備架構(gòu)已無法滿足需求。GitHub開始做分庫分表的數(shù)據(jù)庫架構(gòu)升級,GitHub選擇了海外流行的Vitess,一款YouTube內(nèi)部使用并后來開源到社區(qū)的分庫分表中間件,相當(dāng)于分布式的數(shù)據(jù)庫方案,為業(yè)務(wù)的持續(xù)快速發(fā)展提供了強(qiáng)有力的支持。
2020年,GitHub進(jìn)一步升級了他們的緩存解決方案,將Redis緩存替換為分布式版本,并完全替換了原有的Memcached。
重大的跨版本升級:MySQL5.7至8.0
進(jìn)入2023年,GitHub將MySQL的5.7版本全面升級至8.0版本。這次大版本跨越,非常復(fù)雜,官方博客中有非常詳細(xì)的介紹。他們不僅要做到在線升級,還要制定相應(yīng)的回滾方案,并設(shè)置了MySQL5.7到8.0,以及8.0回退到5.7的復(fù)制鏈路,以確保萬無一失。
GitHub這套方案非常復(fù)雜,主要是為了確保能夠?qū)崿F(xiàn)在線升級,如果升級失敗,還可以回滾到老MySQL5.7,官方透露中間也踩了很多坑,這個(gè)需要非常資深的DBA團(tuán)隊(duì)才能完成。
我本人在數(shù)據(jù)遷移這個(gè)領(lǐng)域工作了很多年,開發(fā)了NineData產(chǎn)品,可以幫助客戶做在線的數(shù)據(jù)復(fù)制、數(shù)據(jù)庫遷移升級、ETL等能力,NineData做在線數(shù)據(jù)遷移的原理是通過解析Log實(shí)現(xiàn),同時(shí)支持雙向復(fù)制,這樣可以做到如果升級失敗,還能一鍵完成數(shù)據(jù)回滾。
現(xiàn)如今,GitHub的總數(shù)據(jù)量約為300TB,使用了1200臺數(shù)據(jù)庫服務(wù)器,包括IDC主機(jī)和Azure云主機(jī),反映了其云上和云下混合云架構(gòu)的特點(diǎn)。
啟發(fā)與總結(jié)
GitHub的數(shù)據(jù)庫演進(jìn)歷程給我們豐富的啟發(fā):在業(yè)務(wù)初期,數(shù)據(jù)庫架構(gòu)盡量保持簡潔,MySQL+Redis的數(shù)據(jù)庫加緩存結(jié)構(gòu)能夠支撐到100萬QPS左右,期間可以使用緩存、數(shù)據(jù)庫讀寫分離、歷史數(shù)據(jù)歸檔、業(yè)務(wù)垂直拆分、硬件升級等方案讓數(shù)據(jù)庫架構(gòu)盡量保持簡單。在按業(yè)務(wù)垂直拆分后,當(dāng)超過了單機(jī)負(fù)載,就需要采取分庫分表解決方案,這個(gè)升級會(huì)比較復(fù)雜,需要做好充分的業(yè)務(wù)改造預(yù)估以及SQL邏輯和性能的測試。GitHub選擇的Vitess的分庫分表中間件,國內(nèi)也有很多解決方案,如PolarDB-X、TDSQL、SharedingSphere、TiDB和OceanBase等等,都是相對成熟的選擇。
GitHub的發(fā)展歷程不僅是互聯(lián)網(wǎng)數(shù)據(jù)庫技術(shù)演進(jìn)的縮影,也是對那些面臨數(shù)據(jù)庫擴(kuò)容、分庫分表等挑戰(zhàn)的公司的一個(gè)借鑒。希望這里的分享能給您帶來些許啟示。如果您覺得有所幫助,請不吝分享給您的同事和朋友。
作者介紹
葉正盛
玖章算術(shù)CEO,NineData創(chuàng)始人文章來源:http://www.zghlxwxcb.cn/news/detail-773249.html
資深數(shù)據(jù)庫專家,原阿里云數(shù)據(jù)庫產(chǎn)品管理與解決方案部負(fù)責(zé)人,阿里巴巴去 IOE、異地多活、云計(jì)算多次技術(shù)變革核心成員,帶領(lǐng)團(tuán)隊(duì)研發(fā)了阿里云數(shù)據(jù)傳輸DTS、數(shù)據(jù)管理DMS、數(shù)據(jù)庫備份DBS、數(shù)據(jù)庫自治DAS等產(chǎn)品。文章來源地址http://www.zghlxwxcb.cn/news/detail-773249.html
到了這里,關(guān)于解剖“全球最大男性交友網(wǎng)站”,GitHub十五年數(shù)據(jù)庫架構(gòu)演進(jìn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!