十多年的數(shù)據(jù)庫(kù)行業(yè)從業(yè)人員,曾先后在神舟軟件公司、神舟通用公司從事國(guó)產(chǎn)數(shù)據(jù)庫(kù)研發(fā)和推廣工作,作為核心成員參與多個(gè)國(guó)家級(jí)數(shù)據(jù)庫(kù)項(xiàng)目。2014年加入螞蟻金服OceanBase團(tuán)隊(duì),負(fù)責(zé)SQL引擎開發(fā)。 本文熱度:★★★★★ 味道:草莓冰激淋 深度閱讀前,中生代君邀您先思考以下問(wèn)題: · OceanBase與傳統(tǒng)的數(shù)據(jù)庫(kù)有哪些不同? · 如何解決高可用問(wèn)題? · 擴(kuò)展性如何保證? 各位關(guān)心OceanBase數(shù)據(jù)庫(kù)的同學(xué),大家好!我是OceanBase團(tuán)隊(duì)的蔣志勇。借DBAplus社群直播平臺(tái),和大家聊一聊近八年來(lái)OceanBase的發(fā)展以及關(guān)鍵特性。 一、發(fā)展歷程 OceanBase數(shù)據(jù)庫(kù)是阿里巴巴和螞蟻金服完全自主研發(fā)的金融級(jí)分布式關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),和基于開源數(shù)據(jù)庫(kù)產(chǎn)品進(jìn)行改造的解決方案不同的是:OceanBase內(nèi)核100多萬(wàn)行代碼都是我們的同學(xué)一行行寫出來(lái)的,所以我們對(duì)其有完全的掌控力,這一點(diǎn)對(duì)OceanBase的持續(xù)發(fā)展以及獲得更廣泛的應(yīng)用有著十分重要的意義。 從2010年立項(xiàng)開始算起的八年時(shí)間里,OceanBase版本號(hào)也從0.1版本升到即將推出的2.0版本。從最初的Key-Value存儲(chǔ)系統(tǒng)發(fā)展到現(xiàn)在功能齊備的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。整個(gè)過(guò)程中,我們始終不變的初心就是服務(wù)業(yè)務(wù),解決業(yè)務(wù)實(shí)際問(wèn)題,不斷增強(qiáng)產(chǎn)品能力,然后更好地服務(wù)業(yè)務(wù)。 遵循“解決問(wèn)題→發(fā)展產(chǎn)品→解決更大的問(wèn)題→鍛煉出更好的產(chǎn)品”這個(gè)循環(huán):
OceanBase從立項(xiàng)開始,目標(biāo)之一就是在不可靠的硬件上提供可靠的關(guān)系數(shù)據(jù)庫(kù)服務(wù)。我們誕生于高速發(fā)展的互聯(lián)網(wǎng)行業(yè),高端存儲(chǔ)和專用服務(wù)器的訂貨周期太長(zhǎng),供應(yīng)也很受限。能方便獲取的硬件只有普通PC服務(wù)器,所以O(shè)ceanBase只能依靠分布式架構(gòu),用軟件的手段,在不可靠的硬件環(huán)境中實(shí)現(xiàn)金融級(jí)可靠性及數(shù)據(jù)一致性。 經(jīng)過(guò)八年多的實(shí)踐,從淘寶的收藏夾業(yè)務(wù)走到今天支撐支付寶所有核心業(yè)務(wù),并且在每年的“雙十一”持續(xù)地創(chuàng)造交易數(shù)據(jù)庫(kù)峰值處理能力的世界紀(jì)錄。在去年“雙十一”大促中支撐了支付寶全部的核心業(yè)務(wù)(含交易、支付、會(huì)員、賬務(wù)),峰值處理請(qǐng)求數(shù)達(dá)到4200萬(wàn)次每秒。 二、關(guān)鍵特性的逐步實(shí)現(xiàn) 從特性上說(shuō),OceanBase具備線性擴(kuò)展、高可用、高性能、低成本,以及和主流關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品高度兼容等特點(diǎn)。 從1.0版本開始,OceanBase架構(gòu)就進(jìn)化成為全對(duì)等節(jié)點(diǎn),無(wú)共享存儲(chǔ)方式。這個(gè)架構(gòu)特點(diǎn)消除了單點(diǎn),每個(gè)節(jié)點(diǎn)都具有完備處理能力,能夠管理本節(jié)點(diǎn)上的數(shù)據(jù)。在節(jié)點(diǎn)角色上,有幾個(gè)節(jié)點(diǎn)(root service)負(fù)責(zé)管理集群拓?fù)浣Y(jié)構(gòu)等全局信息,相對(duì)特殊一點(diǎn),但每個(gè)節(jié)點(diǎn)都具備承擔(dān)這個(gè)角色的能力,如果當(dāng)前承擔(dān)該角色的節(jié)點(diǎn)發(fā)生故障,集群會(huì)自動(dòng)選舉出新的節(jié)點(diǎn)承擔(dān)這個(gè)角色。 此外,為了高可用,集群節(jié)點(diǎn)分布在多個(gè)不同的可用區(qū),可以是同城不同機(jī)房,或者異地多個(gè)機(jī)房;一份數(shù)據(jù)在多個(gè)可用區(qū)里有副本,副本個(gè)數(shù)通常是奇數(shù)個(gè)。在螞蟻金服的實(shí)踐中,通常是3個(gè)或者5個(gè),少數(shù)副本故障不影響系統(tǒng)可用性。 百萬(wàn)級(jí)QPS前端代理 在OceanBase集群之上,我們提供一個(gè)反向代理OBProxy。看到這個(gè),大家可能會(huì)聯(lián)想到基于中間件構(gòu)建的MySQL集群,但這兩者是有本質(zhì)區(qū)別的:簡(jiǎn)單地說(shuō),沒有OBProxy,OceanBase集群一樣能夠工作,具備完整處理能力。 那我們?yōu)槭裁匆蠴BProxy呢?主要出于兩方面的考慮:
分布式架構(gòu)對(duì)業(yè)務(wù)透明 對(duì)業(yè)務(wù)來(lái)說(shuō),OceanBase分布式架構(gòu)能做到的最好狀態(tài)是什么呢?我認(rèn)為是對(duì)業(yè)務(wù)透明。通過(guò)分布式架構(gòu),我們做到高可用、做到可擴(kuò)展,但是對(duì)業(yè)務(wù)系統(tǒng),要做到透明,表現(xiàn)為一個(gè)單節(jié)點(diǎn)數(shù)據(jù)庫(kù),體現(xiàn)在如下幾點(diǎn):
在滿足業(yè)務(wù)高速發(fā)展的過(guò)程中,OceanBase數(shù)據(jù)庫(kù)要解決的首要問(wèn)題就是擴(kuò)展性問(wèn)題。 通過(guò)全對(duì)等節(jié)點(diǎn)架構(gòu),我們消除了之前版本單點(diǎn)寫入瓶頸。業(yè)務(wù)對(duì)數(shù)據(jù)庫(kù)的要求是不停服務(wù),永遠(yuǎn)在線,為此所有的操作都要是在線的。傳統(tǒng)的垂直擴(kuò)展的方式不行了,只能采用水平擴(kuò)容的方式。這從方法上看也很直觀,怎么做呢?分三步走: 在集群中增加節(jié)點(diǎn)→讓新節(jié)點(diǎn)具備服務(wù)能力→將一部分負(fù)載分發(fā)到新節(jié)點(diǎn)上 看起來(lái),似乎和將大象裝進(jìn)冰箱一樣,步驟明確。但每一步都不是那么好做的。 因?yàn)镺ceanBase是無(wú)共享存儲(chǔ)的,要想新增加的節(jié)點(diǎn)能夠分擔(dān)負(fù)載,新節(jié)點(diǎn)上先要有數(shù)據(jù)。最難的是此過(guò)程中既要保證數(shù)據(jù)一致性,又要不影響業(yè)務(wù)。無(wú)論是機(jī)房擴(kuò)容(機(jī)房?jī)?nèi)新增機(jī)器)還是擴(kuò)展到新機(jī)房(很有可能是異地或公有云場(chǎng)景),我們都必須做到在線。在OceanBase的實(shí)現(xiàn)中,主要依賴如下幾點(diǎn):
擴(kuò)容是在線的,縮容也是如此。 高可用是OceanBase數(shù)據(jù)庫(kù)安身立命的根本,以下三篇文章對(duì)此進(jìn)行了詳細(xì)的描述: 它們包括了“OceanBase和傳統(tǒng)數(shù)據(jù)庫(kù)的差異,以及,在選舉協(xié)議上為什么我們選擇Paxos協(xié)議而不是更容易理解的Raft協(xié)議?”等內(nèi)容。在這里簡(jiǎn)短總結(jié)如下:
除了異常情況下的可用性,系統(tǒng)升級(jí)、DDL變更等計(jì)劃中的操作也不能影響系統(tǒng)可用性。我們通過(guò)逐個(gè)Zone升級(jí)的方式,實(shí)現(xiàn)升級(jí)過(guò)程的可灰度、可回滾;同時(shí)通過(guò)多個(gè)Zone之間的數(shù)據(jù)一致性校驗(yàn)來(lái)驗(yàn)證新升級(jí)系統(tǒng)的正確性。 通過(guò)實(shí)現(xiàn)多版本的數(shù)據(jù)庫(kù)對(duì)象定義,我們實(shí)現(xiàn)了DDL操作和查詢、更新操作互相不等待。針對(duì)多版本的數(shù)據(jù)庫(kù)對(duì)象定義,多補(bǔ)充一句,DDL操作對(duì)數(shù)據(jù)庫(kù)對(duì)象的影響保證能被對(duì)于同一個(gè)用戶Session后續(xù)的操作看到,哪怕這個(gè)用戶Session對(duì)應(yīng)的是OBProxy到集群不同服務(wù)器的多個(gè)Session。 高性能不僅僅意味著服務(wù)能力強(qiáng),也意味著成本降低,在相同硬件條件下可以支撐規(guī)模更大的業(yè)務(wù)。OceanBase通過(guò)讀寫分離架構(gòu)(LSM tree),將更新暫存在內(nèi)存中,并且在內(nèi)存中維護(hù)兩種類型的索引:Hash索引和B+樹索引,分別用來(lái)加速主鍵查詢和索引范圍查詢,達(dá)到準(zhǔn)內(nèi)存數(shù)據(jù)庫(kù)的性能。 和傳統(tǒng)數(shù)據(jù)庫(kù)不同的是:更新操作不是原地進(jìn)行的,沒有傳統(tǒng)數(shù)據(jù)庫(kù)的寫入放大問(wèn)題,對(duì)于一般規(guī)模的系統(tǒng),內(nèi)存可以放下一天的增量。在系統(tǒng)高負(fù)載運(yùn)行的時(shí)候,幾乎沒有數(shù)據(jù)文件寫,這會(huì)大大減少IO;在系統(tǒng)負(fù)載輕的時(shí)候,將內(nèi)存增量批量合并到持久化存儲(chǔ)上。 除了讀寫分離架構(gòu)帶來(lái)的性能提升外,我們?cè)谡麄€(gè)執(zhí)行鏈路上做了不少優(yōu)化,主要包括如下幾類:
除上述情況以外,我們還做了很多細(xì)致的工作。整體來(lái)看效果非常明顯:2017年“雙十一”峰值4200萬(wàn)次操作每秒,用戶體驗(yàn)相當(dāng)順滑,系統(tǒng)表現(xiàn)很平穩(wěn)。 OceanBase一方面需要滿足業(yè)務(wù)對(duì)數(shù)據(jù)庫(kù)的要求,另一方面也要節(jié)約成本,不僅僅是運(yùn)營(yíng)成本,還包括業(yè)務(wù)遷移和人員學(xué)習(xí)成本。 OceanBase的成本優(yōu)勢(shì)主要來(lái)自以下三點(diǎn):
以上的幾個(gè)特點(diǎn)使得OceanBase具有競(jìng)爭(zhēng)優(yōu)勢(shì),但要將業(yè)務(wù)真正從原系統(tǒng)遷移到OceanBase還需要一個(gè)額外的特性——兼容性。高兼容性使得系統(tǒng)遷移能在可控的成本下進(jìn)行。 對(duì)公司內(nèi)部MySQL業(yè)務(wù),OceanBase能做到業(yè)務(wù)零修改遷移??梢赃@么說(shuō),主流關(guān)系數(shù)據(jù)庫(kù)具備的常用功能OceanBase都具備了。不僅是在語(yǔ)法層面,而且是在用戶體驗(yàn)和業(yè)務(wù)體驗(yàn)上完全一致。 從2017年開始,OceanBase開始服務(wù)外部客戶,我們發(fā)現(xiàn)兼容性做得還不夠,還需要再上一層樓:不僅常用功能要兼容,更要全面兼容;不僅是要兼容MySQL,還要兼容商業(yè)數(shù)據(jù)庫(kù)。只有這樣,才能使得外部業(yè)務(wù)具備零修改遷移OceanBase的可能性。這些工作正是我們目前在做的。 三、未來(lái)展望 接下來(lái),OceanBase 2.0版本即將發(fā)布,屆時(shí)也會(huì)在DBAplus社群進(jìn)行新特性的技術(shù)分享。這個(gè)全新的版本在分布式能力和SQL功能上相對(duì)于1.X版本都有質(zhì)的提升,我們也真誠(chéng)希望,OceanBase 2.0能夠讓分布式架構(gòu)對(duì)業(yè)務(wù)透明、讓業(yè)務(wù)更方便地獲得更好的數(shù)據(jù)庫(kù)服務(wù)。 Q1:請(qǐng)問(wèn)OceanBase支持多表Join、分組、窗口函數(shù)等復(fù)雜查詢嗎? 答:支持。 Q2:Paxos是保證多副本一致性嗎? 答:是的。 Q3:OceanBase查詢優(yōu)化器和Oracle相比如何?有沒有像Oracle執(zhí)行計(jì)劃變更造成SQL性能下降的問(wèn)題? 答:優(yōu)化器相對(duì)于Oracle還有差距,也需要解決穩(wěn)定性問(wèn)題。 Q4:是每個(gè)Zone上的數(shù)據(jù)是不同的、每個(gè)Zone上有三副本么? 答:通常每個(gè)Zone數(shù)據(jù)是相同的,一份數(shù)據(jù)在各個(gè)Zone都有一個(gè)副本。 Q5:OceanBase多副本,副本間如何高效同步,又如何保持從多副本讀寫效率的高效呢? 答:對(duì)于強(qiáng)一致讀,只能讀主。 Q6:DDL如何實(shí)現(xiàn)在線? 答:多版本Schema。 Q7:如果查詢?cè)O(shè)計(jì)多個(gè)表,而所分配的MergeServer緩存的子表信息不全,是否需要通過(guò)請(qǐng)求多個(gè)MergeServer共同完成? 答:在1.0以后,沒有MergeServer了,都是全對(duì)等節(jié)點(diǎn)。涉及多個(gè)節(jié)點(diǎn)的查詢會(huì)生成分布式計(jì)劃。 Q8:跨區(qū)域的數(shù)據(jù)是實(shí)時(shí)同步嗎? 答:取決于副本的分布和網(wǎng)絡(luò)延遲。 Q9:請(qǐng)問(wèn)阿里在雙十一這種活動(dòng)場(chǎng)景下,對(duì)超熱點(diǎn)數(shù)據(jù)有什么特別的優(yōu)化?比其他主流數(shù)據(jù)庫(kù)的性能如何呢? 答:比如說(shuō)提前解行鎖,性能能滿足大促要求。 Q10:如果在獲取ChunkServer數(shù)據(jù)的過(guò)程中MergeServer掛了怎么辦? 答:現(xiàn)在沒這些角色區(qū)分了,如果節(jié)點(diǎn)故障,會(huì)重試。 Q11:OceanBase你說(shuō)的Zone是Shard分片的意思么? 答:Zone是可用區(qū)的意思,你可以理解成一個(gè)子集群。 Q12:OceanBase是否對(duì)OLAP和OLTP系統(tǒng)是否由用戶選擇不同的存儲(chǔ)引擎,還是同一個(gè)引擎支持? 答:一種存儲(chǔ)引擎。 Q13:OceanBase沒有Shard的功能對(duì)么?那么提供高可用、城市級(jí)容災(zāi)、在線擴(kuò)容,記得你說(shuō)數(shù)據(jù)可能不在同一個(gè)節(jié)點(diǎn),那就是數(shù)據(jù)分片了嗎? 答:數(shù)據(jù)是分片的,分片的規(guī)則由用戶來(lái)定,類似于Oracle的分區(qū)。 Q14:多副本下怎么保證每次讀取的是最新或是滿足一致性的數(shù)據(jù)?讀取也走一次Paxos Instance? 答:強(qiáng)一致性讀只讀主副本。 Q15:多副本之間是如何復(fù)制的?物理日志?邏輯日志?還是其他方法? 答:物理日志。 |
|
|
來(lái)自: xujin3 > 《高可用高并發(fā)高性能》