淺析Oracle NoSQL Database
近日Oracle提供了不久前公布的NoSQL數據庫的下載,目前只有企業版,開源的社區版還沒提供,也就是說還看不到源碼。不過根據文檔也能大致了解這個NoSQL數據庫怎么樣。快速看了看,總結如下。
一、數據模型
key包含一到多個major key component和零到多個minor key component,組合起來唯一標準一條記錄。key component為Java String,按對應encoding排序。value則是字節流。key和value的大小都沒有嚴格限制。
記錄還有版本號,每次更新都產生唯一的新版本號。在put/delete/get操作時,都可以指定要版本號,其中get時用于指定要讀的版本,而 put/delete指定版本號是指當記錄的最新版本還是指定版本時才更新,用于實現原子Compare-and-Swap語義。版本號應該至少是在一個 partition內部是全局唯一的。
二、分區與架構
兩層架構,客戶端直接到存儲節點。核心架構是Replication Node和Replication Group,一個Replication Group包含一個可寫的Master Replication Node和多個只讀的replica。master失敗時會failover到某replica。現在發布的版本暫時還不能動態調整存儲節點個數,以后會加。
數據按major key hash分區到partition。這樣擁有相同的major key僅僅minor key不同的多條記錄一定在同一partition,可以提供高效的多記錄操作,且系統還支持原子性的操作這樣的多條記錄。一個Replication Group一般負責多個partition,一個存儲節點一般負責一個Replication Node,如果調整存儲節點個數,則以partition為單位來移動數據。為方便以后scale-out,應該一開始就多一些partition。
系統底層用的是Berkeley DB Java Edition,用Btree數據結構。緩存包含Berkeley DB的緩存和文件系統緩存,不用DIRECT_IO,文檔建議Berkeley DB緩存用于容納Btree的內部節點,葉節點用文件系統緩存。另外也提供單機版稱為KVLite。
三、操作
Oracle NoSQL提供的操作比較豐富,主要包括:
1、用于插入或更新記錄的put類操作,包括put/putIfAbsent/putIfPresent/putIfVersion,都要指定一個完整的Key。用途顧名思義就不說了,稍提一點是putIfVersion功能提供了Compare-and-Swap,在處理并發時很有用
2、用于刪除記錄的delete類操作,包括delete/deleteIfVersion/multiDelete。前兩者要指定完整Key,用途顧名思義。說一下multiDelete,這個操作最多可以指定三個參數,一是必須指定完整的major key,二是可以指定一個由第一個minor key的上下限構成的KeyRange,三是可以指定是刪除子節點/子孫節點/父節點和子節點/父節點和子孫節點等多種Depth模式。
3、用于讀取記錄的get類操作,包括get/multiGet/multiGetIterator/storeIterator。multiGet和 multiDelete一樣可以指定KeyRange和Depth。multiGetIterator用于批量取一個完整major key下的大量記錄,防止占內存過多,可以指定遍歷方向,不保證數據是某時刻的一致視圖。storeIterator用于遍歷不完整major key下的大量記錄,甚至遍歷所有記錄。
4、用于批量原子更新多條記錄的execute操作。系統保證這批操作的原子性,限制是操作的記錄必須都擁有相同的major key,且同一條記錄不能操作多次。
四、數據一致性
Oracle NoSQL的數據一致性比較靈活精細。就讀取而言,可以指定只從master讀、不管replica是否落后都可以從replica讀、只在 replica落后master時間在某閾值之內時才能從replica讀、只在replica的版本號不小于某指定版本號時才讀。指定版本號的讀一致性可以用于實現read-your-own-write形式的一致性,即保證自己能讀到自己剛寫的數據。
就更新而言,可以指定兩方面的策略。一是master要不要等各個replica的應答,這里可以選要所有replica應答、要大多數replica應答和不等replica應答等3 種。二是數據要不要持久化到磁盤,這里可以選不要(更新到內存就可以了)、寫磁盤但不SYNC、寫磁盤且要SYNC等3種。持久化策略可以指定 master和replica分別指定。根據文檔看似乎沒有用到2PC。
五、系統管理及其它
系統提供命令行或WEB界面的管理工具,管理比較方便。可以創建snapshot,snapshot只在partition內部一致,不保證全局一致。可以從snapshot恢復。提供將NoSQL Database數據導入到Hadoop功能。客戶端驅動是jar包。
六、小結與評價
優點:
1、數據模型和操作強大。通過由多個key component來構成key并且設計操作時加以支持,Oracle NoSQL實際上不再是純平面的Key-Value模型,而經常呈現為一種樹形模型。多一個key component后綴的記錄可以看作是子節點。系統提供了許多批量操作一個子樹的功能,對比關系模式可以看出這解決了一部分JOIN問題,提高了開發效率。
2、數據一致性靈活精細。讀取和更新都提供了很多一致性選項,可以實現不同的性能和一致性折衷。此外通過版本號,可以支持Compare-and-Swap、Read-your-own-write等語義,為實現并發正確性提供了便利。
3、支持多記錄原子性操作。
當前版本最主要的問題是不能加存儲節點,不過相信這個問題不久后會被解決。
原文出處:http://wangyuanzju.blog.163.com/blog/static/130292011919114541710/
【編輯推薦】