本篇作為MD-SAL核心內容的第二篇,我們將從OpenDaylight的數(shù)據(jù)存型、DataStore是什么,如何實現(xiàn)等幾個方面進行介紹。

圖片來自網絡
一、OpenDaylight需要的數(shù)據(jù)存儲
1.1數(shù)據(jù)庫簡單介紹
我們熟知的軟件系統(tǒng)有學校的“圖書館管理系統(tǒng)”,企業(yè)里面的“客戶關系管理系統(tǒng)”,這些系統(tǒng)本質上只需要易操作就可以了,不需要高并發(fā),這種系統(tǒng)的典型架構如下圖所示:

我們注意到這些系統(tǒng)都包含一個數(shù)據(jù)庫。而提到數(shù)據(jù)庫,我們可能先想到的是MySql、oracle之類的關系型數(shù)據(jù)庫,有人可能還會想到MangoDB、redis的非關系型數(shù)據(jù)庫,使用Java語言編程的人員可能會想到ehcache、memcache等緩存數(shù)據(jù)庫。如下圖所示:

我們來看下什么是內存數(shù)據(jù)庫?在Wiki上,我們可以看到:“內存數(shù)據(jù)庫(in-memory database,IMDB),也稱為主內存數(shù)據(jù)庫系統(tǒng)或內存駐留數(shù)據(jù)庫,是一種數(shù)據(jù)庫管理系統(tǒng),主要依賴主存儲器進行計算機數(shù)據(jù)存儲。它與采用磁盤存儲機制的數(shù)據(jù)庫管理系統(tǒng)形成對比。內存數(shù)據(jù)庫比磁盤優(yōu)化數(shù)據(jù)庫更快,因為磁盤訪問比內存訪問慢,內部優(yōu)化算法更簡單,執(zhí)行的CPU指令更少”。事實上,在具有實時計費能力的電信運營商,采用的基本上都是內存數(shù)據(jù)庫。它的好處是訪問速度快,一般來說,內存數(shù)據(jù)庫要比磁盤數(shù)據(jù)庫快10000倍。不好之處在于
數(shù)據(jù)是直接存在系統(tǒng)主內存中,如果內存數(shù)據(jù)庫重啟或崩潰后,可能會導致數(shù)據(jù)全部丟失。所以內存數(shù)據(jù)庫很重要的一點就是如何保證數(shù)據(jù)的安全可靠,并能在出現(xiàn)問題時能夠快速恢復數(shù)據(jù)。
1.2 OpenDaylight能力需求
SDN起源于校園網,發(fā)揚光大于數(shù)據(jù)中心,現(xiàn)廣泛用于廣域網,SDN控制器,可能管理著數(shù)十萬臺軟交換機,下發(fā)數(shù)百萬乃至上千萬條路由信息。因此,作為SDN控制器的開源項目OpenDaylight,無論是業(yè)務邏輯還是數(shù)據(jù)存儲,都需要具備如下能力:
l高并發(fā):支持大規(guī)模的網絡設備控制、網絡路由計算和生成、海量的業(yè)務消息處理;
l高可靠:在控制器軟硬件發(fā)生故障時,依然能夠對外提供服務;
l實時性:SDN網絡能夠做到秒級或毫秒級的收斂;
1.3 OpenDaylight存儲選型
從上面的分析可知,OpenDaylight選用內存數(shù)據(jù)庫極為合適。下面我們來看下OpenDaylight的存儲選型:
Lithium 版本之前 ,OpenDaylight采用基于AD-SAL的架構設計,數(shù)據(jù)存儲采用的是Infinispan。它是基于內存的分布式鍵值存儲系統(tǒng)。那么,如何理解鍵值存儲呢?可以簡單地將理解為“鍵與值的映射”,在內存中的具體形式體現(xiàn)HashMap和有序樹。Infinispan可以作為一個Java Lib進行使用,也可以通過一系列主流的遠程協(xié)議方式(如REST、WebSockets)來提供獨立的服務。
Ininispan包可通過Maven的方式獲取,Infinispan jar包含所需的OSGi manifest headers,可以作為OSGi包OSGi運行時環(huán)境中使用。 除此之外,還需要安裝所需的第三方依賴項。詳細安裝方法可參照:
http://infinispan.org/docs/9.3.x/getting_started/getting_started.html
Lithium版本之后, OpenDaylight轉向基于MD-SAL的架構設計,存儲實現(xiàn)也相應的轉為DataStore。
二、如何理解DataStore?
2.1DataStore是什么
在OpenDaylight控制器中,使用YANG作為建模語言,用于對數(shù)據(jù)存儲的內容和行為進行建模,YANG可以轉換成XML的格式。作為MD-SAL核心的Datastore實現(xiàn)了W3C DOM Document樹,并使用XML進行數(shù)據(jù)的表示。需要說明的一點:DataStore并不是完全基于XML的,OpenDaylight子項目YANGTools提供了優(yōu)化YANG XML并使其適應XML DOM的模塊。
DataStore由DataTree組成,Yang定義了該樹的地址空間,由根節(jié)點、葉子節(jié)點和內部節(jié)點組成,如下圖所示:

圖片來自網絡
而DataTree分為兩個邏輯數(shù)據(jù)存儲:operational和config。這兩部分都有統(tǒng)一的視圖,并且可以使用實例標識符InstanceIdentifier來定位特定節(jié)點。如下圖所示:

圖片來自網絡
2.2DataStore如何實現(xiàn)?
2.2.1如何進行并發(fā)控制?
數(shù)據(jù)庫中經常發(fā)生并發(fā)的場景:應用邏輯A在讀取數(shù)據(jù)的同時,應用邏輯B可能正在寫入數(shù)據(jù),應用邏輯A就可能讀到不一致的數(shù)據(jù),也就是臟讀。為了解決上述出現(xiàn)的問題,實現(xiàn)并發(fā)控制,大家想到最簡單的方法便是加鎖,讓所有讀數(shù)據(jù)的應用程序等待寫數(shù)據(jù)的應用程序工作完成,這相當于串行工作,效率非常低。現(xiàn)在大多數(shù)據(jù)庫實現(xiàn)的是MVCC(Multi-Version Concurrency Control,多版本并發(fā)控制機制),基本思想是通過對同一份數(shù)據(jù)保持多版本來并發(fā)問題,在不加鎖的情況下,實現(xiàn)讀與寫事務完成隔離。具體機制是:
l當應用邏輯需要讀取或更新數(shù)據(jù)時,數(shù)據(jù)庫會創(chuàng)建該數(shù)據(jù)的快照,數(shù)據(jù)庫中存在同一份數(shù)據(jù)的多個版本。
l每個應用邏輯擁有一份獨立快照,數(shù)據(jù)更新在沒有完全提交之前,其他應用邏輯不可見。
l數(shù)據(jù)庫會定期清理舊版本數(shù)據(jù),以最新版本數(shù)據(jù)替換主數(shù)據(jù)。
l數(shù)據(jù)庫讀通過timestamp 或 transaction id 來標識數(shù)據(jù)最新的版本。
但如果是多個寫事務并發(fā),則有可能發(fā)生沖突,可通過樂觀鎖來解決。
同時,我們從第一部分分析OpenDaylight能力需求中可以看出,OpenDaylight內存數(shù)據(jù)庫DataStore需要具備高并發(fā)、高性能的能力,DataStore同樣實現(xiàn)了MVCC。如果對MVCC感興趣,可以閱讀《數(shù)據(jù)庫村的旺財和小強》。
2.2.2 如何實現(xiàn)高可靠?
DataStore作為內存數(shù)據(jù)庫,在遇到突然斷電或系統(tǒng)宕機的情況,將會是毀滅性的。因此,需要定時將數(shù)據(jù)保存到硬盤里面,也就是要做持久化的操作。
DataStore持久化的實現(xiàn)機制是在控制器啟動時對其創(chuàng)建快照,并在后續(xù)操作過程記錄日志。我們查看控制器的部署目錄,snapshots目錄用來保存快照,而journal目錄用來操作日志信息,如下圖所示:

現(xiàn)在我們將snapshots和journal目錄中的文件刪除掉,然后重啟OpenDaylight控制器,觀察目錄中又重新生成對應的文件:

當發(fā)生斷電或宕機等情況后,將取這兩個目錄的文件,恢復內存數(shù)據(jù)庫。
事實上,上述實現(xiàn)是EV(Event Sourcing,事件溯源)思想的實現(xiàn),下面我們大致介紹下EV:生活中最常見的例子就是電信運營商業(yè)務中的繳費、扣費、調賬、轉賬以及退款等業(yè)務流程,BOSS系統(tǒng)中會記錄每一筆交易發(fā)生的詳細信息,從而能夠得到某個時間點用戶的“錢”是多少。因此,EV也就是將數(shù)據(jù)的增刪改查每一操作都按照順序記錄,順次保存在日志文件中,如果想回到某個時間點的狀態(tài),則可以順次回放就可以了。
具體到DataStore內存數(shù)據(jù)庫,將多個操作封裝到一個事務中,并生成本次事務的操作樹,持久化時按照操作日志的順序記錄下來就可以了。
2.2.3 如何實現(xiàn)高性能?
面對海量數(shù)據(jù),數(shù)據(jù)庫系統(tǒng)采用分庫、分表、分區(qū)、分片等手段來實現(xiàn)高性能,DataStore使用了分片(Sharding)技術。
YANG建模的DataStore是一個樹型結構。一個分片就是一個子樹。子樹之間如果存在包含關系,則被包含的子樹作為一個獨立的分片,事實上是從根節(jié)點按照最長路徑匹配其父路徑所指定的分片。整個大樹是Default分片,Shard1作為一個新分片后,Default分片將不包含Shard1部分的數(shù)據(jù),其分片類同。當啟用集群后,一個分片可以位于多臺機器上。如下圖所示:

2.3DataStore如何訪問?
MD-SAL中使用DataBroker訪問DataStore:

具體的訪問方式如下所示:

-
路由
+關注
關注
0文章
284瀏覽量
43689 -
廣域網
+關注
關注
1文章
261瀏覽量
22803 -
sdn
+關注
關注
3文章
257瀏覽量
46704
發(fā)布評論請先 登錄
TP-EIQ-BRING-YOUR-OWN-DATA-BYOD沒有名為“deepview”的模塊是怎么回事?
Vmware OVA 6.7模板導入6.5報錯模塊Nvman”打開電源失敗處理方法
如何從零開始學OpenDaylight
什么是OpenDaylight的Maven
OpenDaylight中的OSGi
OpenDaylight中的Karaf
OpenDaylight中的YANG
OpenDaylight中的RPC & Notification是什么
OpenDaylight中的MD-SAL是什么
OpenDaylight中的DataStore是什么
評論