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