OceanBase 1.0項(xiàng)目從2013年初開(kāi)始做總體設(shè)計(jì),,2014年開(kāi)始編碼,、測(cè)試,2015年底正式上線并無(wú)縫遷移部分集團(tuán)MySQL業(yè)務(wù),,直到2016年中才正式上線螞蟻核心業(yè)務(wù),,包括會(huì)員視圖、花唄,、賬務(wù),,等等,最后“絲般柔順”地通過(guò)了2016年雙十一大考,。 從技術(shù)架構(gòu)的角度看,,一個(gè)分布式數(shù)據(jù)庫(kù)主要就是兩個(gè)部分:一個(gè)部分是怎么做存儲(chǔ),怎么做事務(wù),;另外一個(gè)部分是怎么做查詢,。首先我們看第一個(gè)部分,主要是三個(gè)關(guān)鍵點(diǎn):可擴(kuò)展,、高可用以及低成本,,它們代表了OceanBase的核心技術(shù)優(yōu)勢(shì)。 分布式存儲(chǔ)&事務(wù)第一我們?cè)趺蠢斫鈹?shù)據(jù),,如何把數(shù)據(jù)劃分開(kāi)來(lái)從而分布到多臺(tái)服務(wù)器,?這個(gè)問(wèn)題其實(shí)傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)已經(jīng)幫我們解決好了。無(wú)論是Oracle還是MySQL,,都支持一個(gè)叫做兩級(jí)分區(qū)表的概念,。大部分業(yè)務(wù)都可以按兩個(gè)維度劃分?jǐn)?shù)據(jù):一個(gè)維度是時(shí)間,數(shù)據(jù)是按照時(shí)間順序生成的,;另外一個(gè)維度,對(duì)于互聯(lián)網(wǎng)業(yè)務(wù)來(lái)講,,往往就是用戶,。不同的用戶生成不同的數(shù)據(jù),不同用戶之間的數(shù)據(jù)相關(guān)度比較低,,而同一個(gè)用戶的數(shù)據(jù)往往會(huì)被同時(shí)訪問(wèn),。 圖1 OceanBase數(shù)據(jù)分布 如圖1,通過(guò)時(shí)間和業(yè)務(wù)主鍵兩個(gè)維度將表格劃分為P1~P8總共8個(gè)分區(qū),。OceanBase跟傳統(tǒng)數(shù)據(jù)庫(kù)不一樣的地方在哪里呢,?傳統(tǒng)數(shù)據(jù)庫(kù)所有的分區(qū)只能在一臺(tái)服務(wù)器,而OceanBase每個(gè)分區(qū)可以分布到不同的服務(wù)器,。從數(shù)據(jù)模型的角度看,,OceanBase可以被認(rèn)為是傳統(tǒng)的數(shù)據(jù)庫(kù)分區(qū)表在多機(jī)的實(shí)現(xiàn)。對(duì)于常見(jiàn)的分布式系統(tǒng),要么采用哈希分區(qū),,要么采用范圍分區(qū),。OceanBase的數(shù)據(jù)劃分方案和這些系統(tǒng)有較大的差別,通過(guò)兩級(jí)分區(qū)表,,我們可以把不同的用戶,,以及在不同時(shí)間點(diǎn)生成的數(shù)據(jù)全部融合到統(tǒng)一的表格里面。無(wú)論這些分區(qū)在在多臺(tái)服務(wù)器上是如何分布的,,甚至可以對(duì)在線數(shù)據(jù)采用內(nèi)存計(jì)算,,對(duì)歷史數(shù)據(jù)采用更高壓縮率的壓縮算法或者執(zhí)行預(yù)計(jì)算,整個(gè)系統(tǒng)對(duì)使用者呈現(xiàn)的都是一張表格,,后臺(tái)實(shí)現(xiàn)對(duì)使用者完全透明,。當(dāng)然,這里面還會(huì)有很多的工作要做,。 第二點(diǎn)是我們底層的分布式架構(gòu),。 圖2 OceanBase整體架構(gòu) 圖2是OceanBase整體架構(gòu)圖。OceanBase架構(gòu)圖往往都是三個(gè)框框,。為什么這樣呢,?這是基于高可用考慮的。為了實(shí)現(xiàn)機(jī)房故障無(wú)損容災(zāi),,OceanBase需要部署到三個(gè)機(jī)房,。每個(gè)機(jī)房又會(huì)有很多服務(wù)器,每臺(tái)服務(wù)器又會(huì)服務(wù)很多不同的分區(qū),。如圖2,, P1到P8代表不同的分區(qū),每個(gè)分區(qū)有3個(gè)副本,,分布在三個(gè)機(jī)房?jī)?nèi),。用戶的請(qǐng)求首先發(fā)給ObProxy。ObProxy是一個(gè)訪問(wèn)代理,,它會(huì)根據(jù)用戶請(qǐng)求的數(shù)據(jù)將請(qǐng)求轉(zhuǎn)發(fā)到合適的服務(wù)器,。ObProxy的最大的亮點(diǎn)在于性能特別好,我們對(duì)它做了非常多的針對(duì)性優(yōu)化,,使得它可以在非常一般的普通服務(wù)器上達(dá)到每秒百萬(wàn)級(jí)的處理能力,。ObServer是OceanBase的工作機(jī),每臺(tái)工作機(jī)服務(wù)一些分區(qū),。 與大多數(shù)分布式系統(tǒng)不同的地方在于,,OceanBase這個(gè)系統(tǒng)沒(méi)有單獨(dú)的總控服務(wù)器/總控進(jìn)程。分布式系統(tǒng)一般包含一個(gè)單獨(dú)的總控進(jìn)程,,用來(lái)做全局管理,、負(fù)載均衡,,等等。OceanBase沒(méi)有單獨(dú)的總控進(jìn)程,,我們的總控是一個(gè)服務(wù),,叫做RootService,集成在ObServer里面,。OceanBase會(huì)從所有的工作機(jī)中動(dòng)態(tài)地選出一臺(tái)ObServer執(zhí)行總控服務(wù),,另外,當(dāng)總控服務(wù)所在的ObServer出現(xiàn)故障時(shí),,系統(tǒng)會(huì)自動(dòng)選舉一臺(tái)新的ObServer提供總控服務(wù),。這種方式的好處在于簡(jiǎn)化部署,雖然實(shí)現(xiàn)很復(fù)雜,,但是大大降低了使用成本,。 接下來(lái)我們看整個(gè)數(shù)據(jù)庫(kù)最核心的部分。 數(shù)據(jù)庫(kù)最基礎(chǔ),,也是最核心的部分是事務(wù)處理,,這點(diǎn)對(duì)于多機(jī)系統(tǒng)尤其重要。 如果只是操作單個(gè)分區(qū),,因?yàn)閱蝹€(gè)分區(qū)一定只能由一臺(tái)服務(wù)器提供服務(wù),,本質(zhì)上是一個(gè)單機(jī)的事務(wù),OceanBase的實(shí)現(xiàn)機(jī)制和Oracle,、MySQL這樣的傳統(tǒng)數(shù)據(jù)庫(kù)原理類似,,也是多版本并發(fā)控制。不同點(diǎn)在于,,OceanBase做了一些針對(duì)內(nèi)存數(shù)據(jù)庫(kù)的優(yōu)化,,主要有兩點(diǎn):
如果操作多個(gè)分區(qū),,這又分成兩種情況:
OceanBase里面高可用是基于Paxos協(xié)議實(shí)現(xiàn)的,。Google Chubby系統(tǒng)的發(fā)明者說(shuō)過(guò)一句話,這個(gè)世界上所有的高可用強(qiáng)一致的協(xié)議都是Paxos或者Paxos的變種,,我們也認(rèn)為一切不是Paxos協(xié)議實(shí)現(xiàn)的高可用機(jī)制都是耍流氓,。 圖3 OceanBase高可用原理 如圖3,OceanBase最底層的技術(shù)就是通過(guò)Paxos協(xié)議實(shí)現(xiàn)的分布式選舉和多庫(kù)多活,。Paxos協(xié)議的好處在于節(jié)點(diǎn)是多活的,,當(dāng)服務(wù)節(jié)點(diǎn)出現(xiàn)故障時(shí),,其它正常的節(jié)點(diǎn)可以在幾秒內(nèi)替代這個(gè)故障的節(jié)點(diǎn),很快恢復(fù)服務(wù),,而且完全不丟數(shù)據(jù),。Paxos協(xié)議同時(shí)實(shí)現(xiàn)了高可用和強(qiáng)一致,這是很牛的,。當(dāng)然除了最底層核心的Paxos協(xié)議,,OceanBase還會(huì)通過(guò)分布式調(diào)度將同一個(gè)分區(qū)的不同副本調(diào)度多多個(gè)機(jī)房,而不是在一個(gè)機(jī)房或者一個(gè)機(jī)架里面,。當(dāng)服務(wù)器出現(xiàn)故障,,OceanBase客戶端能夠很快自動(dòng)感知到,并把服務(wù)切到?jīng)]有故障的服務(wù)器上,。通過(guò)這一系列組合拳,,OceanBase真正做到了持續(xù)可用。 圖4 高可用:OceanBase VS Oracle 圖4是OceanBase和Oracle的高可用能力對(duì)比,。
接下來(lái)我們看看OceanBase的性能,。長(zhǎng)遠(yuǎn)來(lái)看,,性能取決于底層的引擎如何設(shè)計(jì),而OceanBase的引擎跟傳統(tǒng)數(shù)據(jù)庫(kù)的引擎有較大的差別,。 圖5:兩類數(shù)據(jù)庫(kù)引擎 在互聯(lián)網(wǎng)里面能夠看到各種各樣的存儲(chǔ)系統(tǒng),,引擎非常多,我認(rèn)為基本可以分為兩個(gè)大類,。如圖5,,第一類是傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)引擎。關(guān)系數(shù)據(jù)庫(kù)本質(zhì)上是面向磁盤設(shè)計(jì)的,,它把數(shù)據(jù)分成很多很多的頁(yè)面,,通過(guò)頁(yè)面緩存機(jī)制來(lái)管理頁(yè)面,底層的索引是B 樹(shù),。這種引擎發(fā)展得非常成熟,,但是寫入性能差,原因是關(guān)系數(shù)據(jù)庫(kù)的寫入放大效應(yīng),。用戶數(shù)據(jù)是按行寫入的,,但是關(guān)系數(shù)據(jù)庫(kù)卻是按頁(yè)面管理的,有時(shí)只寫了一行數(shù)據(jù),,卻不得不把整個(gè)頁(yè)面刷入磁盤,。另外一類互聯(lián)網(wǎng)公司流行的引擎是LSM樹(shù)。Google里面有一個(gè)很有名的開(kāi)源系統(tǒng)LevelDB,,F(xiàn)acebook基于它又開(kāi)發(fā)了一個(gè)類似的系統(tǒng)RocksDB,。這種引擎采用基線加增量的設(shè)計(jì),數(shù)據(jù)首先以增量的形式寫入到內(nèi)存中,,當(dāng)增量達(dá)到一個(gè)閥值時(shí)統(tǒng)一寫到磁盤,。這種做法的好處是解決了關(guān)系數(shù)據(jù)庫(kù)寫入放大的問(wèn)題,但是它的合并代價(jià)會(huì)比較大,,可能出現(xiàn)合并速度趕不上內(nèi)存寫入的情況,。 圖6 OceanBase存儲(chǔ)引擎 OceanBase本質(zhì)上是一個(gè)基線加增量的存儲(chǔ)引擎,跟關(guān)系數(shù)據(jù)庫(kù)差別很大,,但是我們借鑒了傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)對(duì)引擎進(jìn)行了優(yōu)化,。如圖6,第一個(gè)優(yōu)化就是合并性能的優(yōu)化,,傳統(tǒng)數(shù)據(jù)庫(kù)把數(shù)據(jù)分成很多頁(yè)面,,我們也借鑒了傳統(tǒng)數(shù)據(jù)庫(kù)的思想,把數(shù)據(jù)分成很多2MB為單位的宏塊,。執(zhí)行合并時(shí),,如果只有一部分?jǐn)?shù)據(jù)修改,,那么,只需要合并那些修改過(guò)的宏塊,,而不是把所有沒(méi)有修改的宏塊也一起合并,。通過(guò)這個(gè)方式,OceanBase的合并代價(jià)相比LevelDB和RocksDB都會(huì)低很多,,這是第一點(diǎn),。第二,我們會(huì)利用OceanBase的分布式機(jī)制做優(yōu)化,。在多機(jī)系統(tǒng)中,,數(shù)據(jù)一定是存在多個(gè)副本。OceanBase實(shí)現(xiàn)了一個(gè)稱為輪轉(zhuǎn)合并的機(jī)制,。當(dāng)主副本提供服務(wù)時(shí),,其它副本可以執(zhí)行合并;等到其它副本合并完成以后,,原來(lái)的主副本接著合并,,并把流量切到已經(jīng)合并完成的副本。通過(guò)這種方式,,OceanBase把正常服務(wù)和合并時(shí)間錯(cuò)開(kāi),,使得合并操作對(duì)正常用戶請(qǐng)求完全沒(méi)有干擾。 由于OceanBase采用基線加增量的設(shè)計(jì),,一部分?jǐn)?shù)據(jù)在基線,,一部分在增量,原理上每次查詢都是既要讀基線,,也要讀增量,。為此,OceanBase做了很多的優(yōu)化,,尤其是針對(duì)單行的優(yōu)化,。OceanBase內(nèi)部把很多小查詢的結(jié)果緩存在內(nèi)存里面,以行為單位,,而不是以塊為單位,。行緩存包括兩個(gè)部分,如果這個(gè)行存在,,緩存這個(gè)行的原始數(shù)據(jù),;否則,緩存布隆過(guò)濾器,。OLTP業(yè)務(wù)大部分操作為小查詢,,通過(guò)小查詢優(yōu)化,OceanBase避免了傳統(tǒng)數(shù)據(jù)庫(kù)解析整個(gè)數(shù)據(jù)塊的開(kāi)銷,達(dá)到了接近內(nèi)存數(shù)據(jù)庫(kù)的性能,。另外,,由于基線是只讀數(shù)據(jù),而且內(nèi)部采用連續(xù)存儲(chǔ)的方式,,OceanBase可以采用比較激進(jìn)的壓縮算法,,既能做到高壓縮比,又不影響查詢性能,,大大降低了成本。 圖7 SQL-VM 多租戶隔離有不同的實(shí)現(xiàn)方式,,這些實(shí)現(xiàn)方式的效果是類似的,。最傳統(tǒng)的實(shí)現(xiàn)方式是虛擬機(jī)。這種方案比較成熟,,在云環(huán)境也經(jīng)常使用,,然而,這種方案比較重量級(jí),,開(kāi)銷比較大,。另外一種最近比較流行的技術(shù)類似Google Cgroup這樣的輕量級(jí)隔離技術(shù),或者一些Cgroup衍生的技術(shù),,比如Docker,。OceanBase的隔離方式很不一樣,我們采用的是在數(shù)據(jù)庫(kù)內(nèi)部做了一個(gè)SQL虛擬機(jī),。 為什么這么做呢,?這種做法在業(yè)內(nèi)也是有例可尋的,例如Oracle 12c以及Azure SQL Server,。它的好處是DB內(nèi)把很多業(yè)務(wù)統(tǒng)一的管理,,會(huì)把整個(gè)管理機(jī)制做得對(duì)用戶特別透明。另外,,隔離的開(kāi)銷比較低,,單臺(tái)服務(wù)器可以服務(wù)更多的租戶,降低云服務(wù)的整體成本,。 圖8 OceanBase多租戶原理 OceanBase是分布式系統(tǒng),,多租戶除了單機(jī)層面怎么做隔離,還涉及到在多機(jī)層面如何做調(diào)度,。如圖8,,在OceanBase中,有的租戶比較小,,位于一臺(tái)服務(wù)器上,,例如租戶B或者租戶C;有的租戶比較大,位于多臺(tái)服務(wù)器上,,例如租戶A,。圖8中的租戶A在每臺(tái)服務(wù)器上有一個(gè)資源容器,限制了該租戶能夠使用的CPU,、網(wǎng)絡(luò),、內(nèi)存、IOPS等系統(tǒng)資源,。OceanBase的負(fù)載均衡分為兩個(gè)層面:第一個(gè)層面是租戶負(fù)載均衡,,它的原理就是把每個(gè)租戶的資源容器分布到很多臺(tái)ObServer上面去;第二個(gè)層面是分區(qū)負(fù)載均衡,,如果租戶只在一臺(tái)服務(wù)器,,第二個(gè)層面是沒(méi)有必要的。如果租戶在多臺(tái)服務(wù)器上,,需要把這個(gè)租戶的分區(qū)均勻地分布到它的資源容器中,。OceanBase內(nèi)部會(huì)盡量使得小租戶只在一臺(tái)服務(wù)器上,避免分布式事務(wù),。當(dāng)租戶需要的資源逐步增加時(shí),,OceanBase也能做到自動(dòng)擴(kuò)展,對(duì)用戶是透明的,。 SQL-VM是OceanBase實(shí)現(xiàn)的資源隔離方案,,分為三個(gè)部分:CPU、IO還有內(nèi)存,,網(wǎng)絡(luò)目前還不是瓶頸,,我們做得比較少。CPU隔離是基于時(shí)間片的主動(dòng)調(diào)度,,跟操作系統(tǒng)的調(diào)度比較類似,。IO隔離我們借鑒了虛擬機(jī)隔離方案,采用基于Deadline和優(yōu)先級(jí)的隔離算法,。這里最大的難點(diǎn)在于既要把資源的利用率提高,,又要做到盡可能公平,這兩個(gè)目標(biāo)本身是矛盾的,。內(nèi)存隔離基本上是兩個(gè)機(jī)制,,一個(gè)機(jī)制是怎么做內(nèi)存的限制,另外一個(gè)機(jī)制是怎么做公平擠占算法,。 分布式查詢用戶的請(qǐng)求首先會(huì)發(fā)送到一臺(tái)稱為ObProxy的代理服務(wù)器,,它的功能就是一個(gè)透明轉(zhuǎn)發(fā)的代理服務(wù)。ObProxy會(huì)解析SQL,,識(shí)別SQL操作哪個(gè)分區(qū),,然后把該SQL轉(zhuǎn)發(fā)到它所操作的分區(qū)所在的服務(wù)器,。 圖9 ObProxy原理 如圖9,可以看到,,如果SQL請(qǐng)求操作分區(qū)P2,,ObProxy就會(huì)轉(zhuǎn)發(fā)到左邊的服務(wù)器;如果涉及到多個(gè)分區(qū),,例如同時(shí)操作P1,、P4,由于它們位于不同的服務(wù)器,,ObProxy就會(huì)隨機(jī)或者根據(jù)負(fù)載選擇一臺(tái)服務(wù)器,。 ObProxy最大的亮點(diǎn)還是在于它的性能。世面上有很多數(shù)據(jù)庫(kù)代理服務(wù)方案,,ObProxy的性能是其中的佼佼者,。我們實(shí)現(xiàn)了大量的優(yōu)化技術(shù),包括:
除了性能卓越之外,,ObProxy還實(shí)現(xiàn)了在實(shí)際生產(chǎn)系統(tǒng)非常關(guān)鍵的運(yùn)維特性。第一個(gè)運(yùn)維特性是熱升級(jí),,ObProxy的升級(jí)對(duì)使用者是無(wú)感知的,。升級(jí)過(guò)程中,ObProxy內(nèi)部會(huì)有兩個(gè)版本,,新的請(qǐng)求會(huì)由新的版本提供服務(wù),,老的請(qǐng)求由老的版本提供服務(wù),過(guò)了很長(zhǎng)時(shí)間才會(huì)把老版本退出,。另外一個(gè)運(yùn)維特性是全鏈路監(jiān)控,,ObProxy作為用戶使用OceanBase的入口,,和服務(wù)端一起聯(lián)合實(shí)現(xiàn)了全鏈路監(jiān)控功能。 當(dāng)SQL請(qǐng)求到了ObServer服務(wù)端,,經(jīng)過(guò)SQL解析,、重寫、優(yōu)化等一系列過(guò)程后,,再由SQL執(zhí)行器來(lái)負(fù)責(zé)執(zhí)行,。分為三種情況:
經(jīng)驗(yàn)&思考第一點(diǎn)關(guān)于高可用,。首先,,我認(rèn)為強(qiáng)一致加高可用是未來(lái)云數(shù)據(jù)庫(kù)的標(biāo)配。我們以前做應(yīng)用架構(gòu)和存儲(chǔ)選型的時(shí)候會(huì)談很多東西,,比如數(shù)據(jù)庫(kù)異步復(fù)制提高性能,,或者CAP理論導(dǎo)致一致性和高可用不可兼得,,等等。然而,,通過(guò)OceanBase的實(shí)踐我們也已經(jīng)得出一個(gè)結(jié)論,,實(shí)現(xiàn)強(qiáng)一致相比實(shí)現(xiàn)弱一致性能開(kāi)銷不是那么大,性能的損耗比較低,,而且可以獲得非常多的好處,,這一定是以后的趨勢(shì)。另外,,實(shí)現(xiàn)云數(shù)據(jù)庫(kù)級(jí)別的高可用底層一定要用Paxos協(xié)議,,回避該協(xié)議的實(shí)現(xiàn)方案本質(zhì)上都是耍流氓。目前我們已經(jīng)從各大互聯(lián)網(wǎng)公司,,包括Google,、Amazon以及Alibaba的云數(shù)據(jù)庫(kù)實(shí)踐看到了這一趨勢(shì)。 第二點(diǎn)關(guān)于自動(dòng)化,。以前傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)規(guī)模往往比較小,,只有少數(shù)幾臺(tái)機(jī)器,有一個(gè)DBA運(yùn)維就夠了,。然而,,在云數(shù)據(jù)庫(kù)時(shí)代,一定要做規(guī)?;\(yùn)維,,一個(gè)DBA對(duì)幾千甚至上萬(wàn)機(jī)器,,達(dá)到這個(gè)量級(jí)一定要做自動(dòng)化,。強(qiáng)一致是自動(dòng)化的前提,沒(méi)有強(qiáng)一致很難自動(dòng)化,,主庫(kù)故障備庫(kù)會(huì)丟數(shù)據(jù),,自動(dòng)化是很難的。雖然每次宕機(jī)概率很低,,但是規(guī)模上來(lái)概率就高了,。 另外云數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候也會(huì)有很多不一樣的考慮,盡可能地減少人工干預(yù),。例如數(shù)據(jù)庫(kù)配置項(xiàng),,或者比較流行的SQL Hint,在云數(shù)據(jù)庫(kù)時(shí)代一定需要盡可能減少,。系統(tǒng)設(shè)計(jì)者需要在服務(wù)端自己消化,,不要把靈活性留給運(yùn)維的人員,因?yàn)檫\(yùn)維的人要做的就是規(guī)?;\(yùn)維,。 最后一點(diǎn)關(guān)于成本,。成本是云的關(guān)鍵,很多用戶上云就是為了節(jié)省成本,。首先,,性能不等于成本。性能雖然很重要,,但是成本需要考慮更多的因素,,性能、壓縮比,、利用率,、規(guī)模化運(yùn)維,,等等,。以利用率為例,云數(shù)據(jù)庫(kù)的一個(gè)成本節(jié)省利器就是提高機(jī)器利用率,。在云數(shù)據(jù)庫(kù)中,,可以通過(guò)分布式方案把整個(gè)利用率提高來(lái),即使單機(jī)性能類似,,但是利用率提上來(lái)以后,,成本會(huì)特別的低。 最后是OceanBase的存儲(chǔ)引擎跟傳統(tǒng)數(shù)據(jù)庫(kù)有很大的區(qū)別,,是基線加增量引擎,,這種引擎有特別多的好處,能夠比較完美地解決OLTP和OLAP業(yè)務(wù)融合的問(wèn)題,。如果實(shí)現(xiàn)得當(dāng),,把這種引擎的缺陷規(guī)避地比較好,能夠收獲大量的好處,,相信也是未來(lái)的趨勢(shì),。 |
|
來(lái)自: 隱者黑鷹88 > 《網(wǎng)站服務(wù)》