科普—Snowflake Architecture
傳統(tǒng)的數(shù)據(jù)平臺(tái)架構(gòu)
Shared-Disk 架構(gòu)
shared-disk 是一種早期的架構(gòu),將數(shù)據(jù)存儲(chǔ)在一個(gè)中央存儲(chǔ)位置,并可從多個(gè)數(shù)據(jù)庫集群節(jié)點(diǎn)訪問。每個(gè)集群節(jié)點(diǎn)訪問的數(shù)據(jù)是一致可用的,因?yàn)樗袛?shù)據(jù)修改都被寫入共享磁盤。
這是一種很傳統(tǒng)的數(shù)據(jù)庫設(shè)計(jì),以其數(shù)據(jù)管理的簡(jiǎn)單性而聞名。雖然該方法在理論上很簡(jiǎn)單,但它需要復(fù)雜的磁盤鎖定機(jī)制來確保數(shù)據(jù)一致性,這反過來容易造成瓶頸。
數(shù)據(jù)并發(fā)性,即允許多個(gè)用戶在數(shù)據(jù)庫中影響多個(gè)事務(wù),也是一個(gè)主要問題,在 shared-disk 架構(gòu)中增加更多的計(jì)算節(jié)點(diǎn)只會(huì)加劇這個(gè)問題。因此,這種架構(gòu)的真正可擴(kuò)展性是有限的。
圖片
Oracle RAC 是典型的 shared-disk 架構(gòu)。
Shared-Nothing 架構(gòu)
shared-noting 架構(gòu),每個(gè)節(jié)點(diǎn)都有自己的 CPU、內(nèi)存和磁盤,并且一般通過網(wǎng)絡(luò)層進(jìn)行節(jié)點(diǎn)之間的通信,計(jì)算節(jié)點(diǎn)可以自由獨(dú)立擴(kuò)展,規(guī)避了 shared-disk 的集中式存儲(chǔ)瓶頸。
圖片
常見的 shared-nothing 架構(gòu)的數(shù)據(jù)庫有 DB2、Vertica、Greenplum。
Snowflake Architecture
Snowflake 團(tuán)隊(duì)采取了獨(dú)特的方法。他們不是試圖逐步改進(jìn)或轉(zhuǎn)換現(xiàn)有的軟件架構(gòu),而是構(gòu)建了一個(gè)全新的、專為云端設(shè)計(jì)的現(xiàn)代數(shù)據(jù)平臺(tái),允許多個(gè)用戶同時(shí)共享實(shí)時(shí)數(shù)據(jù)。
獨(dú)特的 Snowflake 設(shè)計(jì)在物理上將存儲(chǔ)和計(jì)算進(jìn)行了分離,但在邏輯上進(jìn)行了集成,并提供了安全和管理等服務(wù)。
Snowflake 混合模型架構(gòu)由三個(gè)層組成:元數(shù)據(jù)服務(wù)層、計(jì)算層和數(shù)據(jù)存儲(chǔ)層。
圖片
The Cloud Services Layer
與 Snowflake 實(shí)例中的數(shù)據(jù)的所有交互都始于 Cloud Service 層,又被稱為全局服務(wù)層。
Snowflake Cloud Service 層是一組服務(wù),用于協(xié)調(diào)身份驗(yàn)證、訪問控制和加密等活動(dòng)。它還包括用于處理一些基礎(chǔ)設(shè)施和元數(shù)據(jù)的管理功能,以及執(zhí)行查詢解析和優(yōu)化器等功能。
Cloud Service 層有時(shí)被稱為 Snowflake 的"大腦",因?yàn)樗胁煌姆?wù)層組件共同工作,處理用戶從請(qǐng)求登錄開始的請(qǐng)求。
圖片
每當(dāng)用戶請(qǐng)求登錄時(shí),該請(qǐng)求由 Cloud Service 層處理。當(dāng)用戶提交一個(gè) Snowflake 查詢時(shí),SQL 查詢將首先發(fā)送到Cloud Service 層優(yōu)化器,然后再發(fā)送到計(jì)算層進(jìn)行處理。Cloud Service 層是使得可以在數(shù)據(jù)上進(jìn)行數(shù)據(jù)定義語言(DDL)和數(shù)據(jù)操作語言(DML)操作的SQL客戶端接口的核心。
The Query Processing (Virtual Warehouse) Compute Layer
Snowflake 的計(jì)算集群,通常也叫做虛擬數(shù)倉(Virtual Warehouse),是一個(gè)由 CPU、內(nèi)存、和臨時(shí)存儲(chǔ)組成的動(dòng)態(tài)資源集群,用戶可以自由創(chuàng)建計(jì)算集群,Snowflake 在后臺(tái)進(jìn)行調(diào)度分配資源。
圖片
Snowflake 獨(dú)特的架構(gòu)允許存儲(chǔ)和計(jì)算分離,這意味著任何一個(gè) Virtual Warehouse 都可以訪問與其他 Virtual Warehouse 相同的數(shù)據(jù),而不會(huì)產(chǎn)生沖突或?qū)ζ渌?warehouse 的性能造成影響。這是因?yàn)槊總€(gè) Snowflake 的 Virtual Warehouse 都是獨(dú)立運(yùn)行、無狀態(tài)的,不與其他 Virtual Warehouse 共享計(jì)算資源。
在一個(gè) session 中運(yùn)行時(shí),Virtual Warehouse 總是會(huì)消耗計(jì)算配額。
然而,Snowflake Virtual Warehouse 可以隨時(shí)啟動(dòng)和停止,并且可以在運(yùn)行時(shí)隨時(shí)調(diào)整大小。Snowflake 支持兩種不同擴(kuò)展方式。Virtual Warehouse 可以通過調(diào)整 warehouse 的大小來進(jìn)行垂直擴(kuò)展,也可以通過向 warehouse 添加集群來進(jìn)行水平擴(kuò)展。可以同時(shí)使用這兩種擴(kuò)展方法,也 可以只使用其中一種。
Scaling Up
在創(chuàng)建計(jì)算集群的時(shí)候,可以指定其大小,這個(gè)大小主要表示了 warehouse 所占的服務(wù)器資源,size 越大,計(jì)算資源越多,計(jì)算性能也就越強(qiáng)。
Virtual Warehouse 可以擴(kuò)展其大小,這一般也叫做 scaling up,在處理一些復(fù)雜的任務(wù)時(shí)可以對(duì)其進(jìn)行調(diào)整。
圖片
Scaling Out
Virtual Warehouse 還可以擴(kuò)展其集群的數(shù)量,進(jìn)一步提升計(jì)算性能,這種擴(kuò)展方式叫做 scaling out。
圖片
計(jì)算集群可以被隨意創(chuàng)建,并且任意擴(kuò)展,這帶來了一個(gè)極大的好處便是可以將不同的 workload 分配到不同的 warehouse 中,并且共享底層的數(shù)據(jù)存儲(chǔ)。
圖片
Centralized (Hybrid Columnar) Database Storage Layer
Snowflake 的集中式數(shù)據(jù)庫存儲(chǔ)層包含所有的數(shù)據(jù),例如結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)。
當(dāng)數(shù)據(jù)加載到Snowflake時(shí),它會(huì)被優(yōu)化重新組織為一種壓縮的列格式,并存儲(chǔ)和維護(hù)在 Snowflake 數(shù)據(jù)庫中。每個(gè)Snowflake 數(shù)據(jù)庫由一個(gè)或多個(gè) schema 組成,schema 是數(shù)據(jù)庫對(duì)象(如表和視圖)的邏輯分組。
圖片
存儲(chǔ)在 Snowflake 數(shù)據(jù)庫中的數(shù)據(jù)始終是經(jīng)過壓縮和加密的。Snowflake 負(fù)責(zé)管理數(shù)據(jù)存儲(chǔ)的每個(gè)方面。Snowflake會(huì)自動(dòng)將存儲(chǔ)的數(shù)據(jù)組織成微型分區(qū),這是一種經(jīng)過優(yōu)化、不可變的壓縮列格式,并使用 AES-256 進(jìn)行加密。
Snowflake 通過優(yōu)化和壓縮數(shù)據(jù),使元數(shù)據(jù)提取和查詢處理更加簡(jiǎn)單和高效,每當(dāng)用戶提交一個(gè) Snowflake 查詢時(shí),該查詢會(huì)先經(jīng)過 Cloud Service 層的優(yōu)化器,然后再發(fā)送到計(jì)算層進(jìn)行處理。
Snowflake 的數(shù)據(jù)存儲(chǔ)層有時(shí)被稱為遠(yuǎn)程磁盤層,底層文件系統(tǒng)是在 AWS、Google Cloud 或 Microsoft Azure 上實(shí)現(xiàn),數(shù)據(jù)存儲(chǔ)時(shí)使用的特定提供商是在創(chuàng)建 Snowflake 賬戶時(shí)選擇的。
Snowflake不限制您存儲(chǔ)的數(shù)據(jù)量、創(chuàng)建的數(shù)據(jù)庫數(shù)量或數(shù)據(jù)庫對(duì)象數(shù)量。Snowflake 表可以輕松存儲(chǔ) PB 級(jí)別的數(shù)據(jù)。在 Snowflake 賬戶中,隨著存儲(chǔ)的增加或減少,不會(huì)對(duì)虛擬倉庫的大小產(chǎn)生影響。這兩者獨(dú)立于彼此和云服務(wù)層進(jìn)行擴(kuò)展。
Snowflake Caching
Snowflake 在 Cloud Service 和 Virtual Warehouse 層都有對(duì)應(yīng)的緩存策略,主要是為了能夠避免頻繁訪問遠(yuǎn)端 S3
存儲(chǔ),加速查詢性能。
Result Cache
從Snowflake檢索數(shù)據(jù)的最快方式是使用 Result Cache。Snowflake 查詢的結(jié)果會(huì)被緩存或持久化保存24小時(shí),然后被清除。但每次重新執(zhí)行查詢時(shí),時(shí)間會(huì)被重置,最長可以從首次執(zhí)行查詢的日期和時(shí)間開始計(jì)算,持續(xù)31天。在31天之后,或者如果基礎(chǔ)數(shù)據(jù)發(fā)生變化,則在再次提交查詢時(shí)生成并緩存新的結(jié)果。
查詢結(jié)果緩存由 Snowflake 的 Cloud Service 層管理,并且可以被所有的計(jì)算集群所共享。
圖片
Metadata Cache
在 Cloud Service 層中還維護(hù)了一個(gè)元數(shù)據(jù)緩存層 Metadata Cache,Snowflake 收集和管理有關(guān)表、分區(qū)等元數(shù)據(jù)。對(duì)于表,Snowflake 存儲(chǔ)行計(jì)數(shù)、表的字節(jié)大小、文件引用和表版本。因此,在運(yùn)行 SELECT COUNT(*) 查詢時(shí),不需要運(yùn)行 Virtual Warehouse,因?yàn)橛?jì)數(shù)統(tǒng)計(jì)信息保存在元數(shù)據(jù)緩存中。
圖片
Virtual Warehouse Local Disk Cache
在計(jì)算層中,Virtual Warehouse 中還維護(hù)了本地磁盤緩存。
圖片
每當(dāng)一個(gè)虛擬倉庫接收到要執(zhí)行的查詢時(shí),它將首先掃描本地 SSD 磁盤緩存,然后再訪問 Snowflake 遠(yuǎn)程磁盤存儲(chǔ)。從 SSD 讀取速度比從數(shù)據(jù)庫存儲(chǔ)層讀取速度快,但仍需要運(yùn)行虛擬倉庫來完成操作。