阿里云自研新一代企业云数据库POLARDB背后的技术
從2008年到2018年,阿里巴巴的數(shù)據(jù)庫技術(shù)已經(jīng)發(fā)展了10年的時(shí)間,10年的時(shí)間從AliSQL到RDS,再到自研POLARDB,阿里巴巴數(shù)據(jù)庫技術(shù)得到了極大的提升。那么在阿里云自研新一代企業(yè)云數(shù)據(jù)庫POLARDB背后有哪些技術(shù)呢?本文中,阿里云數(shù)據(jù)庫事業(yè)部總經(jīng)理鳴嵩就為大家進(jìn)行分享。?
阿里巴巴數(shù)據(jù)庫發(fā)展的十年歷程
首先介紹一下阿里巴巴數(shù)據(jù)庫發(fā)展的十年歷程。阿里巴巴數(shù)據(jù)庫技術(shù)發(fā)展源于2008年所做的去“IOE“這件事情。之前阿里巴巴所使用的是商用數(shù)據(jù)庫比如Oracle,阿里巴巴之所以要做“去O”是因?yàn)轳R老師看了財(cái)務(wù)報(bào)表之后發(fā)現(xiàn)如果繼續(xù)使用Oracle等商用數(shù)據(jù)庫,阿里巴巴的盈利就會(huì)補(bǔ)不上數(shù)據(jù)庫的費(fèi)用。于是,從2008年開始進(jìn)行“去O”,當(dāng)時(shí)使用的是MySQL開源分支上自建的一個(gè)分支——AliSQL,在其上放了電商場景中的像秒殺之類的各種補(bǔ)丁。基于AliSQL數(shù)據(jù)庫內(nèi)核,阿里巴巴在2011年開始研發(fā)云RDS產(chǎn)品,最開始只有MySQL服務(wù),后來增加了SQL Server等數(shù)據(jù)庫服務(wù)。在2018年,阿里云數(shù)據(jù)庫團(tuán)隊(duì)推出了自研的POLARDB數(shù)據(jù)庫產(chǎn)品,POLARDB在2014年開始研發(fā),2017年在北京宣布開始公測,在2018年4月份正式商業(yè)化。與此同時(shí)RDS數(shù)據(jù)庫實(shí)例數(shù)正式突破20萬,占國內(nèi)云數(shù)據(jù)庫市場份額的50%。
因?yàn)榘⒗镌芌DS具有20萬數(shù)據(jù)庫實(shí)例,在服務(wù)這個(gè)20萬實(shí)例以及背后的8萬客戶的過程中,阿里云也發(fā)現(xiàn)了用戶使用數(shù)據(jù)庫過程中的痛點(diǎn)和需求。因此,阿里云設(shè)計(jì)了POLARDB下一代數(shù)據(jù)庫產(chǎn)品來解決用戶的這些痛點(diǎn)和需求。用戶的痛點(diǎn)一部分和數(shù)據(jù)庫的能力和容量有關(guān),比如數(shù)據(jù)庫在單機(jī)上最大規(guī)模是3T,這還是因?yàn)橐慌_(tái)機(jī)器所能插下的SSD盤有限,當(dāng)用戶的數(shù)據(jù)存儲(chǔ)量超過3T,那么用戶就需要自己做分布式以及分庫分表這些事情,這使得用戶開發(fā)的要求大大提高。過去的MySQL寫性能大概是2萬TPS,而這樣的性能對于很多用戶而言是不夠的,那么如何使一臺(tái)數(shù)據(jù)庫擁有更多的寫入吞吐和讀吞吐成為了需要解決的問題。此外還有并發(fā)的問題,因?yàn)橛脩粼谠粕峡赡苡袔装賯€(gè)ECS客戶端共同訪問一個(gè)數(shù)據(jù)庫,那么如何解決這種幾百個(gè)并發(fā)之下的數(shù)據(jù)庫性能也是一個(gè)問題。
此外,主從復(fù)制也是一個(gè)問題,在云上需要兩個(gè)實(shí)例做主從復(fù)制,但是基于Binlog的主從復(fù)制卻帶來了很多問題,比如DDL同步時(shí)間過長,主從復(fù)制中斷會(huì)造成數(shù)據(jù)不一致。第三大類問題與備份相關(guān),當(dāng)數(shù)據(jù)庫的容量達(dá)到一定程度,備份就成為一個(gè)難題,因?yàn)閷τ趬K進(jìn)行備份需要進(jìn)行上鎖然后拷貝出來,這樣的過程非常慢。復(fù)雜SQL,用戶數(shù)據(jù)量增大之后,一些報(bào)表的需求就會(huì)需要執(zhí)行很長時(shí)間,而希望這樣的復(fù)雜SQL變成分鐘級(jí)的操作。
而今天,阿里云是帶著用戶對于數(shù)據(jù)庫的需求來設(shè)計(jì)下一代數(shù)據(jù)庫POLARDB的。POLARDB是阿里云新一代企業(yè)級(jí)云原生關(guān)系型數(shù)據(jù)庫,100%兼容MySQL協(xié)議,最大容量可以達(dá)到100T。其彈性擴(kuò)展能力非常強(qiáng),可以從10G擴(kuò)展到100T,可以從4核擴(kuò)展到60核,可以從1個(gè)節(jié)點(diǎn)擴(kuò)展到16個(gè)節(jié)點(diǎn),是一個(gè)擴(kuò)展性非常強(qiáng)的數(shù)據(jù)庫集群。
POLARDB的架構(gòu)設(shè)計(jì)
POLARDB整體架構(gòu)可以分為四層,第一層是POLAR Proxy層,這一層解決的問題就是POLARDB是一寫多讀的數(shù)據(jù)庫,最多可以達(dá)到16個(gè)節(jié)點(diǎn),但是讓用戶去管理16個(gè)節(jié)點(diǎn)就變得非常復(fù)雜了。POLAR Proxy層就是讓用戶只看到一個(gè)endpoint,只看到一個(gè)VIP去訪問數(shù)據(jù)庫。讀寫分離等都可以在這一層實(shí)現(xiàn)。第二層就是關(guān)系數(shù)據(jù)庫引擎層,第三層和第四層就是存儲(chǔ)層,第三層是文件系統(tǒng),第四層是存儲(chǔ)擴(kuò)展能力。
接下來將會(huì)自底向上介紹POLARDB的設(shè)計(jì),最底下是分布式存儲(chǔ)和文件系統(tǒng)層,這一層是為了解決容量問題。因?yàn)閱螜C(jī)容量有限,但是如果想要實(shí)現(xiàn)100T的數(shù)據(jù)庫就必須將數(shù)據(jù)存儲(chǔ)到多臺(tái)機(jī)器上面,這就是為什么需要分布式存儲(chǔ)層的原因。數(shù)據(jù)庫不僅僅使用存儲(chǔ),還需要使用文件,因此在存儲(chǔ)層之上還需要構(gòu)建一層文件系統(tǒng)。在存儲(chǔ)層里面,數(shù)據(jù)使用了三副本,提升了數(shù)據(jù)的可靠性和可用性。在存儲(chǔ)層還是用了新的硬件,這使得優(yōu)勢更加明顯,使得數(shù)據(jù)庫性能能夠?qū)崿F(xiàn)數(shù)量級(jí)上的提升。軟件方面也做了操作系統(tǒng)、用戶態(tài)文件系統(tǒng)以及用戶態(tài)網(wǎng)絡(luò)協(xié)議棧等優(yōu)化。
分布式存儲(chǔ)層使得容量最高可以擴(kuò)展到100TB,可以使數(shù)據(jù)庫文件分布在幾十臺(tái)機(jī)器里面,可以用這些機(jī)器的SSD來存儲(chǔ)數(shù)據(jù)和提高I/O吞吐。其次,共享存儲(chǔ)實(shí)現(xiàn)了Serverless計(jì)費(fèi)。之前購買數(shù)據(jù)庫時(shí)就需要預(yù)定存儲(chǔ)容量,但是在POLARDB上,因?yàn)榇鎯?chǔ)時(shí)分布式的,因此可以做到存儲(chǔ)按照使用付費(fèi),幫助用戶節(jié)省了存儲(chǔ)開銷。實(shí)現(xiàn)了無鎖備份,之前的數(shù)據(jù)庫備份是邏輯備份,有可能鎖表也有可能鎖頁,所以性能很慢。而POLARDB是在存儲(chǔ)層實(shí)現(xiàn)快照備份,在決定備份的時(shí)候直接生成一個(gè)只讀快照,一分鐘之內(nèi)就實(shí)現(xiàn)了百T數(shù)據(jù)庫的備份。
數(shù)據(jù)庫引擎層所實(shí)現(xiàn)的核心功能是基于一份存儲(chǔ)實(shí)現(xiàn)多節(jié)點(diǎn)掛載的,一寫多讀能力。這里介紹一下“一寫多讀”,大家都知道讀寫分離技術(shù),其是說數(shù)據(jù)庫主實(shí)例負(fù)責(zé)寫,為了線性擴(kuò)展讀能力只能在主實(shí)例上掛載多個(gè)只讀實(shí)例,通過將讀邏輯復(fù)制到只讀實(shí)例中,在只讀實(shí)例中提升寫性能,只讀實(shí)例越多,整個(gè)集群的讀能力就越強(qiáng),其缺點(diǎn)是每個(gè)只讀實(shí)例都需要一個(gè)存儲(chǔ)副本,實(shí)例之間通過Binlog復(fù)制實(shí)現(xiàn)數(shù)據(jù)拷貝。而在POLARDB中實(shí)現(xiàn)了突破,在主實(shí)例和多個(gè)讀實(shí)例之間共享一份存儲(chǔ),這就意味著存儲(chǔ)成本大大降低,并且只讀實(shí)例越多,節(jié)省的成本就越多。此外,還使得只讀實(shí)例的節(jié)點(diǎn)擴(kuò)充變得更快,因?yàn)樵谏芍蛔x實(shí)例的時(shí)候不需要進(jìn)行數(shù)據(jù)拷貝,也就是通過技術(shù)帶來了極速的彈性擴(kuò)展能力。
接下來介紹如何實(shí)現(xiàn)多個(gè)節(jié)點(diǎn)共享一份數(shù)據(jù)庫存儲(chǔ),其實(shí)類似的技術(shù)在全球也沒有幾家公司擁有。首先回顧一下數(shù)據(jù)庫原理,假設(shè)原本有5個(gè)事務(wù)在執(zhí)行,他們是T1~T5,他們在提交的時(shí)候會(huì)同步地寫,代表事務(wù)的提交。但是之后更新到內(nèi)存中后并不會(huì)立刻刷新到磁盤文件中,也就是說數(shù)據(jù)文件的更新是異步的。在POLARDB中,由于刷新數(shù)據(jù)文件是異步的,因此在共享存儲(chǔ)中僅刷新了T1的狀態(tài),其他的事務(wù)仍然存在于主實(shí)例的Buffer Pool里面。
只讀實(shí)例會(huì)不斷地從磁盤中拉取RedoLog,將狀態(tài)不停地拉到內(nèi)存當(dāng)中去,將事務(wù)保存到內(nèi)存的Hash表中去,這時(shí)候如果有請求下來,如果命中Buffer Pool就讀取,否則會(huì)到磁盤中讀取較老的數(shù)據(jù)文件中的版本號(hào),然后與內(nèi)存表中的狀態(tài)合并之后放到Buffer Pool并返回給用戶。簡單而言,只讀實(shí)例通過讀取共享存儲(chǔ)中的Redo文件在內(nèi)存中維護(hù)一個(gè)數(shù)據(jù)庫,這個(gè)內(nèi)存數(shù)據(jù)庫只維護(hù)近期的更新,而又會(huì)從存儲(chǔ)中讀取老數(shù)據(jù),在內(nèi)存中完成實(shí)時(shí)合并,并最終返回給用戶。
前面的過程較為通用,有些邊緣情況是數(shù)據(jù)庫系統(tǒng)所必須考慮的。所謂邊緣情況就是過去5分鐘內(nèi)緩存了RedoLog,這些會(huì)占據(jù)內(nèi)存空間,所以需要定期刪除數(shù)據(jù)。那么這就出現(xiàn)了一個(gè)問題,如果只讀節(jié)點(diǎn)刪除數(shù)據(jù)的頻率過高,就有可能導(dǎo)致部分RedoLog的丟失。為了避免以上情況的發(fā)生,就需要主實(shí)例定期將自己Checkpoint的LSN發(fā)送給所有的只讀實(shí)例,只讀實(shí)例就會(huì)注意不能夠刪除Checkpoint后的任何RedoLog,避免產(chǎn)生數(shù)據(jù)空隙。
第二個(gè)問題就是主庫寫數(shù)據(jù)文件也不能過于頻繁,因?yàn)橹鲙鞂憯?shù)據(jù)過于頻繁,也會(huì)導(dǎo)致只讀庫快照隔離出現(xiàn)問題。為此,從庫需要定期將自己Snapshot的狀態(tài)發(fā)送給主庫,主庫將所有只讀節(jié)點(diǎn)的Snapshot版本取最小作為自己刷臟的閾值,如果某一個(gè)只讀實(shí)例的Snapshot版本太老了就可以將其踢掉。
基于共享存儲(chǔ)實(shí)現(xiàn)“一寫多讀”不僅帶來了只讀實(shí)例的橫向擴(kuò)展能力,此外還大大地減少了在主實(shí)例上執(zhí)行DDL,只讀實(shí)例上執(zhí)行DDL的時(shí)間間隔。今天,POLARDB可以做到僅需要極短的時(shí)間就可以將DDL同步到所有只讀實(shí)例上,主庫在執(zhí)行DDL的同時(shí),共享存儲(chǔ)中的數(shù)據(jù)文件也在不斷地進(jìn)行修改,當(dāng)主庫執(zhí)行完DDL之后,只需要將自己庫的元信息進(jìn)行修改,從庫就立即可見,能達(dá)到低于10毫秒的延遲。
在“一寫多讀”之上就是智能的接入層,也就是Proxy層。因?yàn)镻OLARDB可以有多個(gè)節(jié)點(diǎn),但是只希望用戶看到一個(gè)端口進(jìn)行訪問,這時(shí)候就需要Proxy層發(fā)揮作用了。Proxy層將負(fù)責(zé)負(fù)載均衡、連接管理以及安全管理。通過Proxy層實(shí)現(xiàn)了統(tǒng)一的集群入口,一個(gè)endpoint訪問所有的數(shù)據(jù)節(jié)點(diǎn),并且可以在其上實(shí)現(xiàn)白名單的安全機(jī)制。
POLARDB產(chǎn)品進(jìn)展
最后為大家釋放三個(gè)重磅信息。
首先,從POLARDB 2017年在北京發(fā)布到2018年宣布正式商業(yè)化,經(jīng)過一年的發(fā)展時(shí)間,POLARDB的寫入時(shí)間已經(jīng)比AWS速度快2倍,在各個(gè)數(shù)量內(nèi)核的情況下寫入的TPS都是AWS的2倍。
其次,在Proxy層實(shí)現(xiàn)了會(huì)話單調(diào)一致性讀寫分離,這個(gè)功能使得用戶感受不到讀寫分離所帶來的主庫和從庫之間的延遲,使得用戶就像使用一個(gè)數(shù)據(jù)庫一樣地使用POLARDB。
第三個(gè)亮點(diǎn)就是SQL加速,這是POLARDB團(tuán)隊(duì)在過去一年的時(shí)間內(nèi)服務(wù)了200多家企業(yè)用戶后得到的需求。因?yàn)橛脩舻臄?shù)據(jù)庫容量變大了,數(shù)據(jù)表和數(shù)據(jù)量都變大了,也需要查詢變得更快。在這樣的需求的啟發(fā)下,POLARDB就實(shí)現(xiàn)了SQL加速。其原理就是在多個(gè)POLARDB只讀實(shí)例中并發(fā)地加載同一個(gè)Snapshot數(shù)據(jù),在中間層完成MPP運(yùn)算。目前的效果是對于TPC-H和TPC-DS可以完美地支持,對于SQL查詢速度提升了8到14倍,而未來將會(huì)進(jìn)一步加快SQL查詢速度。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的阿里云自研新一代企业云数据库POLARDB背后的技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置管理 ACM 在高可用服务 AHAS
- 下一篇: 深入解读MySQL8.0 新特性 :Cr