淘宝网商品库优化实践访谈
生活随笔
收集整理的這篇文章主要介紹了
淘宝网商品库优化实践访谈
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
余鋒先生您好。歡迎您參加QCon0:04并給我們做精彩的演講。也謝謝您接受我們的采訪。您能向觀眾朋友大概介紹一下您自己,包括您現(xiàn)在負(fù)責(zé)的具體工作是什么嗎? 大家好,我隸屬于淘寶網(wǎng)核心系統(tǒng)數(shù)據(jù)庫組。我們的團(tuán)隊(duì)在淘寶主要負(fù)責(zé)MySQL分支的維護(hù)。大家知道淘寶去年開始在做去Oracle化的工作,由于涉及到歷史數(shù)據(jù)保留,替代方案當(dāng)時選擇的是MySQL。由于淘寶很多的產(chǎn)品都用到了數(shù)據(jù)庫,這也促使MySQL即將會慢慢被大規(guī)模使用。Oracle是一個商業(yè)的產(chǎn)品,所以它有很多的特性是非常適合大規(guī)模數(shù)據(jù)使用的。同時MySQL作為一個開源的產(chǎn)品,也具有很多商業(yè)數(shù)據(jù)庫所沒有的特性,于是我們就要去填補(bǔ)這個空白。我們的工作就是在開源的MySQL基礎(chǔ)上做一些改進(jìn)和優(yōu)化,特別是性能方面的優(yōu)化。MySQL最初的設(shè)計(jì)不是用來存儲大規(guī)模數(shù)據(jù)的,但淘寶的數(shù)據(jù)量非常驚人,所以在I/O方面,尤其是CPU I/O層面會有很大瓶頸,因此我們的主要目標(biāo)也是解決IO方面的瓶頸問題 在談到具體的MySQL優(yōu)化策略之前,我想大家都比較好奇,介于淘寶現(xiàn)在的數(shù)據(jù)容量,每天的吞吐量是一個什么樣的情況? 淘寶的產(chǎn)品線很多,以我們目前接觸到的淘寶的商品庫為例,淘寶商品庫是什么概念?就是賣家賣的所有的商品都保存在數(shù)據(jù)庫上。我們都知道淘寶商品是非常多的,有可能是十億級別的,而且淘寶每年的數(shù)據(jù)都會翻番,過去亦是如此,未來也會如此,動輒幾十億條的記錄。在淘寶上,由于賣家是非常活躍的,所以每天的交易數(shù)也是非常多的,而且每天的訪問量也是相當(dāng)大的。更比如在一些高峰期,比如節(jié)假日,像去年的四個一光棍節(jié)促銷,當(dāng)時一天的訪問量可就是平常的好幾倍,幾十倍的樣子。具體的數(shù)字,在網(wǎng)站上應(yīng)該會看到,這個數(shù)字也在不停的變化,大概會在10億的這么一個數(shù)量級上。 在Oracle 切換到MySQL后,可能會有一些商業(yè)上的特性在MySQL上無法得到體現(xiàn)。所以在做優(yōu)化之前,是否設(shè)定了一些策略的標(biāo)準(zhǔn),比如說一定要達(dá)到什么樣的標(biāo)準(zhǔn)才算是成功的優(yōu)化? 我們的標(biāo)準(zhǔn)主要基于以下三個方面,首先是安全性。因?yàn)樘詫氋u家的商品都存在上面,一大堆數(shù)據(jù),商品沒了,淘寶就會很難受;其次是性能,因?yàn)閿?shù)據(jù)量大,而且未來增長的速度會非常快,以前我們的系統(tǒng)是跑在Oracle的小機(jī)上面,它的成本是非常高的。現(xiàn)在改用高性能的PC服務(wù)器,性價比較高,而且Oracle數(shù)據(jù)庫的能力不足以維持淘寶的更新速度;最后是可運(yùn)維性,Oracle是有一套完整的工具,利用它們我們可隨時查看相關(guān)的狀態(tài)和預(yù)測它的一些變化。MySQL作為開源產(chǎn)品,這部分的功能稍顯欠缺,因此我們就需要根據(jù)運(yùn)維團(tuán)隊(duì)和DBA的需求去開發(fā)一些工具。 就是在日常優(yōu)化工作的過程中幫助你去運(yùn)維? 對,這也算優(yōu)化的一方面,算過程的一個方面。 在產(chǎn)品的優(yōu)化過程中,是否會發(fā)現(xiàn)用MySQL替代原來的Oracle有些問題還是無法避免的,您是如何處理的? 是的,是有這樣的問題,比如Oracle的雙機(jī)備份,這塊就做得非常好,整體的方案都不錯。相比之下MySQL這點(diǎn)就比較弱,我們必須在過程中去深化解決這個問題。還有像Oracle使用的高端存儲,它的高端存儲的I/O能力是非常強(qiáng)的。現(xiàn)在我們改用PC服務(wù)器,如果用硬盤來做的話,I/O能力會很差,甚至說I/O的能力在一兩千I/O PS就已經(jīng)算很高的了,這樣的話相比原來的高端存儲會相差一個數(shù)量級。我們在過去幾個月順利地解決了這個問題,而且結(jié)果證明,性能要比高端存儲還要好。 那么這個優(yōu)化的工作現(xiàn)在是一個什么樣的狀態(tài),進(jìn)行中還是已經(jīng)上線? 從去年8月開始到現(xiàn)在已經(jīng)持續(xù)了好幾個月,這個月就可以上線。其實(shí)主要的攻堅(jiān)工作在兩個月前就已經(jīng)做好了,由于要采購設(shè)備,所以安排在這月上線,上線后即可替代原來的Oracle數(shù)據(jù)庫。 就目前的結(jié)果來看優(yōu)化成果如何? 從機(jī)器的運(yùn)算能力上來看的話,比原來要高很多,從設(shè)備的總體的價格來看的話,相比原來小機(jī)的價格,現(xiàn)在的價格相當(dāng)于原來的幾分之一。說的通俗一點(diǎn)就是,花更少的錢做更多的事情,基本是這樣的一個情況。 優(yōu)化MySQL的過程中有沒有涉及到水平分片,或者垂直分片,大概的策略是什么? 這塊因?yàn)橹暗腗ySQL從業(yè)務(wù)的角度上我們已經(jīng)優(yōu)化過了。涉及到業(yè)務(wù)上的復(fù)雜SQL查詢,基本上都把它當(dāng)成Key-Value來處理。所以說在水平切割上就變得非常簡單,我們只需要根據(jù)用戶的這些ID把它平均地分割到集群的各個機(jī)器上去即可,所以說這塊會做得非常簡單,也不會有那些非常復(fù)雜的SQL。 剛才提到在去Oracle化過程中,最終選擇了MySQL。是怎樣的原因使你沒有去選擇NoSQL或是其它技術(shù)來作為提高性能優(yōu)化方面的考慮呢? 主要考慮到以下這幾個方面,第一是因?yàn)镸ySQL已經(jīng)是非常成熟的產(chǎn)品,而且也是經(jīng)過大規(guī)模系統(tǒng)考驗(yàn)的,所以它的穩(wěn)定性,開發(fā)的便捷性還是比較有優(yōu)勢的。從另外一個角度上來講,也能最大限度的保障歷史系統(tǒng)的遷移,這是第一個方面。此外,之所以沒有采用NoSQL主要基于以下幾個方面的考慮,第一由于市面上流行的NoSQL方案相對來說都比較年輕。然而對于淘寶商品庫來講,它是作為淘寶非常重要的庫,是不允許我們有絲毫閃失的,不能出現(xiàn)任何問題。第二點(diǎn),現(xiàn)在流行的NoSQL方案,從程序的架構(gòu)上來講,就是對傳統(tǒng)數(shù)據(jù)庫的過程進(jìn)行了精簡。但是它的存儲、內(nèi)存等問題其實(shí)還是存在的。只是解決問題的思路變得輕量。但是這些問題依舊在的。 現(xiàn)在我們在數(shù)據(jù)庫層面,因?yàn)槠匠6际菑囊鎸用嫒ラ_發(fā),在原碼級別去做優(yōu)化,甚至包括操作系統(tǒng)級的優(yōu)化。所以我們可以很清楚的知道問題在哪里,應(yīng)該解決什么問題,最終能達(dá)到什么樣的效果。那這樣做的好處就是我們既能解決問題,又能充分利用傳統(tǒng)數(shù)據(jù)庫的方便性以及穩(wěn)定性。 請您分享一下,在數(shù)據(jù)庫優(yōu)化方面,尤其是MySQL優(yōu)化這部分,在優(yōu)化的過程種需要遵循那些原則? 優(yōu)化聽起來好像沒什么內(nèi)容,但實(shí)際上我們做了很多的工作。首先要有明確的目標(biāo),我們的目標(biāo)是什么,是為了提高性能還是提高安全性,還是提高其他的什么指標(biāo),這個目標(biāo)要清晰和完整。第二點(diǎn)是測量,你不能說,我拍腦袋看到某某某,他怎么優(yōu)化的,然后我也上去這樣照著優(yōu)化,這不是我們做事的風(fēng)格。我們要測量現(xiàn)在的瓶頸在哪里?我們的系統(tǒng)遇到了什么問題,這點(diǎn)我們會借助一些工具來實(shí)現(xiàn)。比如說測量CPU的使用,我們會非常精確的去測量I/O的使用,比如說在設(shè)備層面,I/O是怎么使用的,在軟件系統(tǒng)層面I/O是怎么使用的,在數(shù)據(jù)庫引擎層面I/O是怎么使用的。通過非常精細(xì)的測量,我們就能找出,對I/O使用不恰當(dāng)?shù)牡胤?#xff0c;然后就是要去解決這種問題,為什么會比設(shè)想的要多呢,或者為什么要比設(shè)想的要慢呢,我們會針對此類問題做理論上的分析,甚至?xí)シ创a它到底是怎么實(shí)現(xiàn)的,這樣我們就可以比較有針對性將問題解決。需要特別提到的是,我們這次有一個創(chuàng)新,用高速的SSD盤去做2級Cache,因?yàn)閭鹘y(tǒng)的MySQL數(shù)據(jù)庫都是引擎里面發(fā)揮pool的功能,然后直接在軟件系統(tǒng)存儲。就是引擎里邊吐出來東西到那邊去,命不中東西從磁盤讀進(jìn)去,由于是傳統(tǒng)的磁盤,所以它的尋道時間是非常長的。那它的I/O其實(shí)是不高的,但是吞吐量大。為了解決問題,我們采用一種叫PCI-E的Flash卡。這個卡的特點(diǎn)是,它是電子盤,所以它沒有尋道時間,隨機(jī)特性非常好,同時它的讀寫吞吐量非常高,讀能大概到1G,寫能達(dá)到幾百兆。采用其作為二級cache,數(shù)據(jù)從InnoDB引擎這邊出來,不到磁盤去,而是先寫到高速卡中。由于高速卡很快,它完成的I/O PS是微秒級的,幾十微秒就寫完了,然后傳統(tǒng)磁盤卻是十個毫秒級的。所以從數(shù)據(jù)庫引擎的角度來看,只需寫入幾十微妙就解決了。寫入數(shù)據(jù)開始是隨機(jī)的,隨機(jī)累計(jì)起來以后它就不是隨機(jī)的,我們通過把它排序,就可以使其變?yōu)轫樞虻摹H缓笪覀冊侔堰@順序的數(shù)據(jù)利用磁盤的高吞吐量特點(diǎn),由于數(shù)據(jù)庫半夜時候它可能會比較輕松。那這時候,把它導(dǎo)到磁盤中去,這樣就大大的提高整個系統(tǒng)的IO能力。這是比較大的一個創(chuàng)新點(diǎn)。 那我們對您的采訪就到這里結(jié)束了,謝謝您。 謝謝。
總結(jié)
以上是生活随笔為你收集整理的淘宝网商品库优化实践访谈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Update 语句中使用别名
- 下一篇: Quora Andy Barton