DRDS:分布式數(shù)據(jù)庫(kù)服務(wù)。
1.相關(guān)術(shù)語(yǔ)
DRDS(Distribute Relational Database Service),分布式關(guān)系型數(shù)據(jù)庫(kù)服務(wù):分布式數(shù)據(jù)庫(kù)服務(wù),基于rds,提供分庫(kù)分表功能。
DrdsInstance(Distribute Relational Database Instance),分布式數(shù)據(jù)庫(kù)實(shí)例:一個(gè)獨(dú)立占用物理內(nèi)存的分布式數(shù)據(jù)庫(kù)服務(wù)進(jìn)程,可以有不同的規(guī)格,規(guī)格會(huì)決定該實(shí)例的性能(包含IOPS、連接數(shù))。
DrdsInstanceId(Distribute Relational Database Instance ID),分布式數(shù)據(jù)庫(kù)實(shí)例名:實(shí)例名可標(biāo)識(shí)一個(gè)實(shí)例的名稱,全局唯一。
DrdsDB(Distribute Relational Database),分布式數(shù)據(jù)庫(kù):Drds數(shù)據(jù)庫(kù)是在一個(gè)實(shí)例下創(chuàng)建的邏輯單元,一個(gè)實(shí)例可以創(chuàng)建多個(gè)數(shù)據(jù)庫(kù),在實(shí)例內(nèi)數(shù)據(jù)庫(kù)命名唯一,所有數(shù)據(jù)庫(kù)都會(huì)共享該實(shí)例的資源。
DrdsDBName(Distribute Relational Database Name),分布式數(shù)據(jù)庫(kù)名:標(biāo)識(shí)每個(gè)分布式DB的名稱,在一個(gè)實(shí)例范圍內(nèi),數(shù)據(jù)庫(kù)名惟一。
DrdsDBAccount(Distribute Relational Database Accoun),分布式數(shù)據(jù)庫(kù)帳號(hào)/帳號(hào):帳號(hào)是標(biāo)識(shí)數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限,目前一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)帳號(hào),一個(gè)帳號(hào)關(guān)聯(lián)一個(gè)數(shù)據(jù)庫(kù)。
2.DRDS產(chǎn)品簡(jiǎn)介
2.1 DRDS產(chǎn)品概要:
單機(jī)數(shù)據(jù)庫(kù)能夠方便的滿足用戶對(duì)于關(guān)系查詢類的需求,是目前業(yè)務(wù)應(yīng)用中最常使用的軟件。然而,對(duì)于很多應(yīng)用而言,單機(jī)數(shù)據(jù)庫(kù)最終都會(huì)碰到單機(jī)性能上的天花板,在TPS(系統(tǒng)吞吐量)/QPS(每秒查詢率)/內(nèi)存容量/磁盤容量等等一系列系統(tǒng)資源上會(huì)碰到各類限制。DRDS的主要目標(biāo),就是幫您解決這方面的各類問(wèn)題,他主要提供了兩個(gè)功能:讀寫分離和數(shù)據(jù)庫(kù)切分。
讀寫分離,能夠允許您實(shí)現(xiàn)一臺(tái)機(jī)器寫入,多臺(tái)機(jī)器讀取,這對(duì)于讀多寫少的應(yīng)用,能夠以極低的成本解決系統(tǒng)的瓶頸。
數(shù)據(jù)庫(kù)切分是一個(gè)解決系統(tǒng)存儲(chǔ)瓶頸的最終極解決方案,數(shù)據(jù)庫(kù)切分的核心思想其實(shí)很簡(jiǎn)單,就是分而治之。將數(shù)據(jù)分散到多臺(tái)機(jī)器,并保證請(qǐng)求能夠平均的分發(fā)到這些機(jī)器上,就可以以極低的成本來(lái)解決業(yè)務(wù)的各類性能瓶頸。
當(dāng)然,切分也是有代價(jià)的,最明顯的代價(jià)就是,分布式數(shù)據(jù)庫(kù)會(huì)對(duì)一些原有單機(jī)數(shù)據(jù)庫(kù)的場(chǎng)景進(jìn)行限制,因?yàn)檫@些操作,在分布式環(huán)境下的延遲或效率非常低效,就算是能夠?qū)崿F(xiàn)出來(lái),也會(huì)因?yàn)樾阅軉?wèn)題而無(wú)法使用。
針對(duì)這類問(wèn)題,阿里的中間件團(tuán)隊(duì)曾經(jīng)成功的協(xié)助過(guò)近300個(gè)業(yè)務(wù)應(yīng)用系統(tǒng)實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的切分,因此,我們?cè)谶@個(gè)領(lǐng)域內(nèi)積累了大量的實(shí)戰(zhàn)經(jīng)驗(yàn)和成熟的產(chǎn)品,希望這類產(chǎn)品也能夠?yàn)槟峁┫嗤姆?wù),讓您的數(shù)據(jù)庫(kù)再也不必?fù)?dān)心性能問(wèn)題。
2.2DRDS與MySQL兼容性:
支持點(diǎn):
DRDS支持90%以上MySQL sql,包括常用的insert/update/replace,select/join/union/subquery/exist等各種語(yǔ)法+條件組合
DRDS抽象出21種數(shù)據(jù)類型,int/float/double/long/decimal/data/time/datetime/timestamp/bit/bits...
DRDS兼容MySQL 80%的函數(shù)實(shí)現(xiàn),主要包括:數(shù)學(xué)、字符串、時(shí)間
DRDS支持map/reduce計(jì)算模型
DRDS支持函數(shù)的二次計(jì)算,如如count(id)+1,sum(pv)/count(person)
DRDS支持跨庫(kù)join的函數(shù)計(jì)算,比如select count(*)+1 from a join b on a.id=b.id.
DRDS支持特殊類型計(jì)算,比如count(distinct id).
DRDS支持跨數(shù)據(jù)節(jié)點(diǎn)join(分布式j(luò)oin)
DRDS支持跨數(shù)據(jù)節(jié)點(diǎn)多重嵌套子查詢
DRDS支持多種并行執(zhí)行模式
目前不支持:
不支持group by/order by列為函數(shù)列且不存在與select列中
不支持join列為函數(shù)計(jì)算,比如on.id=b.id+1
DRDS server未開(kāi)放DDL支持,只能在控制臺(tái)做DDL
不支持復(fù)雜update/delete語(yǔ)句(比如update多表,有join等)
不支持強(qiáng)一致分布式事務(wù)
2.3數(shù)據(jù)水平拆分
DRDS幫助您實(shí)現(xiàn)分庫(kù)分表,能夠?qū)⒃瓉?lái)只能在單節(jié)點(diǎn)執(zhí)行的SQL,轉(zhuǎn)變?yōu)槎喙?jié)點(diǎn)執(zhí)行的SQL,如同單個(gè)數(shù)據(jù)庫(kù)體驗(yàn)。通過(guò)支持系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的動(dòng)態(tài)水平擴(kuò)展,目前DRDS在公司內(nèi)已經(jīng)有超過(guò)幾百個(gè)應(yīng)用系統(tǒng)使用超過(guò)5年,高效安全且穩(wěn)定。
但是分布式數(shù)據(jù)庫(kù)和單機(jī)數(shù)據(jù)庫(kù)本身必然會(huì)存在一定的使用習(xí)慣上的不同,例如低效的分布式事務(wù)、分布式j(luò)oin等,針對(duì)這些問(wèn)題,DRDS的選擇是:優(yōu)先考慮性能和穩(wěn)定性,兼顧軟件的兼容性。
與市面上的一些開(kāi)源的數(shù)據(jù)庫(kù)切分工具相比,DRDS能夠更智能的分析您的SQL,在結(jié)果集合并和分布式j(luò)oin優(yōu)化等關(guān)鍵領(lǐng)域,我們都有成熟解決方案,能夠幫您解決在分布式數(shù)據(jù)庫(kù)場(chǎng)景中面臨的大部分問(wèn)題。
2.4平滑擴(kuò)容
DRDS能夠幫助用戶實(shí)現(xiàn)在線的數(shù)據(jù)庫(kù)平滑擴(kuò)容,讓用戶能夠按需的自由增減數(shù)據(jù)庫(kù),從而實(shí)現(xiàn)彈性按需使用數(shù)據(jù)庫(kù)集群。
在線數(shù)據(jù)庫(kù)擴(kuò)容的重點(diǎn)在于“在線”兩字,也就是用戶不需要停止業(yè)務(wù)系統(tǒng)進(jìn)行割接操作,直接就可以添加新的RDS節(jié)點(diǎn)到集群中,實(shí)現(xiàn)無(wú)縫的自由擴(kuò)展。DRDS則將整個(gè)擴(kuò)容的過(guò)程分為幾個(gè)階段,包括全量遷移,增量同步,切換數(shù)據(jù)庫(kù)等幾個(gè)步驟。數(shù)據(jù)會(huì)提前進(jìn)行搬遷,并進(jìn)行增量并行同步一段時(shí)間,因此,我們可以在非常短的時(shí)間內(nèi)(秒級(jí)別)完成數(shù)據(jù)庫(kù)的最終擴(kuò)容切換工作,對(duì)您的業(yè)務(wù)沒(méi)有影響。
2.5小表廣播
在一些大的業(yè)務(wù)表進(jìn)行了切分后,總會(huì)存在一些表的數(shù)據(jù)量不大,更新量也不大的原始信息表。這些表往往會(huì)與我們的切分后大表進(jìn)行join操作。這種操作物理上就會(huì)造成分布式j(luò)oin查詢,效率從整體上會(huì)比較低下。
針對(duì)這種分布式j(luò)oin的場(chǎng)景,我們開(kāi)發(fā)了OETL專用工具來(lái)幫您進(jìn)行小表廣播,將原信息表的所有數(shù)據(jù)(包括增量更新)全部自動(dòng)的廣播到大表的機(jī)器上,這樣,就可以讓原來(lái)的分布式查詢變成單機(jī)本地查詢了。
2.6全局唯一ID
在分布式環(huán)境下,原有的mysql sequence生成機(jī)制無(wú)法高效的生成全局唯一的sequence.我們借鑒了oracle的sequence生成樣例,實(shí)現(xiàn)了一個(gè)在mysql基礎(chǔ)上的高效sequence生成器,能做到?jīng)]有單點(diǎn)性能瓶頸,具備大并發(fā)獲取和低延遲特性。
DRDS sequence功能的目標(biāo)只是為了保證數(shù)據(jù)的全局唯一,雖然基本上是按時(shí)間序列獲取的,但并不全局有序。