云原生演進趨勢下傳統(tǒng)數(shù)據(jù)庫升級實踐
一、概述云原生數(shù)據(jù)庫
(一)云計算是數(shù)字化的基礎(chǔ)設(shè)施
眾所周知,目前云計算已經(jīng)成為數(shù)字化的基礎(chǔ)設(shè)施,整個社會也在數(shù)字化。數(shù)字化滲透進我們的日常生活中,除了衣食住行,還包括教育、醫(yī)療、游戲等。
以醫(yī)療領(lǐng)域為例,早些年去醫(yī)院,不管是驗血還是拍胸片,一定是要去取紙質(zhì)報告,然后打一張塑料的胸片圖。但是最近一兩年,除了三甲醫(yī)院,其他醫(yī)院也基本是通過網(wǎng)上向患者提供無論是報告還是胸片之類的材料,醫(yī)療領(lǐng)域數(shù)字化現(xiàn)象十分明顯。
而這些數(shù)據(jù)全部都數(shù)字化以后,面臨一個非常大的問題,它在哪些平臺承載,怎么樣承載?阿里云是其中非常重要的一個環(huán)節(jié),數(shù)據(jù)庫在數(shù)字化進程中承載了數(shù)據(jù)的生產(chǎn)、集成、實時處理和分析的整套流程。在整個數(shù)據(jù)庫周邊,可能還有硬件、安全、彈性計算等能力,這些大大小小的東西最終組成阿里云這個平臺。
(二)什么是云原生數(shù)據(jù)庫技術(shù)
云計算在重塑數(shù)據(jù)庫技術(shù)與商業(yè)。
在數(shù)字化背景下,我們有許多思考。
數(shù)據(jù)庫跟以前那有什么不一樣呢?什么是所謂的云原生數(shù)據(jù)庫呢?作為使用數(shù)據(jù)庫的開發(fā)者,對數(shù)據(jù)庫的需求有什么變化?如今使用數(shù)據(jù)庫我們一般會提什么樣的訴求?
如今,上層的業(yè)務(wù)變化非常快,包括以前阿里巴巴淘寶內(nèi)部其實也有同樣的問題。業(yè)務(wù)的快速變化讓開發(fā)者面臨一個非常大的挑戰(zhàn),就是要非??焖俚剡m應(yīng)變化。在云普及之前,這個過程其實還是比較慢的,從構(gòu)建服務(wù)器,然后網(wǎng)絡(luò)打好,安裝操作系統(tǒng)和數(shù)據(jù)庫等,整個流程非常長。
對數(shù)據(jù)庫的訴求,總結(jié)起來可能有以下幾個。
第一個就是我們希望更專注在業(yè)務(wù)開發(fā)上,不要把太多時間放在底層的硬件、軟件、機房、網(wǎng)絡(luò)等設(shè)施的配置上。
第二個是開箱即用的,我們希望數(shù)據(jù)庫創(chuàng)建好了可以直接使用,不需要再去做配置、優(yōu)化等非常繁瑣耗時且專業(yè)性強的事情。
第三個是安全可信,把數(shù)據(jù)放在第三方平臺上,安全可信是一個非?;镜囊?。
第四個是開放兼容,我們不希望被哪個云廠商鎖定,希望能非常自由地遷移進來和遷移出去。
第五個是海量擴展,隨著業(yè)務(wù)爆發(fā)式的增長,系統(tǒng)壓力很快就會變成原來的數(shù)倍甚至數(shù)十倍。在這種情況下,如果沒有一個很好的橫向、縱向擴展的數(shù)據(jù)庫系統(tǒng),那么很難支撐業(yè)務(wù)正常運行,處理起來就會非常棘手。
第六個是全球化。中國很多游戲廠商在海外的拓展和推廣做得非常不錯,尤其是在東南亞一帶,另外也有一些游戲在歐美日本獲得了非常大的成功,所以現(xiàn)在有些開發(fā)者也面臨著全球化的訴求,作為數(shù)據(jù)庫的基礎(chǔ)設(shè)施,應(yīng)該思考如何提供全球化的能力。
第七個是持續(xù)可用,我們原來自己做一套數(shù)據(jù)庫系統(tǒng),持續(xù)可用也是核心考慮之一。
除此之外還有可靠性,要求不能發(fā)生數(shù)據(jù)丟失。
最后是低成本,當(dāng)業(yè)務(wù)發(fā)展到比較成熟的階段,我們會關(guān)注低成本。
在這些客戶訴求下,我們思考下一代數(shù)據(jù)庫或者說新的數(shù)據(jù)庫要具備哪些特性,也就是云原生數(shù)據(jù)庫它所具備的產(chǎn)品能力,如下所示。
第一個是全面托管,用戶不再需要去關(guān)注安裝、備份、部署、監(jiān)控、高可用等,可以一鍵創(chuàng)建實例,創(chuàng)建出來的實例具備以上東西。
第二個是按量付費,按量付費可以讓業(yè)務(wù)起步的成本變得非常低,否則機房、硬件、網(wǎng)絡(luò)等一整套設(shè)施配置下來,成本非常高昂。
第三個是按需彈性,它分為兩個方面,一方面是要具備往上彈的能力,當(dāng)業(yè)務(wù)在快速發(fā)展的過程中,數(shù)據(jù)庫也要能夠快速往上彈。另一方面是往下彈,當(dāng)業(yè)務(wù)高峰過去了,需要很快地把資源使用量降下來,達到降低成本的目的。
第四個是生態(tài)兼容,無論用戶目前使用的是MySQL,還是Oracle,或者是其他數(shù)據(jù)庫,我們能遷移進來,也能遷移出去。
上方是我們認為云原生數(shù)據(jù)庫它所具備的產(chǎn)品能力。
在這些產(chǎn)品能力底下,還是有很多的技術(shù)在支持。
六大核心技術(shù)分別是智能化、多模、軟硬件一體化、安全可信、HTAP:大數(shù)據(jù)庫數(shù)據(jù)庫一體化、云原生+分布式。這六大核心技術(shù)支撐了上文的產(chǎn)品能力,解決開發(fā)者訴求。
(三)云原生關(guān)系型數(shù)據(jù)庫 PolarDB
PolarDB是阿里巴巴自研的新一代云原生數(shù)據(jù)庫,在存儲計算分離架構(gòu)下,利用了軟硬件結(jié)合的優(yōu)勢,為用戶提供具備極致彈性、高性能、海量 存儲、安全可靠的數(shù)據(jù)庫服務(wù)。100%兼容MySQL 5.6/5.7/8.0,PostgreSQL 11,高度兼容Oracle。
PolarDB-X為PolarDB分布式版本,融合分布式SQL引擎與分布式自研存儲X-DB,專注解決海量數(shù)據(jù)存儲、超高并發(fā)吞吐、復(fù)雜計算與分析等問題。
(四)云原生關(guān)系型數(shù)據(jù)庫PolarDB產(chǎn)品架構(gòu)
PolarDB產(chǎn)品架構(gòu)圖
PolarDB產(chǎn)品有以下特性:
存儲計算分離
1)分鐘級彈性升降級
2)分鐘級新增/刪除只讀節(jié)點
智能代理轉(zhuǎn)發(fā)
1)實現(xiàn)數(shù)據(jù)庫透明擴容
2)多種一致性級別
3)自定義Endpoint
分布式存儲
1)支持100TB
2)快速備份與恢復(fù)
3)更高單實例IO能力
libpfs+rdma+optane
1)高性能透明實現(xiàn)三副本 RPO=0
2)高性能寫入:實現(xiàn)高并發(fā)的寫入
基于redo復(fù)制
1)只讀實例毫秒級延遲
2)解決binlog/redo雙日志一致性與性能問題
并行執(zhí)行
1)部分場景下的查詢與分析
2)可以自由控制的并行度,保障性能與穩(wěn)定性
這里主要講一個和開發(fā)者使用過程中關(guān)系比較大的特性:智能代理轉(zhuǎn)發(fā)。
在數(shù)據(jù)庫中有一個非常難的點,它跟應(yīng)用服務(wù)器不一樣,當(dāng)應(yīng)用服務(wù)器系統(tǒng)壓力特別大的時候,還是比較容易做擴展的,可以加一組應(yīng)用服務(wù)器,把相關(guān)的流量擴展到新的應(yīng)用服務(wù)器上就可以了。
但數(shù)據(jù)庫通常做不到,因為數(shù)據(jù)在查詢和使用上都是相互關(guān)聯(lián)的,數(shù)據(jù)不能簡單地做拆分。PolarDB在上層有一個智能代理層叫Proxy,它為開發(fā)者解決了這個問題。當(dāng)數(shù)據(jù)庫系統(tǒng)壓力特別大的時候,通過智能代理可以自動把一些查詢的Query分發(fā)到別的只讀節(jié)點上。比如原來是一主一備,可以變成一主三備,就可以把流量自動分發(fā)到三個節(jié)點。
大家可能想,這個不就跟原來數(shù)據(jù)庫加幾個備庫是一樣的道理嗎?
PolarDB通過智能代理解決了一個非常關(guān)鍵的問題,那就是加了這些只讀節(jié)點以后,應(yīng)用服務(wù)器上的連接配置是不需要做任何改動,可以隨時加上去,智能代理收到Query以后會自動轉(zhuǎn)發(fā)過去。
以現(xiàn)實業(yè)務(wù)場景舉例,比如某天前端的業(yè)務(wù)系統(tǒng)告訴我們,明天早上10點要做一個促銷活動,請做好數(shù)據(jù)庫的擴容。
以前如果加了只讀節(jié)點,可能遇到的問題是前端應(yīng)用服務(wù)器根本就訪問不到這個只讀節(jié)點,或者可以訪問到只讀節(jié)點,但要對應(yīng)用服務(wù)器的配置做一些改變,可能導(dǎo)致應(yīng)用要把應(yīng)用服務(wù)器重啟?,F(xiàn)在通過PolarDB的智能代理可以有效解決這個問題,方便快捷地做容量擴展。
二、傳統(tǒng)關(guān)系型數(shù)據(jù)庫向云原生環(huán)境遷移
(一)傳統(tǒng)商業(yè)數(shù)據(jù)庫替換的挑戰(zhàn)
如今,如果要從別的商業(yè)數(shù)據(jù)庫遷移到 PolarDB上,比如從Oracle數(shù)據(jù)庫,一般來說有幾個比較大的挑戰(zhàn)。
第一個挑戰(zhàn)是應(yīng)用耦合度高。通常情況下,數(shù)據(jù)庫跟應(yīng)用的耦合度非常高,如果要對數(shù)據(jù)庫做一個動作的話,應(yīng)用前端的應(yīng)用要配合著一起做,可能會影響前端的可用性,因為通常情況下數(shù)據(jù)庫底下承載的業(yè)務(wù)都是比較關(guān)鍵的,動數(shù)據(jù)庫往往意味著動前端應(yīng)用。
第二個挑戰(zhàn)是穩(wěn)定性要求高。數(shù)據(jù)庫一出問題,前端的業(yè)務(wù)就會出問題,所以數(shù)據(jù)庫的變更和動作經(jīng)常會在晚上執(zhí)行。
第三個挑戰(zhàn)是數(shù)據(jù)量大。由于現(xiàn)在業(yè)務(wù)都比較大,因此核心數(shù)據(jù)庫的數(shù)據(jù)量通常會比較大。
第四個挑戰(zhàn)是語法兼容要求高。雖然大家使用的都是 SQL,但是不同數(shù)據(jù)庫的SQL還是不一樣的。如果從Oracle數(shù)據(jù)庫遷移到PolarDB,SQL要做太多的改造的話,就意味著前端業(yè)務(wù)系統(tǒng)的改造要非常大,情況也很復(fù)雜。
(二)使用云原生數(shù)據(jù)庫PolarDB替換傳統(tǒng)商業(yè)數(shù)據(jù)庫
是一個科學(xué)的標準化、產(chǎn)品化的過程。
遷移流程圖
在阿里云上,我們會提供一套標準化流程和產(chǎn)品幫助用戶從原始數(shù)據(jù)庫移到PolarDB數(shù)據(jù)庫。
首先,我們會給用戶一個工具或者腳本,到用戶的系統(tǒng)里面運行一下,它可以采集到用戶數(shù)據(jù)庫的一些特征,這個特征包括有哪些 SQL、函數(shù)、存儲過程跟目標數(shù)據(jù)庫寫法不匹配,原始的數(shù)據(jù)庫的特點,比如它是一個系統(tǒng)壓力特別大的數(shù)據(jù)庫,還是一個熱點數(shù)據(jù)特別明顯的數(shù)據(jù)庫。探測到這些點后,會告訴用戶在后期的改造中要注意什么問題。
上方表格就是在實際的業(yè)務(wù)過程中通過腳本跑出來的。
通過這個表格,我們可以看到原始數(shù)據(jù)庫如果要遷移到PolarDB的時候,它整體的兼容性還是比較高的。我們一共探測了6029個對象,這個對象可能包括存儲過程、數(shù)據(jù)表、索引序列,還有一些同義詞等相關(guān)的東西,其中不兼容的對象只有兩個,其實是比較少的。報表里會指出具體是哪兩個表,里面也有一些比較具體的修改建議,然后就可以遷移過來了。
下圖是一個比較具體的過程,此處不詳細展開闡述。
目前,阿里云已經(jīng)把這一套標準化、產(chǎn)品化的流程和中國信通院一起做成了數(shù)據(jù)庫遷移的標準指南,開發(fā)者可以到網(wǎng)上查閱,遵照指南做數(shù)據(jù)庫遷移。
三、管理PolarDB O引擎(兼容Oracle語法)
(一)PolarDB提供面向Oracle的全棧兼容性
PolarDB提供的Oracle兼容性是包括多個方面的,除了語法層的兼容,還有物理存儲層、邏輯層和接口層。
(二)管理PolarDB O引擎(兼容Oracle語法):常用工具
如果用戶從Oracle遷移過來,在使用或者管理PolarDB的時候,和原來有哪些不一樣?
在管理工具方面,用戶可以使用阿里云云端的數(shù)據(jù)管理平臺DMS,在控制臺上找到叫登錄數(shù)據(jù)庫的入口,就可以登錄到DMS上,如下所示。
第二個是用開源的數(shù)據(jù)管理平臺叫pgAdmin,在這個平臺上可以做基本的數(shù)據(jù)管理操作,包括基礎(chǔ)信息的查看,數(shù)據(jù)查詢,看一些執(zhí)行計劃、表、對象等,如下所示。
四、PolarDB O引擎(兼容Oracle語法)的開發(fā)實踐:數(shù)據(jù)庫基本規(guī)范
管理PolarDB O引擎(兼容Oracle語法):開發(fā)規(guī)范(1)
另外,阿里云有一些常用的開發(fā)規(guī)范,開發(fā)規(guī)范是阿里云內(nèi)部探索出來的,也稱為規(guī)約,在阿里巴巴內(nèi)部是比較嚴格遵守執(zhí)行的,未來會發(fā)布在開發(fā)者社區(qū)和阿里云的文檔體系中。開發(fā)規(guī)范分成幾個方面,有些地方和開發(fā)者在具體使用PolarDB的時候關(guān)系會比較大,下面簡單闡述一下。
規(guī)范中有一些是我們內(nèi)部要求強制執(zhí)行,有一些則是推薦執(zhí)行,用戶可以根據(jù)自己的實際情況進行取舍。
上方為建表規(guī)約。比如有一個對字段名的規(guī)范,要求必須要用小寫字母和數(shù)字,不能用關(guān)鍵字,為什么會有這樣的規(guī)范?因為字段名的修改是一個代價比較大的事情,通常不能“預(yù)發(fā)”。
我們發(fā)現(xiàn),在實際的生產(chǎn)過程中改一個字段名是非常麻煩的。因為前面的業(yè)務(wù)已經(jīng)在運行,如果改一個字段名,就意味著業(yè)務(wù)系統(tǒng)不能正常運行。所以以前大多數(shù)的做法就是加新的字段,因此我們對字段名提了一些規(guī)范,比如只能用小寫字母,不能用關(guān)鍵字等。
第二個是表名和字段名,我們要求加create_time和 update_time。這會帶來幾個好處,第一個就是如果數(shù)據(jù)發(fā)生錯誤的時候,你可以很快知道字段的修改情況和時間。第二個是在上下游系統(tǒng)里面,如果要拉取一些變化數(shù)據(jù)的時候,它也可以非??斓卣业侥男?shù)據(jù)發(fā)生了變化,然后去做對應(yīng)的處理。
另外,表必須有主鍵。這里有幾個原因,第一個是查詢性能會非常好,第二個是在下游的系統(tǒng)拉取一些變化的數(shù)據(jù)的時候,它通過主鍵可以比較快速地拿到。
此外還有一系列的索引規(guī)約,如上圖所示。
規(guī)約中提到,索引的建立要有順序,這個順序的考慮可能會去關(guān)注where條件里面有哪些字段,要注意order by條件里面字段的順序,這個順序可能要影響索引建立的字段順序,只有它們兩個比較匹配的時候,整個的性能才會比較好。
另外,如果可以用覆蓋索引查詢的時候,盡量用覆蓋查索引查詢,會大大增加效率。
規(guī)約中還有一個推薦項:利用延遲關(guān)聯(lián)或者子查詢優(yōu)化超多分頁場景。這也是我們在數(shù)據(jù)庫的索引優(yōu)化里面的經(jīng)驗。當(dāng)做分頁查詢的時候,比如說當(dāng)你翻到了第1000頁,或者是第500頁這樣靠后的頁面時,這時候建議的做法是,比如說翻頁要查出10頁的內(nèi)容,最好先把這10頁內(nèi)容的主鍵ID先查出來,查出來之后再回表一次,把所有的數(shù)據(jù)查出來,這是一個比較常見的推薦做法。
另外索引規(guī)約里面還提到一條,就是要注意不同字段類型,盡可能少或者不要發(fā)生隱式轉(zhuǎn)換,因為隱式轉(zhuǎn)換會導(dǎo)致整個索引失效。
管理PolarDB O引擎(兼容Oracle語法):開發(fā)規(guī)范(2)
SQL和運維也有許多規(guī)約,這里主要講一下運維方面其中幾個點。
首先是數(shù)據(jù)訂正,開發(fā)者如果要去做一些修改數(shù)據(jù)的話,一定要先把這些數(shù)據(jù)查詢出來,先看一遍再去做刪除,要不然的話很容易出現(xiàn)誤刪除。
另外推薦使用數(shù)據(jù)管理產(chǎn)品DMS。如果在DMS上做數(shù)據(jù)訂正的話,它有一個好處是可以勾選備份,當(dāng)做數(shù)據(jù)訂正的時候,它會自動把所有要訂正的數(shù)據(jù)全部做一個備份。如果發(fā)現(xiàn)數(shù)據(jù)訂正出了問題的時候,可以找到DMS自動備份下來的數(shù)據(jù),重新再把這個數(shù)據(jù)恢復(fù)起來。
其他的這些這里不做過多闡述,未來會發(fā)布在開發(fā)者社區(qū)和阿里云的文檔體系中。
五、PolarDB O引擎(兼容Oracle語法)的開發(fā)實踐:常見的SQL優(yōu)化
(一)管理 PolarDB O引擎(兼容Oracle語法):SQL優(yōu)化案例一 并行查詢
當(dāng)查一些帶復(fù)雜計算的Query,用并行查詢可以大大加速查詢效率。
上方是一個簡單的例子,在GROUP BY的時候有一個非常簡單的計算,當(dāng)這個Query要掃描的數(shù)據(jù)非常多的時候,開一個并行查詢可以讓耗時從原來的100多秒到10秒時間,速度翻了10倍,這是用戶在使用PolarDB的一個小技巧。
(二)管理PolarDB O引擎(兼容Oracle語法):SQL優(yōu)化案例二 選擇合適的JOIN方式
我們支持hash join,merge join和nest-loop join,用戶可以根據(jù)不同的場景選擇合適的Join方式。
可以看到,在上面這個案例中,選擇nest-loop join是最快的。
六、案例與認可
(一)完整的數(shù)據(jù)庫生態(tài)
雖然PolarDB是一個單獨的產(chǎn)品,但是它有非常完善的產(chǎn)品生態(tài),包括數(shù)據(jù)管理DMS,數(shù)據(jù)自治服務(wù)DAS,數(shù)據(jù)傳輸DTS,數(shù)據(jù)庫備份DBS,數(shù)據(jù)與應(yīng)用遷移ADAM等,可以滿足用戶各種場景,帶來全方位的服務(wù)。
(二)案例:PolarDB助力PrestoMall平滑從Oracle遷移上云
PrestoMall 是一家成立于2014年的東南亞電商企業(yè),為了應(yīng)對業(yè)務(wù)的快速增長,阿里云數(shù)據(jù)庫PolarDB助力PrestoMall平滑從Oracle遷移上云。
遷移上云主要面臨以下業(yè)務(wù)挑戰(zhàn):
業(yè)務(wù)快速發(fā)展,IT 費用也隨之水漲船高,Oracle成本高昂;
業(yè)務(wù)的快速增長,應(yīng)對雙十一大促乏力,應(yīng)用具備水平擴展的能力,但是數(shù)據(jù)庫彈性不足;
去O復(fù)雜度太高,缺乏經(jīng)驗,希望有專業(yè)評估指導(dǎo);
最優(yōu)遷移成本,控制風(fēng)險成為難題。
根據(jù)客戶業(yè)務(wù)需求,我們制定了遷移至PolarDB O(兼容Oracle語法)的方案,原因是:
PolarDB O引擎(兼容Oracle語法) 作為云數(shù)據(jù)庫,沒有昂貴的license費用;
PolarDB O引擎(兼容Oracle語法)云原生彈性,解決客戶數(shù)據(jù)庫彈性不足的問題;
ADAM為客戶提供專業(yè)的數(shù)據(jù)庫/應(yīng)用兼容性評估報告,制定完善的遷移計劃;結(jié)合PolarDB O引擎(兼容Oracle語法)對Oracle的高兼容性,大幅提升改造效率;
DTS實時遷移/回流的功能,配合專家服務(wù),大幅縮短割接時間并降低風(fēng)險。
遷移到PolarDB O引擎(兼容Oracle語法)后,通過最終實現(xiàn)了以下客戶價值:
PolarDB O引擎(兼容Oracle語法)在成功支撐客戶業(yè)務(wù)的同時,公司整體IT成本降低40%;
雙十二大促PolarDB O引擎(兼容Oracle語法)彈性升級,應(yīng)對自如;
ADAM + PolarDB O引擎(兼容Oracle語法)幫助客戶代碼改造成本降低93%;
在計劃內(nèi)順利平穩(wěn)完成割接,業(yè)務(wù)穩(wěn)定運行。
(三)被廣泛認可的云原生關(guān)系型數(shù)據(jù)庫PolarDB
目前,PolarDB在業(yè)界受到非常廣泛的認可,頂級學(xué)會的論文已經(jīng)超過了10篇了,獲得了今年中國電子學(xué)會的科技進步一等獎,還有一些其他權(quán)威榮譽。