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