阿里數(shù)據(jù)庫oceanbase架構(gòu)分析
時(shí)間:2023-05-19 來源: 作者: 我要糾錯(cuò)
OceanBase是阿里集團(tuán)開發(fā)的可擴(kuò)展關(guān)系數(shù)據(jù)庫,實(shí)現(xiàn)了數(shù)千億條記錄、數(shù)百TB數(shù)據(jù)的跨行、跨表交易。截至2012年8月,已支持收藏夾、直通車報(bào)表、天貓?jiān)u價(jià)等OLTP和OLAP在線服務(wù),在線數(shù)據(jù)量突破1000億。
從模塊劃分來看,阿里數(shù)據(jù)庫oceanbase可以分為四個(gè)模塊:主服務(wù)器RootServer、UpdateServer更新服務(wù)器、基線數(shù)據(jù)服務(wù)器ChunkServer和MergeServer Mergeserver。OceanBase系統(tǒng)中的數(shù)據(jù)按照時(shí)間線分為基線數(shù)據(jù)和增量數(shù)據(jù);數(shù)據(jù)是只讀的,所有修改都會更新到增量數(shù)據(jù)中。增量數(shù)據(jù)通過合并操作有規(guī)律地合并到基線數(shù)據(jù)中。
阿里數(shù)據(jù)庫oceanbase系統(tǒng)架構(gòu)
OceanBase由以下部分組成:
●客戶端:用戶使用OceanBase的方式和MySQL數(shù)據(jù)庫完全一樣,支持JDBC、C客戶端訪問等等;贛ySQL數(shù)據(jù)庫開發(fā)的應(yīng)用和工具可以直接遷移到OceanBase。
●RootServer:管理集群中的所有服務(wù)器、子表的數(shù)據(jù)分發(fā)和副本管理。根服務(wù)器一般是一主一備,主備之間的數(shù)據(jù)是強(qiáng)同步的。
●UpdateServer:存儲OceanBase系統(tǒng)的增量更新數(shù)據(jù)。UpdateServer一般是一主一備,主備之間可以配置不同的同步模式。部署時(shí),UpdateServer進(jìn)程和RootServer進(jìn)程通常共享物理服務(wù)器。
●ChunkServer:存儲OceanBase系統(tǒng)的基線數(shù)據(jù)。基線數(shù)據(jù)通常存儲在兩個(gè)或三個(gè)副本中,這是可以配置的。
●MergeServer:接收并解析用戶的SQL請求,經(jīng)過詞法分析、語法分析、查詢優(yōu)化等一系列操作后,轉(zhuǎn)發(fā)給對應(yīng)的ChunkServer或UpdateServer。如果請求的數(shù)據(jù)分布在多個(gè)ChunkServer上,MergeServer還需要合并多個(gè)ChunkServer返回的結(jié)果。客戶端與MergeServer之間采用原生MySQL通信協(xié)議,MySQL客戶端可以直接訪問MergeServer。
阿里數(shù)據(jù)庫oceanbase支持部署多個(gè)機(jī)房。每個(gè)機(jī)房都配備了一個(gè)完整的OceanBase集群,包括RootServer、MergeServer、ChunkServer和UpdateServer。每個(gè)集群負(fù)責(zé)數(shù)據(jù)劃分、負(fù)載均衡、集群服務(wù)器管理等操作。通過主集群的主更新服務(wù)器對備用集群的同步增量更新操作日志,實(shí)現(xiàn)集群間的數(shù)據(jù)同步?蛻舳伺渲昧硕鄠(gè)集群的RootServer地址列表,用戶可以設(shè)置每個(gè)集群的流量分配比例。根據(jù)這一比率,客戶端將讀寫操作發(fā)送到不同的群集:
阿里數(shù)據(jù)庫oceanbase客服端
1)請求RootServer獲取集群中MergeServer的地址列表。
2)選擇一個(gè)MergeServer按照一定的策略發(fā)送讀寫請求。與客戶端的通信協(xié)議MergeServer兼容原生MySQL協(xié)議,只需要調(diào)用標(biāo)準(zhǔn)庫如MySQL JDBC驅(qū)動(dòng)或MySQL C客戶端即可?蛻舳酥С謨煞N主要策略:隨機(jī)散列和一致散列。哈希的主要目的是將同一個(gè)SQL請求發(fā)送到同一個(gè)MergeServer,方便MergeServer緩存查詢結(jié)果。
3)如果對MergeServer的請求失敗,請從MergeServer列表中重新選擇一個(gè)MergeServer,然后重試。如果對MergeServer的請求失敗超過一定次數(shù),則將MergeServer列入黑名單并從MergeServer列表中刪除。此外,客戶端將定期請求根服務(wù)器更新MergeServer地址列表。
如果OceanBase部署了多個(gè)集群,客戶端還需要處理多個(gè)集群的流量分配。用戶可以設(shè)置多個(gè)集群之間的流量分配比例,客戶端得到流量分配比例后,按照這個(gè)比例向不同的集群發(fā)送請求。
根服務(wù)器
RootServer的功能主要包括集群管理、數(shù)據(jù)分發(fā)和副本管理。
RootServer管理群集中的所有MergeServer、ChunkServer和UpdateServer。每個(gè)集群中同時(shí)只允許有一個(gè)UpdateServer提供寫服務(wù),這個(gè)UpdateServer成為主UpdateServer。這種方法通過犧牲一些可用性來實(shí)現(xiàn)強(qiáng)大的一致性。RootServer通過租用機(jī)制選擇唯一的主更新服務(wù)器。當(dāng)原始主更新服務(wù)器失敗時(shí),RootServer可以在原始租約到期后選擇新的更新服務(wù)器作為主更新服務(wù)器。此外,RootServer與Mergeserver & Chunkserver保持心跳,因此它可以感知聯(lián)機(jī)和脫機(jī)Mergeserver & Chunkserver機(jī)器的列表。
阿里數(shù)據(jù)庫oceanbase表中的數(shù)據(jù)使用主鍵進(jìn)行內(nèi)部排序和存儲,主鍵由若干列組成,并且是唯一的。在OceanBase中,基線數(shù)據(jù)按主鍵排序,并分成數(shù)據(jù)量大致相同的數(shù)據(jù)范圍,這些數(shù)據(jù)范圍稱為子表。每個(gè)子表的默認(rèn)大小是256MB(可配置)。OceanBase的數(shù)據(jù)分發(fā)模式與Bigtable相同,不同的是OceanBase沒有采用RootTable)+元數(shù)據(jù)表的二級索引結(jié)構(gòu),而是采用了根表的一級索引結(jié)構(gòu)。
主鍵值在[1,100]之間的表分為1 ~ 25、26 ~ 50、51 ~ 80、81 ~ 100四個(gè)子表。RootServer中的根表記錄了每個(gè)子表所在的ChunkServer的位置信息,每個(gè)子表包含分布在多個(gè)chunk server中的多個(gè)副本(一般為三個(gè)副本,可配置)。當(dāng)其中一個(gè)ChunkServer出現(xiàn)故障時(shí),RootServer可以檢測到它,并觸發(fā)向這個(gè)ChunkServer上的子表添加副本的操作;另外,RootServer會定期進(jìn)行負(fù)載均衡,選擇一些子表從負(fù)載較高的機(jī)器遷移到負(fù)載較低的機(jī)器。
RootServer采用一主一備的結(jié)構(gòu),主備之間數(shù)據(jù)同步性強(qiáng),通過Linux HA(http://www.linux-ha***)軟件實(shí)現(xiàn)高可用性。備用根服務(wù)器共享VIP。當(dāng)主根服務(wù)器出現(xiàn)故障時(shí),VIP可以自動(dòng)漂移到備用根服務(wù)器所在的機(jī)器上。在備用根服務(wù)器檢測到它之后,它切換到向主根服務(wù)器提供服務(wù)。
合并服務(wù)器
MergeServer的功能主要有:協(xié)議分析、SQL分析、請求轉(zhuǎn)發(fā)、結(jié)果合并、多表操作等。
OceanBase客戶端和MergeServer之間的協(xié)議是MySQL協(xié)議。MergeServer首先分析MySQL協(xié)議,提取用戶發(fā)送的SQL語句,然后進(jìn)行詞法分析和語法分析,生成SQL語句的邏輯查詢計(jì)劃和物理查詢計(jì)劃,最后根據(jù)物理查詢計(jì)劃調(diào)用OceanBase內(nèi)部的各種運(yùn)算符。
MergeServer緩存子表分布信息,并根據(jù)請求中涉及的子表將請求轉(zhuǎn)發(fā)給子表所在的ChunkServer。如果是寫操作,它也將被轉(zhuǎn)發(fā)到更新服務(wù)器。有些請求需要跨越多個(gè)子表。此時(shí),MergeServer會將請求拆分并發(fā)送給多個(gè)chunk server,并將這些chunk server返回的結(jié)果進(jìn)行合并。如果請求涉及多個(gè)表,MergeServer需要先從ChunkServer獲取每個(gè)表的數(shù)據(jù),然后進(jìn)行多表關(guān)聯(lián)或嵌套查詢等操作。
MergeServer支持多個(gè)chunk server的并發(fā)請求,即多個(gè)請求被發(fā)送到多個(gè)chunk server,然后所有請求被一次性應(yīng)答。此外,在SQL執(zhí)行期間,如果子表所在的ChunkServer出現(xiàn)故障,MergeServer會將請求轉(zhuǎn)發(fā)給子表的其他副本所在的ChunkServer。這樣,ChunkServer故障不會影響用戶的查詢。
MergeServer本身沒有狀態(tài),所以MergeServer的宕機(jī)不會影響用戶,客戶端會自動(dòng)屏蔽故障的MergeServer。
ChunkServer
ChunkServer的功能包括:存儲多個(gè)子表,提供閱讀服務(wù),執(zhí)行定期合并和數(shù)據(jù)分發(fā)。
阿里數(shù)據(jù)庫oceanbase將一個(gè)大表分成大小約為256MB的子表。每個(gè)子表由一個(gè)或多個(gè)SSTable(一般為一個(gè))組成,每個(gè)SSTable由多個(gè)塊組成(可配置的塊,大小從4 KB到64 KB不等)。數(shù)據(jù)按照主鍵的順序存儲在表中。要查找一行數(shù)據(jù),首先需要定位該行所屬的子表,然后在相應(yīng)的表中執(zhí)行二分搜索法。SSTable支持兩種緩存模式,塊緩存和行緩存。塊緩存最近以塊為單位讀取數(shù)據(jù),行緩存最近以行為單位讀取數(shù)據(jù)。
MergeServer將每個(gè)子表的讀取請求發(fā)送給子表所在的ChunkServer,ChunkServer。Chunkserver首先讀取SSTable中包含的基線數(shù)據(jù),然后請求UpdateServer獲取相應(yīng)的增量更新數(shù)據(jù),再將基線數(shù)據(jù)與增量更新融合得到最終結(jié)果。
因?yàn)槊看巫x取都需要從UpdateServer獲取最新的增量更新,所以為了保證讀取性能,需要限制UpdateServer中的增量更新數(shù)據(jù)量,最好將數(shù)據(jù)全部存儲在內(nèi)存中。OceanBase會周期性的觸發(fā)合并或者數(shù)據(jù)分發(fā)操作,其中ChunkServer會在前段時(shí)間從UpdateServer獲取更新操作。一般情況下,OceanBase集群會在服務(wù)高峰期(凌晨1:00開始,可配置)每天執(zhí)行一次合并操作。這種合并操作通常被稱為每日合并。
更新服務(wù)器
UpdateServer是群集中唯一可以接受寫入的模塊,并且每個(gè)群集中只有一個(gè)主更新服務(wù)器。UpdateServer中的更新操作首先被寫入內(nèi)存表。當(dāng)內(nèi)存表中的數(shù)據(jù)量超過某個(gè)值時(shí),可以生成快照文件并轉(zhuǎn)儲到SSD?煺瘴募慕M織方式類似于ChunkServer中的SSTable,因此這些快照文件也稱為SSTable。另外,由于數(shù)據(jù)行有些列更新了,有些列沒有更新,所以存儲在SSTable中的數(shù)據(jù)行是稀疏的,稱為稀疏SSTable。
為了保證可靠性,主更新服務(wù)器需要在更新內(nèi)存表之前寫操作日志,并同步到備用更新服務(wù)器。當(dāng)主更新服務(wù)器失敗時(shí),根服務(wù)器上維護(hù)的租約將失效。此時(shí),RootServer將從備用更新服務(wù)器列表中選擇最新的備用更新服務(wù)器,并切換到主更新服務(wù)器繼續(xù)提供寫入服務(wù)。UpdateServer停機(jī)重啟后,需要先加載轉(zhuǎn)儲的快照文件(SSTable文件),然后回放快照點(diǎn)之后的操作日志。
由于集群中只有一個(gè)提供寫服務(wù)的主UpdateServer,OceanBase可以輕松實(shí)現(xiàn)跨銀行、跨表事務(wù),而不需要采用傳統(tǒng)的兩階段提交協(xié)議。當(dāng)然,這也帶來了一系列問題。由于整個(gè)集群的所有讀寫操作都必須經(jīng)過updateserver,因此UpdateServer的性能非常重要。OceanBase cluster通過兩種機(jī)制將UpdateServer的增量更新持續(xù)分發(fā)到ChunkServer:定期合并和數(shù)據(jù)分發(fā)。然而,UpdateServer只需要在短時(shí)間內(nèi)提供新添加的數(shù)據(jù),所有這些數(shù)據(jù)通常都可以存儲在內(nèi)存中。此外,UpdateServer的內(nèi)存操作、網(wǎng)絡(luò)架構(gòu)、磁盤操作在系統(tǒng)實(shí)現(xiàn)時(shí)也需要進(jìn)行大量優(yōu)化。
阿里數(shù)據(jù)庫oceanbase定期整合和數(shù)據(jù)分發(fā)
定期整合和數(shù)據(jù)分發(fā)都是將增量更新從UpdateServer分發(fā)到ChunkServer的方法,它們的總體過程是相似的:
1)UpdateServer凍結(jié)當(dāng)前活動(dòng)內(nèi)存表,生成凍結(jié)內(nèi)存表,打開新的活動(dòng)內(nèi)存表,后續(xù)更新操作寫入新的活動(dòng)內(nèi)存表。
2)UpdateServer通知RootServer數(shù)據(jù)版本發(fā)生變化,然后RootServer通過心跳消息通知ChunkServer。
3)每個(gè)ChunkServer開始定期的合并或數(shù)據(jù)分發(fā)操作,從UpdateServer獲取每個(gè)子表對應(yīng)的增量更新數(shù)據(jù)。
定期合并和數(shù)據(jù)分發(fā)的區(qū)別在于,ChunkServer在數(shù)據(jù)分發(fā)的過程中只在本地緩存UpdateServer中凍結(jié)內(nèi)存表中的增量更新數(shù)據(jù),而ChunkServer在定期合并的過程中需要將本地s表中的基線數(shù)據(jù)和凍結(jié)內(nèi)存表中的增量更新數(shù)據(jù)合并一次,融合后生成新的基線數(shù)據(jù)并存儲在新的s表中。定期合并對系統(tǒng)的服務(wù)能力影響很大,往往安排在日常服務(wù)的高峰時(shí)段進(jìn)行(比如凌晨1:00開始),而數(shù)據(jù)分發(fā)可以不受限制。
從模塊劃分來看,阿里數(shù)據(jù)庫oceanbase可以分為四個(gè)模塊:主服務(wù)器RootServer、UpdateServer更新服務(wù)器、基線數(shù)據(jù)服務(wù)器ChunkServer和MergeServer Mergeserver。OceanBase系統(tǒng)中的數(shù)據(jù)按照時(shí)間線分為基線數(shù)據(jù)和增量數(shù)據(jù);數(shù)據(jù)是只讀的,所有修改都會更新到增量數(shù)據(jù)中。增量數(shù)據(jù)通過合并操作有規(guī)律地合并到基線數(shù)據(jù)中。
阿里數(shù)據(jù)庫oceanbase系統(tǒng)架構(gòu)
OceanBase由以下部分組成:
●客戶端:用戶使用OceanBase的方式和MySQL數(shù)據(jù)庫完全一樣,支持JDBC、C客戶端訪問等等;贛ySQL數(shù)據(jù)庫開發(fā)的應(yīng)用和工具可以直接遷移到OceanBase。
●RootServer:管理集群中的所有服務(wù)器、子表的數(shù)據(jù)分發(fā)和副本管理。根服務(wù)器一般是一主一備,主備之間的數(shù)據(jù)是強(qiáng)同步的。
●UpdateServer:存儲OceanBase系統(tǒng)的增量更新數(shù)據(jù)。UpdateServer一般是一主一備,主備之間可以配置不同的同步模式。部署時(shí),UpdateServer進(jìn)程和RootServer進(jìn)程通常共享物理服務(wù)器。
●ChunkServer:存儲OceanBase系統(tǒng)的基線數(shù)據(jù)。基線數(shù)據(jù)通常存儲在兩個(gè)或三個(gè)副本中,這是可以配置的。
●MergeServer:接收并解析用戶的SQL請求,經(jīng)過詞法分析、語法分析、查詢優(yōu)化等一系列操作后,轉(zhuǎn)發(fā)給對應(yīng)的ChunkServer或UpdateServer。如果請求的數(shù)據(jù)分布在多個(gè)ChunkServer上,MergeServer還需要合并多個(gè)ChunkServer返回的結(jié)果。客戶端與MergeServer之間采用原生MySQL通信協(xié)議,MySQL客戶端可以直接訪問MergeServer。
阿里數(shù)據(jù)庫oceanbase支持部署多個(gè)機(jī)房。每個(gè)機(jī)房都配備了一個(gè)完整的OceanBase集群,包括RootServer、MergeServer、ChunkServer和UpdateServer。每個(gè)集群負(fù)責(zé)數(shù)據(jù)劃分、負(fù)載均衡、集群服務(wù)器管理等操作。通過主集群的主更新服務(wù)器對備用集群的同步增量更新操作日志,實(shí)現(xiàn)集群間的數(shù)據(jù)同步?蛻舳伺渲昧硕鄠(gè)集群的RootServer地址列表,用戶可以設(shè)置每個(gè)集群的流量分配比例。根據(jù)這一比率,客戶端將讀寫操作發(fā)送到不同的群集:
阿里數(shù)據(jù)庫oceanbase客服端
1)請求RootServer獲取集群中MergeServer的地址列表。
2)選擇一個(gè)MergeServer按照一定的策略發(fā)送讀寫請求。與客戶端的通信協(xié)議MergeServer兼容原生MySQL協(xié)議,只需要調(diào)用標(biāo)準(zhǔn)庫如MySQL JDBC驅(qū)動(dòng)或MySQL C客戶端即可?蛻舳酥С謨煞N主要策略:隨機(jī)散列和一致散列。哈希的主要目的是將同一個(gè)SQL請求發(fā)送到同一個(gè)MergeServer,方便MergeServer緩存查詢結(jié)果。
3)如果對MergeServer的請求失敗,請從MergeServer列表中重新選擇一個(gè)MergeServer,然后重試。如果對MergeServer的請求失敗超過一定次數(shù),則將MergeServer列入黑名單并從MergeServer列表中刪除。此外,客戶端將定期請求根服務(wù)器更新MergeServer地址列表。
如果OceanBase部署了多個(gè)集群,客戶端還需要處理多個(gè)集群的流量分配。用戶可以設(shè)置多個(gè)集群之間的流量分配比例,客戶端得到流量分配比例后,按照這個(gè)比例向不同的集群發(fā)送請求。
根服務(wù)器
RootServer的功能主要包括集群管理、數(shù)據(jù)分發(fā)和副本管理。
RootServer管理群集中的所有MergeServer、ChunkServer和UpdateServer。每個(gè)集群中同時(shí)只允許有一個(gè)UpdateServer提供寫服務(wù),這個(gè)UpdateServer成為主UpdateServer。這種方法通過犧牲一些可用性來實(shí)現(xiàn)強(qiáng)大的一致性。RootServer通過租用機(jī)制選擇唯一的主更新服務(wù)器。當(dāng)原始主更新服務(wù)器失敗時(shí),RootServer可以在原始租約到期后選擇新的更新服務(wù)器作為主更新服務(wù)器。此外,RootServer與Mergeserver & Chunkserver保持心跳,因此它可以感知聯(lián)機(jī)和脫機(jī)Mergeserver & Chunkserver機(jī)器的列表。
阿里數(shù)據(jù)庫oceanbase表中的數(shù)據(jù)使用主鍵進(jìn)行內(nèi)部排序和存儲,主鍵由若干列組成,并且是唯一的。在OceanBase中,基線數(shù)據(jù)按主鍵排序,并分成數(shù)據(jù)量大致相同的數(shù)據(jù)范圍,這些數(shù)據(jù)范圍稱為子表。每個(gè)子表的默認(rèn)大小是256MB(可配置)。OceanBase的數(shù)據(jù)分發(fā)模式與Bigtable相同,不同的是OceanBase沒有采用RootTable)+元數(shù)據(jù)表的二級索引結(jié)構(gòu),而是采用了根表的一級索引結(jié)構(gòu)。
主鍵值在[1,100]之間的表分為1 ~ 25、26 ~ 50、51 ~ 80、81 ~ 100四個(gè)子表。RootServer中的根表記錄了每個(gè)子表所在的ChunkServer的位置信息,每個(gè)子表包含分布在多個(gè)chunk server中的多個(gè)副本(一般為三個(gè)副本,可配置)。當(dāng)其中一個(gè)ChunkServer出現(xiàn)故障時(shí),RootServer可以檢測到它,并觸發(fā)向這個(gè)ChunkServer上的子表添加副本的操作;另外,RootServer會定期進(jìn)行負(fù)載均衡,選擇一些子表從負(fù)載較高的機(jī)器遷移到負(fù)載較低的機(jī)器。
RootServer采用一主一備的結(jié)構(gòu),主備之間數(shù)據(jù)同步性強(qiáng),通過Linux HA(http://www.linux-ha***)軟件實(shí)現(xiàn)高可用性。備用根服務(wù)器共享VIP。當(dāng)主根服務(wù)器出現(xiàn)故障時(shí),VIP可以自動(dòng)漂移到備用根服務(wù)器所在的機(jī)器上。在備用根服務(wù)器檢測到它之后,它切換到向主根服務(wù)器提供服務(wù)。
合并服務(wù)器
MergeServer的功能主要有:協(xié)議分析、SQL分析、請求轉(zhuǎn)發(fā)、結(jié)果合并、多表操作等。
OceanBase客戶端和MergeServer之間的協(xié)議是MySQL協(xié)議。MergeServer首先分析MySQL協(xié)議,提取用戶發(fā)送的SQL語句,然后進(jìn)行詞法分析和語法分析,生成SQL語句的邏輯查詢計(jì)劃和物理查詢計(jì)劃,最后根據(jù)物理查詢計(jì)劃調(diào)用OceanBase內(nèi)部的各種運(yùn)算符。
MergeServer緩存子表分布信息,并根據(jù)請求中涉及的子表將請求轉(zhuǎn)發(fā)給子表所在的ChunkServer。如果是寫操作,它也將被轉(zhuǎn)發(fā)到更新服務(wù)器。有些請求需要跨越多個(gè)子表。此時(shí),MergeServer會將請求拆分并發(fā)送給多個(gè)chunk server,并將這些chunk server返回的結(jié)果進(jìn)行合并。如果請求涉及多個(gè)表,MergeServer需要先從ChunkServer獲取每個(gè)表的數(shù)據(jù),然后進(jìn)行多表關(guān)聯(lián)或嵌套查詢等操作。
MergeServer支持多個(gè)chunk server的并發(fā)請求,即多個(gè)請求被發(fā)送到多個(gè)chunk server,然后所有請求被一次性應(yīng)答。此外,在SQL執(zhí)行期間,如果子表所在的ChunkServer出現(xiàn)故障,MergeServer會將請求轉(zhuǎn)發(fā)給子表的其他副本所在的ChunkServer。這樣,ChunkServer故障不會影響用戶的查詢。
MergeServer本身沒有狀態(tài),所以MergeServer的宕機(jī)不會影響用戶,客戶端會自動(dòng)屏蔽故障的MergeServer。
ChunkServer
ChunkServer的功能包括:存儲多個(gè)子表,提供閱讀服務(wù),執(zhí)行定期合并和數(shù)據(jù)分發(fā)。
阿里數(shù)據(jù)庫oceanbase將一個(gè)大表分成大小約為256MB的子表。每個(gè)子表由一個(gè)或多個(gè)SSTable(一般為一個(gè))組成,每個(gè)SSTable由多個(gè)塊組成(可配置的塊,大小從4 KB到64 KB不等)。數(shù)據(jù)按照主鍵的順序存儲在表中。要查找一行數(shù)據(jù),首先需要定位該行所屬的子表,然后在相應(yīng)的表中執(zhí)行二分搜索法。SSTable支持兩種緩存模式,塊緩存和行緩存。塊緩存最近以塊為單位讀取數(shù)據(jù),行緩存最近以行為單位讀取數(shù)據(jù)。
MergeServer將每個(gè)子表的讀取請求發(fā)送給子表所在的ChunkServer,ChunkServer。Chunkserver首先讀取SSTable中包含的基線數(shù)據(jù),然后請求UpdateServer獲取相應(yīng)的增量更新數(shù)據(jù),再將基線數(shù)據(jù)與增量更新融合得到最終結(jié)果。
因?yàn)槊看巫x取都需要從UpdateServer獲取最新的增量更新,所以為了保證讀取性能,需要限制UpdateServer中的增量更新數(shù)據(jù)量,最好將數(shù)據(jù)全部存儲在內(nèi)存中。OceanBase會周期性的觸發(fā)合并或者數(shù)據(jù)分發(fā)操作,其中ChunkServer會在前段時(shí)間從UpdateServer獲取更新操作。一般情況下,OceanBase集群會在服務(wù)高峰期(凌晨1:00開始,可配置)每天執(zhí)行一次合并操作。這種合并操作通常被稱為每日合并。
更新服務(wù)器
UpdateServer是群集中唯一可以接受寫入的模塊,并且每個(gè)群集中只有一個(gè)主更新服務(wù)器。UpdateServer中的更新操作首先被寫入內(nèi)存表。當(dāng)內(nèi)存表中的數(shù)據(jù)量超過某個(gè)值時(shí),可以生成快照文件并轉(zhuǎn)儲到SSD?煺瘴募慕M織方式類似于ChunkServer中的SSTable,因此這些快照文件也稱為SSTable。另外,由于數(shù)據(jù)行有些列更新了,有些列沒有更新,所以存儲在SSTable中的數(shù)據(jù)行是稀疏的,稱為稀疏SSTable。
為了保證可靠性,主更新服務(wù)器需要在更新內(nèi)存表之前寫操作日志,并同步到備用更新服務(wù)器。當(dāng)主更新服務(wù)器失敗時(shí),根服務(wù)器上維護(hù)的租約將失效。此時(shí),RootServer將從備用更新服務(wù)器列表中選擇最新的備用更新服務(wù)器,并切換到主更新服務(wù)器繼續(xù)提供寫入服務(wù)。UpdateServer停機(jī)重啟后,需要先加載轉(zhuǎn)儲的快照文件(SSTable文件),然后回放快照點(diǎn)之后的操作日志。
由于集群中只有一個(gè)提供寫服務(wù)的主UpdateServer,OceanBase可以輕松實(shí)現(xiàn)跨銀行、跨表事務(wù),而不需要采用傳統(tǒng)的兩階段提交協(xié)議。當(dāng)然,這也帶來了一系列問題。由于整個(gè)集群的所有讀寫操作都必須經(jīng)過updateserver,因此UpdateServer的性能非常重要。OceanBase cluster通過兩種機(jī)制將UpdateServer的增量更新持續(xù)分發(fā)到ChunkServer:定期合并和數(shù)據(jù)分發(fā)。然而,UpdateServer只需要在短時(shí)間內(nèi)提供新添加的數(shù)據(jù),所有這些數(shù)據(jù)通常都可以存儲在內(nèi)存中。此外,UpdateServer的內(nèi)存操作、網(wǎng)絡(luò)架構(gòu)、磁盤操作在系統(tǒng)實(shí)現(xiàn)時(shí)也需要進(jìn)行大量優(yōu)化。
阿里數(shù)據(jù)庫oceanbase定期整合和數(shù)據(jù)分發(fā)
定期整合和數(shù)據(jù)分發(fā)都是將增量更新從UpdateServer分發(fā)到ChunkServer的方法,它們的總體過程是相似的:
1)UpdateServer凍結(jié)當(dāng)前活動(dòng)內(nèi)存表,生成凍結(jié)內(nèi)存表,打開新的活動(dòng)內(nèi)存表,后續(xù)更新操作寫入新的活動(dòng)內(nèi)存表。
2)UpdateServer通知RootServer數(shù)據(jù)版本發(fā)生變化,然后RootServer通過心跳消息通知ChunkServer。
3)每個(gè)ChunkServer開始定期的合并或數(shù)據(jù)分發(fā)操作,從UpdateServer獲取每個(gè)子表對應(yīng)的增量更新數(shù)據(jù)。
定期合并和數(shù)據(jù)分發(fā)的區(qū)別在于,ChunkServer在數(shù)據(jù)分發(fā)的過程中只在本地緩存UpdateServer中凍結(jié)內(nèi)存表中的增量更新數(shù)據(jù),而ChunkServer在定期合并的過程中需要將本地s表中的基線數(shù)據(jù)和凍結(jié)內(nèi)存表中的增量更新數(shù)據(jù)合并一次,融合后生成新的基線數(shù)據(jù)并存儲在新的s表中。定期合并對系統(tǒng)的服務(wù)能力影響很大,往往安排在日常服務(wù)的高峰時(shí)段進(jìn)行(比如凌晨1:00開始),而數(shù)據(jù)分發(fā)可以不受限制。
標(biāo)簽:
掃一掃在手機(jī)打開當(dāng)前頁
注:本網(wǎng)條致力提供真實(shí)有用信息,所轉(zhuǎn)載的內(nèi)容,其版權(quán)均由原作者和資料提供方所擁有!若有任何不適煩請聯(lián)系我們,將會在24小時(shí)內(nèi)刪除。
無相關(guān)信息 昆明生活資訊
昆明圖文信息
推薦信息
相關(guān)文章
無相關(guān)信息
欄目更新