雲時代的分布式數據庫:阿裏分布式數據庫服務DRDS
摘要:伴隨著係統性能、成本及擴展性的新時代需要,以HBase、MongoDB為代表的NoSQL數據庫和以阿裏DRDS、VoltDB、ScaleBase為代表的分布式NewSQL數據庫如雨後春筍般不斷湧現出來。本文詳細介紹了阿裏分布式數據庫服務DRDS。
隨著互聯網時代的到來,計算機要管理的數據量呈指數級別地飛速上漲,而我們卻完全無法對用戶數做出準確預估。我們的係統所需要支持的用戶數,很可能在短短的一個月內突然爆發式地增長幾千倍,數據也很可能快速地從原來的幾百GB飛速上漲到了幾百個TB。如果在這爆發的關鍵時刻,係統不穩定或無法訪問,那麼對於業務將會是毀滅性的打擊。
伴隨著這種對於係統性能、成本以及擴展性的新需要,以HBase、MongoDB為代表的NoSQL數據庫和以阿裏DRDS、VoltDB、ScaleBase為代表的分布式NewSQL數據庫如雨後春筍般不斷湧現出來。
本文將會介紹阿裏DRDS的技術理念、發展曆程、技術特性等內容。
DRDS設計理念
從20世紀70年代關係數據庫創立開始,其實大家在數據庫上的追求就從未發生過變化:更快的存取數據,可以按需擴縮以承載更大的訪問量和更大的數據量,開發容易,硬件成本低,我們可以把這叫做數據庫領域的聖杯。
為了支撐更大的訪問量和數據量,我們必然需要分布式數據庫係統,然而分布式係統又必然會麵對強一致性所帶來的延遲提高的問題,因為網絡通信本身比單機內通信代價高很多,這種通信的代價就會直接增加係統單次提交的延遲。延遲提高會導致數據庫鎖持有時間變長,使得高衝突條件下分布式事務的性能不升反降(這個具體可以了解一下Amdahl定律),甚至性能距離單機數據庫都還有明顯的差距。
從上麵的說明,我們可以發現,問題的關鍵並不是分布式事務做不出來,而是做出來了卻因為性能太差而沒有什麼卵用。數據庫領域的高手們努力了40年,但至今仍然沒有人能夠很好地解決這個問題,Google Spanner的開發負責人就經常在他的Blog上談論延遲的問題,相信也是飽受這個問題的困擾。
麵對這個難題,傳統的關係數據庫選擇了放棄分布式的方案,因為在20世紀70~80年代,我們的數據庫主要被用來處理企業內的各類數據,麵對的用戶不過幾千人,而數據量最多也就是TB級別。用單台機器來處理事務,用個磁盤陣列處理一下磁盤容量不夠的問題,基本上就能解決一切問題了。
然而,信息化和互聯網的浪潮改變了這一切,我們突然發現,我們服務的對象發生了根本性變化,從原來的幾千人,變成了現在的幾億人,數據量也從TB級別到了PB級別甚至更多。存在單點的單機係統無論如何努力,都會麵對係統處理能力的天花板。原來的這條路,看起來是走不下去了,我們必須想辦法換一條路來走。
可是,分布式數據庫所麵對的強一致性難題卻像一座高山,人們努力了無數個日日夜夜,但能翻越這座山的日子看來仍然遙遙無期。
於是,有一群人認為,強一致性這件事看來不怎麼靠譜,那徹底繞開這個問題是不是個更好的選擇?他們發現確實有那麼一些場景是不需要強一致事務的,甚至連SQL都可以不要,最典型的就是日誌流水的記錄與分析這類場景。而去掉了事務和SQL,接口簡單了,性能就更容易得到提升,擴展性也更容易實現,這就是NoSQL係統的起源。
雖然NoSQL解決了性能和擴展性問題,但這種繞開問題的方法給用戶帶來了很多困擾,係統的開發成本也大大提升。這時候就有另外一群人,他們覺得用戶需要SQL,覺得用戶也需要事務,問題的關鍵在於我們要努力地往聖杯的方向不斷前進。在保持係統的擴展性和性能的前提下,付出盡可能小的代價來滿足業務對數據庫的需要。這就是NewSQL這個理念的由來。
DRDS也是一個NewSQL的係統,它與ScaleBase、VoltDB等係統類似,都希望能夠找到一條既能保持係統的高擴展性和高性能,又能盡可能保持傳統數據庫的ACID事務和SQL特性的分布式數據庫係統。
DRDS發展曆程
在一開始,TDDL的主要功能就是做數據庫切分,一個或一組SQL請求提交到TDDL,TDDL進行規則運算後得知SQL應該被分發到哪個機器,直接將SQL轉發到對應機器即可(如圖1)。
圖1 TDDL數據庫切分
開始的時候,這種簡單的路由策略能夠滿足用戶的需要,我們開始的那些應用,就是通過這樣非常簡單的方式完成了他所有的應用請求。我們也認為,這種方案簡單可靠,已經足夠好用了。
然而,當我們服務的應用從十幾個增長到幾百個的時候,大量的中小應用加入,大家紛紛表示,原來的方案限製太大,很多應用其實隻是希望做個讀寫分離,希望能有更好的SQL兼容性。
於是,我們做了第一次重大升級,在這次升級裏,我們提出了一個重要的概念就是三層架構,Matrix對應數據庫切分場景,對SQL有一定限製,Group對應讀寫分離和高可用場景,對SQL幾乎沒有限製。如圖2所示。
圖2 數據庫升級為三層架構
這種做法立刻得到了大家的認可,TDDL所提供的讀寫分離、分庫分表等核心功能,也成為了阿裏集團內數據庫領域的標配組件,在阿裏的幾乎所有應用上都有應用。最為難得的是,這些功能從上線後,到現在已經經曆了多年雙11的嚴酷考驗,從未出現過嚴重故障(p0、p1級別故障屬於嚴重故障)。數據庫體係作為整個應用係統的重中之重,能做到這件事,真是非常不容易。
隨著核心功能的穩定,自2010年開始,我們集中全部精力開始關注TDDL後端運維係統的完善與改進性工作。在DBA團隊的給力配合下,圍繞著TDDL,我們成功做到了在線數據動態擴縮、異步索引等關鍵特征,同時也比較成功地構建了一整套分布式數據庫服務管控體係,用戶基本上可以完全自助地完成整套數據庫環境的搭建與初始化工作。
大概是2012年,我們在阿裏雲團隊的支持下,開始嚐試將TDDL這套體係輸出到阿裏雲上,也有了個新的名字:阿裏分布式數據庫服務(DRDS),希望能夠用我們的技術服務好更多的人。
不過當我們滿懷自信地把自己的軟件拿到雲上的時候,卻發現我們的軟件距離用戶的要求差距很大。在內部因為有DBA的同學們幫助進行SQL review,所以SQL的複雜度都是可控的。然而到了雲上,看了各種渠道提過來的兼容性需求,我們經常是不自覺地發出這樣的感歎:“啊?原來這種語法MySQL也是可以支持的?”
於是,我們又進行了架構升級,這次是以兼容性為核心目標的係統升級工作,希望能夠在分布式場景下支持各類複雜的SQL,同時也將阿裏這麼多年來在分布式事務上的積累都帶到了DRDS裏麵。
這次架構升級,我們的投入史無前例,用了三年多才將整個係統落地完成。我們先在內部以我們自己的業務作為首批用戶上線,經過了內部幾百個應用的嚴酷考驗以後,我們才敢拿到雲上,給到我們的最終用戶使用。
目前,我們正在將TDDL中更多的積累輸出到雲上,同時也努力優化我們的用戶界麵。PS:其實用戶界麵優化對我們這種專注於高性能後端技術的團隊來說,才是最大的技術挑戰,連我也去學了AngularJS,參與了用戶UI編。
DRDS主要功能介紹
發展曆史看完了,下麵就由我來介紹一下目前我們已經輸出到雲上的主要功能。
分布式SQL執行引擎
分布式SQL引擎主要的目的,就是實現與單機數據庫SQL引擎的完全兼容。目前我們的SQL引擎能夠做到與MySQL的SQL引擎全兼容,包括各類join和各類複雜函數等。他主要包含SQL解析、優化、執行和合並四個流程,如圖3中綠色部分。
圖3 SQL引擎實現的主要流程
雖然SQL是兼容的,但是分布式SQL執行算法與單機SQL的執行算法卻完全不同,原因也很簡單,網絡通信的延遲比單機內通信的延遲大得多。舉個例子說明一下,我們有份文件要從一張紙A上謄寫到另外一張紙B上,單機係統就好比兩張紙都在同一個辦公室裏,而分布式數據庫則就像是一張紙在北京,一張紙在杭州。
自然地,如果兩張紙在同一個辦公室,因為傳輸距離近,逐行謄寫的效率是可以接受的。而如果距離是北京到杭州,用逐行謄寫的方式,就立刻顯得代價太高了,我們總不能看一行,就打個“飛的”去杭州寫下來吧。在這種情況下,還是把紙A上的信息拍個照片,【一整批的】帶到杭州去處理,明顯更簡單一些。這就是分布式數據庫特別強調吞吐調優的原因,隻要是涉及到跨機的所有查詢,都必須盡可能的積攢一批後一起發送,以減少係統延遲提高帶來的不良影響。
按需數據庫集群平滑擴縮
DRDS允許應用按需將新的單機存儲加入或移出集群,DRDS則能夠保證應用在遷移流程中實現不停機擴容縮容。
圖4 DRDS按需進行平滑擴縮
在內部的數據庫使用實踐中,這個功能的一個最重要應用場景就是雙11了。在雙11之前,我們會將大批的機器加入到我們的數據庫集群中,抗過了雙11,這批機器就會下線。
當DRDS來到雲上,我們發現雙11其實不僅僅隻影響阿裏內部的係統。在下遊的各類電商輔助性係統其實也麵對巨大壓力。在雙11前5天,網聚寶的熊總就找到我說,擔心撐不過雙11的流量,怕係統掛。於是我們就給他介紹了這個自動擴容的功能怎麼用,他買了一個月的數據庫,掛接在DRDS上。數據庫能力立刻翻倍,輕鬆抗過了雙11,也算是我印象比較深刻的一個案例了。
因為我們完全無法預測在什麼時間點係統會有爆發性的增長,而如果在這時候係統因為技術原因不能使用,就會給整個業務帶來毀滅性的影響,風口一旦錯過,就追悔莫及了。我想這就是雲計算特別強調可擴展能力的原因吧。
小表廣播
小表廣播也是我們在分布式數據庫領域內最常用的工具之一,他的核心目的其實都是一個——盡可能讓查詢隻發生在單機。
讓我們用一個例子來說明,小表廣播的一般使用場景。
圖5 小表廣播場景
圖5中,如果我想知道買家id等於0的用戶在商城裏麵買了哪些商品,我們一般會先將這兩個表join起來,然後再用where平台名=”商城” and buyerID = 0找到符合要求的數據。然而這種join的方式,會導致大量的針對左表的網絡I/O。如果要取出的數據量比較大,係統延遲會明顯上升。
這時候,為了提升性能,我們就必須要減少跨機join的網絡代價。我們比較推薦應用做如下處理,將左表複製到右表的每一個庫上。這樣,join操作就由分布式join一下變回到本地join,係統的性能就有很大的提升了,如圖6所示。
圖6
分布式事務套件
在阿裏巴巴的業務體係中存在非常多需要事務類的場景,下單減庫存,賬務,都是事務場景最集中的部分。
而我們處理事務的方法卻和傳統應用處理事務的方案不大一樣,我們非常強調事務的最終一致性和異步化。利用這種方式,能夠極大地降低分布式係統中鎖持有的時間,從而極大地提升係統性能。
圖7 DRDS分布式事務解決套件
這種處理機製,是我們分布式事務能夠以極低成本大量運行的最核心法門。在DRDS平台內,我們將這些方案產品化,為了DRDS的分布式事務解決套件。
利用他們,能夠讓你以比較低的成本,實現低延遲,高吞吐的分布式事務場景。
DRDS的未來
阿裏分布式數據庫服務DRDS上線至今,大家對這款產品的熱情超出了我們的預期,短短半年內已經有幾千個申請。
盡管還在公測期,但是大家就已經把關係到身家性命的寶貴在線數據業務放到了DRDS上,我能夠感受到這份沉甸甸的信賴,也不想辜負這份信賴。
經過阿裏內部幾千個應用的不斷曆練,DRDS已經積累出一套強大的分布式SQL執行引擎和和一整套分布式事務套件。
我也相信,這些積累能夠讓用戶在基本保持單機數據庫的使用習慣的前提下,享受到分布式數據庫高性能可擴展的好處。
在平時的DRDS支持過程中,我麵對最多的問題就是,DRDS能不能夠在不改變任何原有業務邏輯和代碼的前提下,實現可自由伸縮和擴展呢?十分可惜的是,關係數據庫發展至今,還沒有找到既能保留傳統數據庫一切特性,又能實現高性能可擴展數據庫的方法。
然而,雖不能至,吾心向往之!我們會以“可擴展,高性能”為產品核心,堅定地走在追尋聖杯的路上,並堅信最終我們一定能夠找尋到它神聖的所在。
該文章轉載自:淘寶沈詢_WhisperXD的博客
最後更新:2017-04-01 13:38:50