一款受歡迎的KV存儲(chǔ)數(shù)據(jù)庫是如何煉成的?
自2015年開始,手游從萌芽期發(fā)展到如今炙手可熱的領(lǐng)域,發(fā)展的速度之快一定推動(dòng)了背后技術(shù)的改革換新,傳統(tǒng)的技術(shù)為了適應(yīng)新時(shí)代的變化,也會(huì)不斷進(jìn)化,而Tendis的出現(xiàn)也讓所有關(guān)注朋友們眼前一亮,那么,如何打造一款受歡迎的KV存儲(chǔ)數(shù)據(jù)庫?
5月22日08:50-18:00,3306π將集結(jié)多位行業(yè)專家,在廣東廣州天河區(qū)黃埔大道中322號(hào)粵大金融城國際酒店六樓平安廳與大家相約互動(dòng),點(diǎn)擊「閱讀原文」即可報(bào)名。
此次活動(dòng)中,騰訊云數(shù)據(jù)庫專家工程師,Tendis技術(shù)負(fù)責(zé)人陳福榮也將分享《如何打造一款受歡迎的KV存儲(chǔ)數(shù)據(jù)庫》,同時(shí),在會(huì)前針對(duì)這個(gè)話題,陳福榮也給出了他的見解和思考,以下是訪談實(shí)錄:
請(qǐng)陳老師先簡單聊聊自己,以及自己當(dāng)初是如何考慮從事數(shù)據(jù)庫研發(fā)這個(gè)方向呢?
其實(shí)我的本科是非計(jì)算機(jī)專業(yè),但在大二的時(shí)候,發(fā)現(xiàn)編程是一個(gè)非常有意思的事情,于是就考慮轉(zhuǎn)專業(yè)并且報(bào)考計(jì)算機(jī)專業(yè)的研究生。
第一次接觸數(shù)據(jù)庫的時(shí)候,是當(dāng)時(shí)加入學(xué)校的技術(shù)社團(tuán)并開發(fā)了一些網(wǎng)站,后臺(tái)數(shù)據(jù)庫使用的是SQL SERVER。當(dāng)時(shí)就覺得二維表的庫表結(jié)構(gòu)和SQL語句都非常強(qiáng)大和靈活,很多邏輯可以直接通過SQL語句來解決,但理解還比較膚淺。
本科畢業(yè)后,就報(bào)考了數(shù)據(jù)庫專業(yè)的研究生。算起來,今年剛好畢業(yè)10年,比較幸運(yùn)的是,自己也一直從事數(shù)據(jù)庫內(nèi)核開發(fā)的相關(guān)工作。經(jīng)歷了移動(dòng)互聯(lián)網(wǎng)以及云計(jì)算的爆發(fā)性增長,數(shù)據(jù)庫相關(guān)工作逐步變得香餑餑。
數(shù)據(jù)庫是一個(gè)理論和工程實(shí)踐結(jié)合得特別好的學(xué)科。大家會(huì)發(fā)現(xiàn),隨著對(duì)數(shù)據(jù)庫的理解越深入,以前在計(jì)算機(jī)課程上的基礎(chǔ)理論知識(shí)就越重要。例如,ACID、CAP、隔離級(jí)別、分布式事務(wù)等等理論知識(shí),都是理解一個(gè)數(shù)據(jù)庫系統(tǒng)的最重要基礎(chǔ)。
擁有了基礎(chǔ)的理論知識(shí),結(jié)合當(dāng)前最流行的開源數(shù)據(jù)庫(mysql, redis, rocksdb等),多動(dòng)手操作,帶著疑問去理解和學(xué)習(xí)源碼,最終都可以深入理解一個(gè)數(shù)據(jù)庫。介紹一個(gè)經(jīng)驗(yàn),例如學(xué)習(xí)mysql,可以先嘗試單步跟蹤一個(gè)insert語句的完整流程,并且可以優(yōu)先跟蹤innodb內(nèi)部的流程。這樣可以對(duì)存儲(chǔ)格式、B樹、緩存系統(tǒng)、redo log有一個(gè)大概的理解。然后不斷反復(fù)這個(gè)跟蹤過程,最終把關(guān)聯(lián)模塊也搞清楚了。
重復(fù)這個(gè)流程,擴(kuò)大到更多場景,例如更新、刪除、查詢等,盡量不放過任何一個(gè)細(xì)節(jié),同時(shí)多寫一些學(xué)習(xí)記錄,鞏固自己的理解,最后源碼面前是沒有秘密的。
陳老師能否給我們介紹一下Tendis的產(chǎn)生背景?
從2012年開始,騰訊游戲就開始使用redis來作為業(yè)務(wù)緩存來提供服務(wù)。隨著業(yè)務(wù)的不斷壯大,特別是手游爆發(fā)性增長,redis作為緩存暴露了一些比較大的問題:
1. 成本。redis作為純內(nèi)存數(shù)據(jù)庫,性能特別高。但隨著業(yè)務(wù)的不斷接入,數(shù)據(jù)量越來越大,也發(fā)現(xiàn)不少業(yè)務(wù)把redis直接當(dāng)成了存儲(chǔ),QPS和訪問延時(shí)其實(shí)并不高。這個(gè)時(shí)候,基于純內(nèi)存的redis成本就顯得太高,并且存在浪費(fèi)。
2. 可靠性。redis畢竟是一個(gè)內(nèi)存數(shù)據(jù)庫,數(shù)據(jù)的可靠性并不能讓人放心。因此,業(yè)務(wù)上redis+mysql這樣的組合被廣泛使用,但業(yè)務(wù)必須小心翼翼地處理緩存和存儲(chǔ)的一致性問題。
因此,需要有一個(gè)redis協(xié)議的存儲(chǔ)來降低成本以及替代部分mysql存儲(chǔ)場景。于是,Tendis就立項(xiàng)了。從2015年立項(xiàng)到現(xiàn)在,已經(jīng)有了6年時(shí)間。
同樣作為優(yōu)秀的KV數(shù)據(jù)庫產(chǎn)品,Tendis也有著它的獨(dú)到之處,基于Redis與RocksDB的組合取長補(bǔ)短,非常新穎,還請(qǐng)陳老師為社區(qū)朋友們介紹一下Tendis這款產(chǎn)品。
簡單地理解,Tendis就是一個(gè)支持redis協(xié)議的KV分布式存儲(chǔ)。因此,Tendis首先需要保證數(shù)據(jù)落地存儲(chǔ),其次協(xié)議和命令完全兼容。
數(shù)據(jù)落地,我們選擇的是rocksdb,看中的是它成熟的社區(qū),強(qiáng)大的功能和高性能。rocksdb可以認(rèn)為是目前最強(qiáng)大和最可靠的事務(wù)型存儲(chǔ)引擎之一。
對(duì)于協(xié)議和命令的兼容,Tendis的目標(biāo)是真正的完全兼容。協(xié)議兼容,其實(shí)這個(gè)比較容易,更困難的是命令的完全兼容。例如,zset在redis使用內(nèi)存skiplist來實(shí)現(xiàn),那么在Tendis基于rocksdb如何實(shí)現(xiàn)呢?目前Tendis的實(shí)現(xiàn)方式跟其他類似的redis存儲(chǔ)都不太一樣,我們基于什么考慮?5月22日的分享會(huì)有這方面的解讀。
另外,Tendis的目標(biāo)是命令的完全兼容,例如LUA和SCAN,我們也是花了較大的精力去實(shí)現(xiàn)和支持。因?yàn)?,在過去幾年的業(yè)務(wù)推動(dòng)發(fā)現(xiàn),只要與redis少量的不兼容或行為不一致,業(yè)務(wù)從redis遷移過來都需要花很大精力去評(píng)估和溝通。因此,命令兼容性是Tendis目前非常重要的一個(gè)方向。Tendis也是目前命令兼容性做得最好的redis存儲(chǔ)。
最后,其分布式解決方案也是非常重要的一點(diǎn),也是這次分享的重點(diǎn)。
Tendis自2019年內(nèi)部發(fā)布,沉淀了一年終于在2020年面終于向大眾,相對(duì)于19年,Tendis面向外界后又帶來了哪些亮點(diǎn),可否介紹一下呢?
2019年以來,Tendis主要做了兩個(gè)方向的優(yōu)化:
1. 存儲(chǔ)版去中心化架構(gòu),實(shí)現(xiàn)類似redis cluster的去中心化架構(gòu),減少運(yùn)維成本
2. 冷熱混合存儲(chǔ)架構(gòu),熱數(shù)據(jù)在緩存層,全量數(shù)據(jù)在存儲(chǔ)層,加速熱數(shù)據(jù)的訪問效率。
這兩個(gè)架構(gòu)都會(huì)在5月22日的分享中更詳細(xì)地介紹,敬請(qǐng)期待。
最后小編想就Tendis的使用,替大家咨詢陳老師一個(gè)問題,一款優(yōu)秀的產(chǎn)品的推廣,除了本身產(chǎn)品的優(yōu)秀設(shè)計(jì)之外,運(yùn)行的穩(wěn)定性和適用場景也是至關(guān)重要。陳老師可否簡單介紹下呢?
Tendis在2015年立項(xiàng)以來,其實(shí)架構(gòu)也經(jīng)歷過多次調(diào)整,也踩過很多坑,經(jīng)歷了騰訊海量業(yè)務(wù)的洗禮。運(yùn)行的穩(wěn)定性,除了一些基本設(shè)計(jì)外,有幾個(gè)原則需要保證:
1. 化繁為簡。當(dāng)設(shè)計(jì)一個(gè)功能,邏輯特別復(fù)雜,耦合模塊特別多的時(shí)候,要時(shí)刻提醒是不是搞復(fù)雜了。是需求不合理還是設(shè)計(jì)有問題?需要敢于否定以前的設(shè)計(jì)和實(shí)現(xiàn)。需要用簡單的邏輯來解決大部分的問題。
2. 測試的完備性。Tendis在設(shè)計(jì)與實(shí)現(xiàn)的初期,就非常重視單元測試框架的開發(fā)與編寫。后面邏輯變復(fù)雜了,模塊測試和集成測試的測試用例也需要不斷豐富。另外,版本的灰度驗(yàn)證策略也非常重要。
3. 診斷的能力。目前Tendis仍在不斷完善的就是暴露更多的有價(jià)值的內(nèi)部信息,用于評(píng)估內(nèi)部運(yùn)行的穩(wěn)定性。例如rocksdb關(guān)鍵特性,過期處理信息,compaction行為,內(nèi)部排隊(duì)情況,鎖持有情況等等。一個(gè)系統(tǒng)的穩(wěn)定需要依賴長期的運(yùn)營,而長期的運(yùn)營需要依賴一些內(nèi)部數(shù)據(jù)進(jìn)行優(yōu)化分析和決策。
這些方面的思考,期待5月22日的分享中與大家的討論。
