高吞吐低延遲的 NoSQL 數(shù)據(jù)庫——Scylla 3.0 發(fā)布
開源 NoSQL 數(shù)據(jù)庫 Scylla Open Source 發(fā)布第 3 個主要版本更新,這個版本提高了查詢效率并減少存儲的容量需求,盡可能降低維護時間,同時也還加強了整體數(shù)據(jù)庫的執(zhí)行效率,官方表示,Scylla 是目前性能***的 NoSQL 數(shù)據(jù)庫,包括布署于生產(chǎn)環(huán)境的 Apache Cassandra 都不是對手。
2015 年發(fā)展至今,以 C++ 從頭打造的開源 NoSQL 數(shù)據(jù)庫 Scylla,其基礎(chǔ)設(shè)計與 Apache Cassandra 數(shù)據(jù)庫兼容,并提供相同的橫向擴展和容錯能力,但官方提到,其吞吐量可以是 Apache Cassandra 的 10 倍,并維持一致且個位數(shù)毫秒的延遲時間。
Scylla Open Source 3.0 加入了實例化視圖(Materialized Views)功能,將不同磁區(qū)找尋數(shù)據(jù)的復雜性,從應(yīng)用程序移到服務(wù)器上,因此實例將會更快也更可靠,這個方法讓應(yīng)用程序更容易對數(shù)據(jù)進行多重審查。實例化視圖讓應(yīng)用程序只需要聲明額外的視圖,Scylla 會產(chǎn)生新的視圖表格,并且在每一次更新基礎(chǔ)表格(Base table)時,視圖表格也會隨之自動更新,寫入動作僅直接發(fā)生在基礎(chǔ)表格上,而讀取動作則是對視圖表格。官方提到,一如往常的 Scylla 與 Apache Cassandra 版本兼容,包括這項功能更新與 CQL 語法。
另外,Scylla Open Source 3.0 也添加了已可用于生產(chǎn)的全局輔助索引(Global Secondary Indexes)功能,能夠擴展至任何大小的分布式集群。全局輔助索引利用低端的實例化視圖索引,以使索引不相依于集群節(jié)點數(shù)。而輔助索引對大部分應(yīng)用程序來說是可見的,因此查詢能夠訪問表格中的所有字段,用戶可以在不更改應(yīng)用程序的情況下,添加或是刪除索引。
輔助索引能夠比實例化視圖索引花費較少的存儲成本,因為輔助索引只要復制索引的字段與主鍵值,而不像是實例化視圖索引必須復制查詢的字段,因此同樣的,輔助索引也能夠更高性能地執(zhí)行更新,因為唯有主鍵值和索引列字段的改變,才能觸發(fā)索引視圖中的更新。
官方提到,輔助索引或?qū)嵗晥D的使用時機,取決于應(yīng)用程序的需求,當開發(fā)者要求高性能并且需要對特定字段集進行查詢,則需要使用實例化視圖。然而,如果應(yīng)用程序需要查詢不同的字段集,輔助索引就會是更好的選擇,因為可以根據(jù)應(yīng)用程序的需求,以較少的存儲成本移除和增加查詢索引。
這個版本還支持了新的高性能存儲格式 SSTable,該格式與 Apache Cassandra 3.x 兼容,同時也與先前 Scylla 版本向后兼容,而且少掉了復制作業(yè)中不需要的重復數(shù)據(jù),能最多減少 3 倍存儲容量。官方提到,新布署的 Scylla Open Source 3.0 數(shù)據(jù)庫將自動使用新格式,而既保存案不受影響。
另外,Hinted Handoff 功能則可以幫助節(jié)點因大量寫入負載、硬件故障或是任何因素造成暫時無法回應(yīng)的情況,當發(fā)生短暫網(wǎng)絡(luò)問題或是節(jié)點重啟的時候,Hinted Handoff 將能幫助減少系統(tǒng)修復的時間,進而提升分布式布署的整體性能。
官方解釋,提示(Hint)代表著寫入請求的紀錄,這分紀錄會由協(xié)調(diào)器留存,直到故障節(jié)點再次連上線。而且當寫入成功但一個或多個副本皆無法確認的時候,Scylla 會也會產(chǎn)生一個提示,在這些節(jié)點恢復時,重新寫入數(shù)據(jù)。這個功能在 Scylla Open Source 2.1 中屬實驗性質(zhì),而在 Scylla Open Source 3.0 終于正式加入了。
在整體執(zhí)行性能方面,Scylla Open Source 3.0 也改進了多重磁區(qū)掃描,Scylla 通過擴展有狀態(tài)分頁以支持范圍掃描,在新版本中加入了新的控制算法,加速從所有分片讀取范圍中的所有數(shù)據(jù),這些分片緩存了分片上的中介串流,并將分頁查詢引導到先前使用的配對緩存結(jié)果上。簡單來說,新算法的本質(zhì)是一個多工器,在分片上結(jié)合讀取器輸出到單一串流中。