yugabytedb關鍵特性和架構初探


人學始知道,不學非自然,萬事須己運,他得非我賢

YugabyteDB

YugabyteDb是一個高性能、雲原生的分布式SQL數據庫,目標是支持所有的PostgreSQL特性。它非常適合雲原生OLTP應用,需要保證數據的絕對正確性,需要如下特性的一個或多個:擴展性,容錯性或者全球部署。

YugabyteDB的核心特性包括:

1、強大的關系型數據庫兼容性。Yugabyte SQL,簡稱YSQL,重用了PostgreSQL的查詢層,支持PostgreSQL的大部分特性。

2、分布式事務。分布式事務的設計基於Google Spanner架構。主副本之間寫入操作的強一致性通過Raft協議實現,集群級的分布式ACID事務使用混合邏輯時鍾(hybrid logical clocks)實現,支持SSI(Snapshot serializable isolation)隔離級別。讀操作默認保證強一致性,但可以動態選擇從Follower讀和副本讀。

3、持續的可用性。通過原生的故障切換和修復,Yugabytedb對常見的故障有極強的修復能力。可以配置自動容忍disk、node、zone、region 和cloud故障。對於公有雲上一個region內跨多個zone的典型部署場景,RPO是0,RTO小於3秒。

4、水平擴展性。往集群中添加節點即可實現更高的IOPS和存儲更多的數據。

5、跨地理分布的多雲部署。Yugabytedb可以部署在公有雲,也可以部署在Kubernetes中。Yugabytedb支持跨三個或更多容錯域的部署,比如跨zone、跨region、跨雲部署。它還支持xCluster異步復制,具有單向主從和雙向多主配置,可用於兩個區域部署。為了以低延遲服務(過時)數據,也支持讀取副本數據。

6、支持多種API,目前支持兩種:Yugabyte SQL(YSQL),復用了PostgreSQL的查詢層和Yugabyte Cloud QL(YCQL),類似於Cassandra的API。

7、100%開源,基於Apache2.0協議。開源版本具有強大的企業功能,如分布式備份、靜態數據加密、動態TLS加密、更改數據捕獲、讀取副本等。

Yugabytedb架構

從上圖可看出Yugabyte分為兩層

1、Yugabyte Query layer(YQL)

2、DocDB Document Store

在正式看兩層的詳細設計之前,先來明確YugabyteDB中用到的一些關鍵概念

Universe

YugabyteDB Universe是一組節點(VM、物理機器或容器),它們共同作為一個具有彈性和可伸縮性的分布式數據庫運行。

考慮到不同的業務需求和延遲,可以配置和部署不同的universe,比如:

(1)單個可用zone(AZ/rack/故障域)

(2)一個region中多個可用zones(AZs)

(3)多個regions

組織用戶數據

一個YugabDB universe可以由一個或多個命名空間組成,每個命名空間可以包含一個或多個用戶表。

組件服務

一個universe由兩類服務組成:YB-Tserver和YB-Master。這些YB-Tserver和YB-Master服務基於Raft協議構建,形成各自的分布式服務。

YB-Tserver

YB-Tserver是YugabyteDB Tablet Server的簡稱,負責存儲用戶數據,並處理用戶所有的查詢請求。

如下是一個4節點的YugabyteDB universe示例,其中一個表有16個tablet,復制系數是3。

 每個tablet對應的tablet-peers存儲在不同的YB-Tserver上共同組成一個Raft組,在彼此之間復制數據。在每個YB-Tserver上都有一些策略來協調tablet的放置位置,以便最大化提高資源利用率,下面是一些協調策略:

(1)服務器全局塊緩存

塊緩存在一個YB-Tserver上的所有的tablets之間共享,當一個tablet的讀取頻率明顯高於其他tablet時,可以明顯提供緩存的利用率。

(2)空間放大

YugabyteDB的壓縮是大小分層的。與分級壓縮相比,按大小分層壓縮的寫放大率更低。可能有人擔心大小分層壓縮的寫入放大率更大,因為需要50%的頭部空間。但這在YugabyteDB中是不正確的,因為每個表被分成多個tablet,並且每個tablet之間的並發壓縮被限制在某個最大值,YugabyteDB中的典型寫放大在10%~20%的范圍內。

(3)節流壓縮

在給定的YB-Tserver中,通過tablet對壓縮進行節流,以防止壓縮風暴,這可以防止壓縮風暴期間的高延遲。默認策略會保證壓縮是值得的,確保被壓縮的文件大小不會相差太大,比如把1GB文件和100GB文件壓縮在一起是沒有意義的,會產生大量不必要的IO。

(4)小型和大型壓縮隊列

壓縮被划分為大壓縮和小壓縮,並具有一定的優先級,比如小壓縮的優先級高於大壓縮,以便在極端IO模式下也能保證系統的性能。

(5)手動壓縮

用戶執行compact_table命令觸發壓縮,用於數據不再更新時,回收磁盤空間。

(6)服務器全局內存存儲限制

比如一個YB-Tserver中有多個tablet,但是其中一個tablet的寫入量比其他tablet多的多,如果每個tablet的內存使用都有限制,則可增大寫入量多的tablet允許使用的內存,以便實現更好的寫性能。

(7)自動調整塊緩存和內存大小

基於系統當前可用內存,YB-Tserver會自動將總可用內存的一定比例分配給塊緩存,並將另外一定比例分配給memstore。

(8)tablet跨數據磁盤均勻加載

在多SSD機器上,讓每個表的SSTable和WAL在SSD上均勻分布,確保每個SSD處理每個表的負載量相等。

YB-Master

YB-Master是YugabyteDB Master Server的簡稱,負責存儲系統元數據,協調系統范圍內的操作,比如create/alter/drop表,以及啟動維護操作,比如負載均衡。

 (1)協調universe范圍內的管理操作

比如用戶發起的create table、alter table和drop table請求,YB-Master保證將這些操作傳播到所有的tablet,而不管這些tablet所在YB-Tserver服務器的狀態如何,這一點非常重要,因為這些全universe范圍內的操作之一正在進行時,YB-Tserver出現故障不會因為在某個tablet上無法應用而影響請求的結果。

(2)存儲系統元數據

每個YB-Master存儲的系統元數據包括,命名空間、表、角色、權限、tablet屬於哪個YB-Tserver。這些系統信息使用Raft協議在YB-Master之間復制,系統元數據存儲在DocDB的一個表中。

(3)給YB-Tserver分配tablet

YB-Master存儲了所有tablet和所屬YB-Tserver的對應的關系,client向YB-Master查詢對應關系,並緩存,這樣client可以直接連接對應的YB-Tserver,用於各種查詢,而不會產生額外的網絡開銷。

(4)后台操作

數據放置和負載均衡。

Leader均衡,除了確保每個YB-Tserver服務的tablet數量均衡外,YB-Master還確保每個符合條件的節點上有對稱數量的tablet的Leader。

在擴展的YB-Tserver故障時,重新復制數據,YB-Master接收來自所有YB-TServers服務器的心跳,並確認他們是否正常,如果在設定的閾值范圍內,YB-Master沒有收到某個YB-Tserver的心跳,則認為該YB-Tserver故障,並開始查找替換的YB-Tserver服務器,將故障YB-Tserver服務器上的數據復制到新選擇的YB-Tserver服務器上,為了不影響前台操作的性能,YB-Master以節流的方式進行數據復制。

Universe vs Cluster

一個YugabyteDB Universe只包含一個主集群和零個或多個讀取副本集群。

(1)主集群可以執行寫操作和讀操作。主群集中節點之間的復制是同步執行的。

(2)讀取副本群集只能執行讀操作。發送到讀取副本群集的寫入將自動重新路由到universe的主群集。這些集群有助於在遠離主集群且具有時間軸一致性數據的區域中為讀操作提供數據。這確保了地理分布應用程序的低延遲讀取。通過從主集群進行異步復制,將數據引入讀取副本集群。換句話說,讀取副本群集中的節點充當Raft觀察者,不參與主群集中存在的Raft Leader和Raft Follower的寫入路徑。

Yugabyte Query layer(YQL)

Yugabyte查詢層(YQL)是Yugabyte數據庫的上層。應用程序使用客戶端驅動程序直接與YQL交互。該層處理特定於API的方面,如查詢/命令編譯和運行時(數據類型表示、內置操作等)。YQL的構建考慮了可擴展性,並允許添加新的API。目前,YQL支持兩種風格的分布式SQL API,即YSQL和YCQL。

 每個YB TServer都配置為在不同的端口上支持這些協議。端口5433是YSQL的默認端口,9042是YQL的默認端口。

從應用程序的角度來看,這是一個無狀態層,客戶端可以連接到相應端口上的任何(一個或多個)YB Tserver,以對YugabyteDB集群執行操作。

每個YB TServer內部的YQL實現了每個API所需支持的協議,但最終使用DocDB復制、存儲和檢索數據,DocDB是YugabyteDB通用的底層強一致性分布式存儲。YQL中每個API的一些子組件包括:

(1)一種“語句緩存”,用於緩存已編譯語句或已准備語句的執行計划,以避免與語句重復解析相關的開銷。

(2)命令解析器和執行層。

(3)支持特定語言的內置操作、數據類型編碼等。

DocDB Document Store

DocDB是一個分布式文檔存儲。它具有以下屬性:

(1)強寫入一致性

(2)容忍故障的極致彈性

(3)自動分片和負載均衡

(4)Zone/region/cloud數據放置策略

(5)可調讀一致性

DocDB中的數據存儲在表中。每個表由行組成,每行包含一個鍵和一個文檔。以下是一些要點:

Sharding

數據存儲在DocDB的表中。DocDB表通常分為多個tablets。這種表切分對用戶是透明的。

 Replication

每個包含用戶數據的tablet都使用Raft共識算法根據某些復制因子進行復制。復制是在tablet級別執行的,即使出現故障,也能確保單行線性化。

 Persistence

為了持久化數據,使用了日志結構的面向行/文檔的存儲。它包括幾個優化,用於高效地處理不斷增長的數據集。

Transactions

DocDB支持單行和多行事務。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM