1024程序员节 | 我在腾讯自研数据库,我为技术代言
隨著互聯(lián)網(wǎng)的發(fā)展,“程序員”這個名字逐漸為人們所關(guān)注到,其所代表的標簽印象也變得更加多樣 —— 改變世界?Debug專業(yè)戶?格子衫代言人?……事實上,有那么一群人,比如騰訊數(shù)據(jù)庫工程師,他們將自己定義為“數(shù)字的工匠”,初心如一地用代碼創(chuàng)造產(chǎn)品、解決問題,為國產(chǎn)數(shù)據(jù)庫發(fā)展助力。而對于我們來說,有他們的努力,數(shù)字世界也不再是虛無縹緲的數(shù)據(jù),而像冰山盤亙在海面一樣,深邃而沉穩(wěn)。
?
在“1024”程序員節(jié)到來之際,我們推出本期特別分享,邀請騰訊6位數(shù)據(jù)庫技術(shù)工程師,講述了他們對代碼技術(shù)的理解:
01
—
“我是騰訊云數(shù)據(jù)庫技術(shù)負責人雷海林,2007年大學(xué)畢業(yè)加入騰訊,負責過計費、支付底層各大模塊的開發(fā),包括分布式Cache系統(tǒng)‘Hold(厚德)’等,以及騰訊金融級安全可控分布式數(shù)據(jù)庫研發(fā)。我在騰訊,為數(shù)據(jù)庫國產(chǎn)化發(fā)展助力。”?
“我是騰訊云數(shù)據(jù)庫高級工程師賴錚,2018年加入騰訊,曾經(jīng)在MySQL數(shù)據(jù)庫官方團隊工作,現(xiàn)在負責騰訊云數(shù)據(jù)庫內(nèi)核開發(fā)。我在騰訊,為數(shù)據(jù)庫國產(chǎn)化發(fā)展助力。”
?
“我是騰訊IEG數(shù)據(jù)庫專家工程師陳福榮,2011年加入騰訊,曾經(jīng)做過Tendb Cluster和Tendis項目,現(xiàn)在騰訊IEGCROS團隊負責騰訊游戲云存儲開發(fā)。我在騰訊,為數(shù)據(jù)庫國產(chǎn)化發(fā)展助力。”
?
“我是騰訊云數(shù)據(jù)庫高級工程師陳再妮,2019年加入騰訊,從事數(shù)據(jù)多活、Oracle兼容、讀寫分離等項目開發(fā)。我在騰訊,為數(shù)據(jù)庫國產(chǎn)化發(fā)展助力。”
?
“我是騰訊云數(shù)據(jù)庫工程師張風嘯,2019年加入騰訊,從事多源同步和數(shù)據(jù)校驗?zāi)K的設(shè)計與開發(fā)。我在騰訊,為國產(chǎn)數(shù)據(jù)庫發(fā)展助力。”
“我是騰訊云數(shù)據(jù)庫高級工程師陳松威,2018年加入騰訊,從事云數(shù)據(jù)庫內(nèi)核研發(fā),開發(fā)過的功能包括企業(yè)級列加密函數(shù)、數(shù)據(jù)恢復(fù)工具、異步審計,數(shù)據(jù)預(yù)熱等。我在騰訊,為國產(chǎn)數(shù)據(jù)庫發(fā)展助力。”
02
—
1 你為什么選擇從事數(shù)據(jù)庫底層研發(fā)?
雷海林:個人興趣更喜歡與計算機打交道,通過code去解決問題;而一般來說,越是偏低層的系統(tǒng)軟件,技術(shù)挑戰(zhàn)也越大,而數(shù)據(jù)庫領(lǐng)域在性能優(yōu)化、高可用、擴展性、數(shù)據(jù)一致性等方面一直有無限的可能,技術(shù)上可以做各種嘗試、各種創(chuàng)新探索,同時驅(qū)動更廣泛的技術(shù)生態(tài)創(chuàng)新突破。
雷海林
?
賴錚:數(shù)據(jù)庫系統(tǒng)作為基礎(chǔ)的系統(tǒng)軟件,是很多應(yīng)用系統(tǒng)的核心。它涉及到的知識領(lǐng)域非常廣泛,包括操作系統(tǒng)、事務(wù)系統(tǒng)、并發(fā)處理等等,可以說是軟件領(lǐng)域的明珠、人類智慧的結(jié)晶。能從事這個領(lǐng)域的研發(fā)工作,會有一種使命感,同時,如果做出了一點點成績,也會給自己帶來巨大的滿足感。尤其是在數(shù)據(jù)爆炸的時代,對于數(shù)據(jù)的存儲和管理技術(shù)越來越成為計算機領(lǐng)域的關(guān)鍵性技術(shù),能在這樣快速變化的大潮中奮發(fā)搏擊,也是一件幸事。
?
陳福榮:應(yīng)該說比較幸運,研究生階段就是從事數(shù)據(jù)庫方面的學(xué)習(xí)和研究,第一份工作是跟著導(dǎo)師做國產(chǎn)數(shù)據(jù)庫,積累了一些經(jīng)驗,后來加入了騰訊游戲的DBA團隊。所以,從學(xué)生到現(xiàn)在超過10年了,一直都是做數(shù)據(jù)庫相關(guān)的開發(fā)工作。也很慶幸一直做著自己比較喜歡的工作。
?
陳再妮:最早在業(yè)務(wù)系統(tǒng)的后臺開發(fā)時,底層數(shù)據(jù)存儲使用到了數(shù)據(jù)庫,發(fā)現(xiàn)很多大段的業(yè)務(wù)邏輯代碼,一條SQL就可以搞定,這使得我對數(shù)據(jù)庫產(chǎn)生了濃厚的興趣,開始進入這個領(lǐng)域。進入后發(fā)現(xiàn)數(shù)據(jù)庫底層確實是復(fù)雜的東西,做起來特別有挑戰(zhàn),但一旦完成后也會讓我產(chǎn)生更多的成就感,這也驅(qū)動了我一直從事下去。
?
張風嘯:才開始接觸技術(shù)是寫Java Web的,參與了校內(nèi)小項目的開發(fā),做了有一年多。在開始覺得只是用框架,不夠深入有點無聊。后來通過社區(qū)接觸了很多之前沒接觸的新技術(shù),對一些基礎(chǔ)組件的底層實現(xiàn)產(chǎn)生了比較濃厚的興趣。后來進入騰訊實習(xí)期間,調(diào)研了解了一些新的DB技術(shù),從而對數(shù)據(jù)庫的興趣更加濃烈。后來面試的時候也和面試官表達了想去做數(shù)據(jù)庫的意愿,沒想到真的遇上了。
?
陳松威:數(shù)據(jù)庫是三大系統(tǒng)軟件之一,涉及到的模塊眾多,是非常有深度、值得探索的領(lǐng)域。能從事數(shù)據(jù)庫底層研發(fā),是一件非常榮幸的事情。特別是在我們團隊,有多位在數(shù)據(jù)庫內(nèi)核領(lǐng)域深耕多年的技術(shù)大牛,他們總能知無不言言無不盡地幫助我,使我快速成長,這我更加堅信從事數(shù)據(jù)庫內(nèi)核研發(fā)的選擇是正確的。
2 作為程序員,你做過的覺得最有成就感的三個業(yè)務(wù)或者事情是什么?
雷海林:我覺得最有成就感的事情是技術(shù)上比較追求完美地做出一些組件或者產(chǎn)品,解決難以解決的BUG,或者性能上的每一次超越和升級:
a)??? 比如封裝zkapi,能讓大家用起來更方便,屏蔽很難處理的一些細節(jié)問題,實現(xiàn)一個基本無鎖化的內(nèi)存池組件,解決偶發(fā)的毛刺問題等等;
b)??? 比如花一個星期以上的時間,構(gòu)造數(shù)十億的請求去解決某個難以重現(xiàn)的數(shù)據(jù)一致性BUG;
c)???? 負責騰訊國產(chǎn)分布式數(shù)據(jù)庫的研發(fā),支撐各行業(yè)對分布式數(shù)據(jù)庫的需求。
?
賴錚:a)在InnoDB存儲引擎中實現(xiàn)了透明加密功能;
b)在InnoDB存儲引擎中實現(xiàn)了基于R樹的空間索引;
c)通過優(yōu)化熱點更新大幅度提升了秒殺場景下的系統(tǒng)性能。
賴錚
?
陳福榮:作為程序員,最有成就感的事情應(yīng)該就是做的一些核心功能或者優(yōu)化,能夠真正在業(yè)務(wù)上落地并且發(fā)揮作用。舉三個例子:
第一個是在數(shù)據(jù)庫上增加了在線加字段的能力。這應(yīng)該是我個人加入騰訊做的第一個比較大的功能點,需要對Innodb底層存儲格式進行優(yōu)化,當時做的時候技術(shù)上挑戰(zhàn)很大,但完成后,它對業(yè)務(wù)減少停服時間的收益也特別明顯。當?shù)谝粋€Demo做出來并且在第一個業(yè)務(wù)(當年應(yīng)該是斗戰(zhàn)神)上線時,還是很有成就感的。
第二個是研發(fā)互娛的分布式解決方案TenDBCluster,解決了原來數(shù)據(jù)庫無法水平擴展的問題,順應(yīng)了手游時代的爆發(fā)。大約在2015年,第一款業(yè)務(wù)從單機數(shù)據(jù)庫切換到TenDB Cluster時,我跟另外一個同事一直堅守了凌晨兩三點,最終業(yè)務(wù)順利切換,雖然比較晚了,但心里還是感到非常興奮。
第三個是TendisX冷熱混合存儲在騰訊云商業(yè)化,通過騰訊云對外開放。
陳福榮
?
陳再妮:a)數(shù)據(jù)庫多中心多活模塊研發(fā):保障企業(yè)數(shù)據(jù)庫的高可用,為客戶業(yè)務(wù)系統(tǒng)實現(xiàn)7×24小時不間斷高效平穩(wěn)運行發(fā)揮了重要作用;
b)Oracle兼容特性研發(fā),助力Oracle兼容版本的數(shù)據(jù)庫產(chǎn)品功能順利上線,極大提升了騰訊云數(shù)據(jù)庫助力行業(yè)技術(shù)國產(chǎn)化的優(yōu)勢;
c)完成騰訊自研分布式HTAP國產(chǎn)數(shù)據(jù)庫開源。
?
張風嘯:a)一個是實現(xiàn)了數(shù)據(jù)庫遷移中異構(gòu)數(shù)據(jù)遷移和同步的數(shù)據(jù)校驗?zāi)K,解決了據(jù)遷移中的一致性校驗問題。
b)進一步完善了數(shù)據(jù)庫異構(gòu)多源同步的功能,提升了產(chǎn)品的易用性。
c)最關(guān)鍵的是大學(xué)期間教女孩子寫計算機的大作業(yè),最后變成了女朋友。
?
陳松威:a)原創(chuàng)了業(yè)界唯一的數(shù)據(jù)恢復(fù)工具,能夠從損壞的表文件中恢復(fù)用戶數(shù)據(jù),保障數(shù)據(jù)安全。
b)設(shè)計并實現(xiàn)了異步審計,將審計性能影響降至3%,在業(yè)界遙遙領(lǐng)先。
c)原創(chuàng)了數(shù)據(jù)庫主從切換前,備機的數(shù)據(jù)預(yù)熱功能。
?
3、你認為對程序員來說最重要的非技術(shù)要素是什么?
雷海林:尋根問底的精神。比如程序出現(xiàn)了某個罕見的異常現(xiàn)象,那也一定是在代碼層面出現(xiàn)了問題,我們要盡全力找到并解決它,不能因為它非常偶發(fā)而忽視。
?
賴錚:保持好奇。
?
陳福榮:第一,需要刨根問底的精神。對于一個技術(shù)問題,如果這個問題是自己的主要工作,或者是某個待解決問題的關(guān)鍵路徑,必須把這些問題完全搞清楚,不能似懂非懂。對于底層技術(shù)而言,對更多底層問題的鉆研,會發(fā)現(xiàn)這些問題的解決思路其實是類似的,漸漸會建立自己的方法論,因此不要輕易放過一個問題或者bug。
第二,對最終結(jié)果負責。不能僅僅滿足于功能開發(fā)完成,這點特別重要。一個任務(wù),一定不僅僅是希望這個功能跑起來,更多是希望真正能夠解決業(yè)務(wù)問題和痛點。如果開發(fā)人員僅僅把自己定位成代碼編寫者,是不夠的。
第三,可以有一點點代碼潔癖,這樣會讓自己寫出風格更好的代碼。
?
陳再妮:做事嚴謹,就像計算機的世界非0即1;態(tài)度認真負責,值得信賴。
陳再妮
?
張風嘯:我覺得是對感興趣的事情的喜愛和追求。技術(shù)和其他方面都一樣,一定是有興趣、有追求,才能做得更好。
?
陳松威:我覺得是,要有一種“空杯心態(tài)”。
4、厲害的程序員都有哪些特別的能力?
雷海林:a)學(xué)習(xí)能力。個人很渺小,要不斷地虛心學(xué)習(xí),看書、看文章論文、多掌握原理性質(zhì)的東西;
b)熱愛閱讀開源社區(qū)好的代碼,通過學(xué)習(xí)別人的代碼提升自己的編程能力;
c)對自己有信心,遇事不妥協(xié),高標準要求自己,喜歡去解決工作領(lǐng)域各種技術(shù)上的挑戰(zhàn)。
?
陳福榮:第一是學(xué)習(xí)能力。開發(fā)這個領(lǐng)域新技術(shù)是層出不窮,如果不具備很好的學(xué)習(xí)能力,很容易會出現(xiàn)一些力不從心的狀態(tài)。當然,如果有比較好的計算機基礎(chǔ)理論的背景,學(xué)習(xí)起來是可以觸類旁通的。
第二個是抗壓能力。線上bug是不可避免的,如果出現(xiàn)線上故障壓力一定是很大的。但此時最重要的是優(yōu)先恢復(fù)業(yè)務(wù),因此,一定要頂住壓力,保持思路清晰,尋找最高效的解決辦法。
第三個是心態(tài)調(diào)整能力。厲害的程序員都會表現(xiàn)出干勁十足,精神飽滿,除了本身對工作的熱愛外,還需要自己心態(tài)上的調(diào)整,以及適當?shù)男箟悍绞桨ㄥ憻捝眢w等。
?
陳再妮:a)極客精神:對未知技術(shù)保持好奇之心,并持續(xù)學(xué)習(xí);
b)看待問題可以通過表象直到問題根源;
c)有趣的靈魂:代碼注釋寫的讓人如沐晨風,比如讓模塊運行起來:
/* Do the modulemagic dance */PG_MODULE_MAGIC;賴錚:思維縝密,邏輯性極強。?
張風嘯:專注, 細致,心思縝密,思考全面;以及對問題刨根究底的態(tài)度,深入鉆研。
陳松威:邏輯性強、創(chuàng)造力強、思維嚴謹、良好的溝通能力。
5、對數(shù)據(jù)庫未來發(fā)展趨勢,有什么看法或建議?
雷海林:數(shù)據(jù)庫必定還是會往分布式數(shù)據(jù)庫的方向繼續(xù)發(fā)展。整體來看,則將在數(shù)據(jù)庫彈性擴展、跨地域進行分布調(diào)度、6個9(99.9999%)以上的可用性、HTAP融合、SQL智能診斷與優(yōu)化、極致的性能等方向持續(xù)發(fā)展——最后回歸數(shù)據(jù)庫的本質(zhì):當某個業(yè)務(wù)獲取到一個數(shù)據(jù)庫的域名地址,數(shù)據(jù)庫就是一個黑盒子以極致的性能提供SQL讀寫服務(wù)。不用再關(guān)心容量、SQL調(diào)優(yōu)、容災(zāi)等細節(jié)。
?
賴錚:數(shù)據(jù)庫未來會操作面向云計算的方向發(fā)展,云原生數(shù)據(jù)庫將會成為主流。彈性擴展、TP+AP、海量數(shù)據(jù)等特點將會充分顯示出云原生數(shù)據(jù)庫的優(yōu)勢。
?
陳福榮:1)分布式。未來的數(shù)據(jù)庫一定主要是使用分布式的架構(gòu),無論是share nothing還是share disk,都能較好解決數(shù)據(jù)庫的容量問題,便于彈性擴縮容;
2)軟硬結(jié)合。未來數(shù)據(jù)庫一定會結(jié)合軟硬一體化的設(shè)計理念,充分發(fā)揮硬件的性能,滿足企業(yè)級用戶的需求,如更快的響應(yīng)時間、更高的安全性、更大的容量、更低的成本等;
3)智能化。未來的數(shù)據(jù)庫會結(jié)合數(shù)據(jù)庫的運行狀態(tài)以及AI的能力,提升數(shù)據(jù)庫管理的智能化水平,包括故障診斷、故障預(yù)測、自動擴縮容、更優(yōu)的執(zhí)行計劃等。
?
陳再妮:未來數(shù)據(jù)庫一定會依據(jù)新型硬件做架構(gòu)層面的改良,舉個例子:傳統(tǒng)數(shù)據(jù)庫是基于存儲不可靠以及存儲性能差設(shè)計的(WAL、REDO、UNDO、DO、CHECKPOINT),是基于當前CPU運算速度設(shè)計的(32位事務(wù)ID,64位事務(wù)ID),但是好多理論隨著硬件的快速發(fā)展會被徹底顛覆:比如基于云原生數(shù)據(jù)庫(接近于基于存儲可靠的設(shè)計),云原生內(nèi)存數(shù)據(jù)庫(數(shù)據(jù)全部存儲于內(nèi)存,主要解決網(wǎng)絡(luò)問題 RDMA、DPDK、SPDK 等)、量子數(shù)據(jù)庫等,這些基于新硬件新理論才是數(shù)據(jù)庫的未來。
?
張風嘯
張風嘯:一方面是,當前業(yè)界關(guān)于數(shù)據(jù)庫的架構(gòu)、存儲結(jié)構(gòu)等很多方面的研究已經(jīng)很多且比較完善了,而存儲介質(zhì)等硬件方面的變化,可能給會給存儲的架構(gòu)設(shè)計帶來很大的變化,所以我們可以多關(guān)注新型存儲產(chǎn)品的出現(xiàn)帶來的一些變化。
另一方面是我很贊同的觀點:性能不是唯一的肌肉,穩(wěn)定性、產(chǎn)品化、運營體系等方面,才是當前國產(chǎn)數(shù)據(jù)庫面對最突出的幾個挑戰(zhàn)。數(shù)據(jù)庫要發(fā)展好,發(fā)展優(yōu)秀的生態(tài)和做好產(chǎn)品化是至關(guān)重要的。
?
陳松威:數(shù)據(jù)庫未來趨勢是云原生。在未來的產(chǎn)業(yè)互聯(lián)網(wǎng)中,數(shù)據(jù)庫的彈性擴展能力、自我診斷快速運維能力、個性化服務(wù)能力將非常重要。
?
陳松威
?
6、推薦一段值得稱道或推薦的簡短代碼片段?
雷海林:Linux內(nèi)核的list.h組件,實現(xiàn)簡單,通用性好:
/* * Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */#ifndef CONFIG_DEBUG_LISTstatic inline void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next){ next->prev = new; new->next = next; new->prev = prev; prev->next = new;}#elseextern void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next);#endif /** * list_add - add a new entry * @new: new entry to be added * @head: list head to add it after * * Insert a new entry after the specified head. * This is good for implementing stacks. */static inline void list_add(struct list_head *new, struct list_head *head){ __list_add(new, head, head->next);}賴錚:存儲引擎里字節(jié)序轉(zhuǎn)換函數(shù)代碼,簡單明了,非常精巧。
?
陳再妮:
/* * TransactionIdPrecedes --- is id1 logically < id2? */boolTransactionIdPrecedes(TransactionId id1, TransactionId id2){ /* * If either ID is a permanent XID then we can just do unsigned * comparison. If both are normal, do a modulo-2^32 comparison. */ int32 diff;if (!TransactionIdIsNormal(id1) || !TransactionIdIsNormal(id2)) return (id1 < id2);diff = (int32) (id1 - id2); return (diff < 0);}這段代碼乍一看平平無奇,但要結(jié)合PG事務(wù)環(huán)來看,這個算法設(shè)計得很巧妙的,而且剛好在PG這種事務(wù)環(huán)下才是有效的。它在半個事務(wù)環(huán)的限制下,巧妙的運行 2 的補碼,實現(xiàn)無符號事務(wù)ID的比較:
?
張風嘯:世界上最簡單的數(shù)據(jù)庫可以只用2個bash函數(shù)實現(xiàn)。這是在書籍《DesigningData-IntensiveApplication》中截取的,也非常推薦大家去閱讀。
#!/bin/bashdb_set () { echo"$1,$2" >> database}?
db_get () { grep"^$1," database | sed -e "s/^$1,//" | tail -n 1}陳松威:想推薦一個存儲引擎里實現(xiàn)中的一個頁面校驗函數(shù):btr_validate_level。這個函數(shù)將所有可能的校驗條件都一一列舉,包括頁面在區(qū)中的狀態(tài)校驗、頁面本身校驗、相鄰頁面指針校驗、父子節(jié)點指針校驗、父子節(jié)點相鄰節(jié)點指針環(huán)校驗等等。代碼非常嚴謹,對我啟發(fā)很大。
?
陳福榮:簡短代碼片段意義不是很大,一個片段不管有多好,也不是一個可服務(wù)的載體。相對于代碼片段,一個完整系統(tǒng)的設(shè)計與實現(xiàn)顯得更重要。如果是C語言,推薦redis;如果是C++,推薦LevelDB或RocksDB。如果把成熟的開源軟件代碼認真看一遍,對個人的提升還是很大的。
總結(jié)
以上是生活随笔為你收集整理的1024程序员节 | 我在腾讯自研数据库,我为技术代言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Golang 单元测试详尽指引
- 下一篇: 如何有效地进行代码 Review?