本篇作為MD-SAL核心內(nèi)容的第二篇,我們將從OpenDaylight的數(shù)據(jù)存型、DataStore是什么,如何實現(xiàn)等幾個方面進(jìn)行介紹。
圖片來自網(wǎng)絡(luò)
一、OpenDaylight需要的數(shù)據(jù)存儲
1.1數(shù)據(jù)庫簡單介紹
我們熟知的軟件系統(tǒng)有學(xué)校的“圖書館管理系統(tǒng)”,企業(yè)里面的“客戶關(guān)系管理系統(tǒng)”,這些系統(tǒng)本質(zhì)上只需要易操作就可以了,不需要高并發(fā),這種系統(tǒng)的典型架構(gòu)如下圖所示:
我們注意到這些系統(tǒng)都包含一個數(shù)據(jù)庫。而提到數(shù)據(jù)庫,我們可能先想到的是MySql、oracle之類的關(guān)系型數(shù)據(jù)庫,有人可能還會想到MangoDB、redis的非關(guān)系型數(shù)據(jù)庫,使用Java語言編程的人員可能會想到ehcache、memcache等緩存數(shù)據(jù)庫。如下圖所示:
我們來看下什么是內(nèi)存數(shù)據(jù)庫?在Wiki上,我們可以看到:“內(nèi)存數(shù)據(jù)庫(in-memory database,IMDB),也稱為主內(nèi)存數(shù)據(jù)庫系統(tǒng)或內(nèi)存駐留數(shù)據(jù)庫,是一種數(shù)據(jù)庫管理系統(tǒng),主要依賴主存儲器進(jìn)行計算機(jī)數(shù)據(jù)存儲。它與采用磁盤存儲機(jī)制的數(shù)據(jù)庫管理系統(tǒng)形成對比。內(nèi)存數(shù)據(jù)庫比磁盤優(yōu)化數(shù)據(jù)庫更快,因為磁盤訪問比內(nèi)存訪問慢,內(nèi)部優(yōu)化算法更簡單,執(zhí)行的CPU指令更少”。事實上,在具有實時計費(fèi)能力的電信運(yùn)營商,采用的基本上都是內(nèi)存數(shù)據(jù)庫。它的好處是訪問速度快,一般來說,內(nèi)存數(shù)據(jù)庫要比磁盤數(shù)據(jù)庫快10000倍。不好之處在于
數(shù)據(jù)是直接存在系統(tǒng)主內(nèi)存中,如果內(nèi)存數(shù)據(jù)庫重啟或崩潰后,可能會導(dǎo)致數(shù)據(jù)全部丟失。所以內(nèi)存數(shù)據(jù)庫很重要的一點(diǎn)就是如何保證數(shù)據(jù)的安全可靠,并能在出現(xiàn)問題時能夠快速恢復(fù)數(shù)據(jù)。
1.2 OpenDaylight能力需求
SDN起源于校園網(wǎng),發(fā)揚(yáng)光大于數(shù)據(jù)中心,現(xiàn)廣泛用于廣域網(wǎng),SDN控制器,可能管理著數(shù)十萬臺軟交換機(jī),下發(fā)數(shù)百萬乃至上千萬條路由信息。因此,作為SDN控制器的開源項目OpenDaylight,無論是業(yè)務(wù)邏輯還是數(shù)據(jù)存儲,都需要具備如下能力:
l高并發(fā):支持大規(guī)模的網(wǎng)絡(luò)設(shè)備控制、網(wǎng)絡(luò)路由計算和生成、海量的業(yè)務(wù)消息處理;
l高可靠:在控制器軟硬件發(fā)生故障時,依然能夠?qū)ν馓峁┓?wù);
l實時性:SDN網(wǎng)絡(luò)能夠做到秒級或毫秒級的收斂;
1.3 OpenDaylight存儲選型
從上面的分析可知,OpenDaylight選用內(nèi)存數(shù)據(jù)庫極為合適。下面我們來看下OpenDaylight的存儲選型:
Lithium 版本之前 ,OpenDaylight采用基于AD-SAL的架構(gòu)設(shè)計,數(shù)據(jù)存儲采用的是Infinispan。它是基于內(nèi)存的分布式鍵值存儲系統(tǒng)。那么,如何理解鍵值存儲呢?可以簡單地將理解為“鍵與值的映射”,在內(nèi)存中的具體形式體現(xiàn)HashMap和有序樹。Infinispan可以作為一個Java Lib進(jìn)行使用,也可以通過一系列主流的遠(yuǎn)程協(xié)議方式(如REST、WebSockets)來提供獨(dú)立的服務(wù)。
Ininispan包可通過Maven的方式獲取,Infinispan jar包含所需的OSGi manifest headers,可以作為OSGi包OSGi運(yùn)行時環(huán)境中使用。 除此之外,還需要安裝所需的第三方依賴項。詳細(xì)安裝方法可參照:
http://infinispan.org/docs/9.3.x/getting_started/getting_started.html
Lithium版本之后, OpenDaylight轉(zhuǎn)向基于MD-SAL的架構(gòu)設(shè)計,存儲實現(xiàn)也相應(yīng)的轉(zhuǎn)為DataStore。
二、如何理解DataStore?
2.1DataStore是什么
在OpenDaylight控制器中,使用YANG作為建模語言,用于對數(shù)據(jù)存儲的內(nèi)容和行為進(jìn)行建模,YANG可以轉(zhuǎn)換成XML的格式。作為MD-SAL核心的Datastore實現(xiàn)了W3C DOM Document樹,并使用XML進(jìn)行數(shù)據(jù)的表示。需要說明的一點(diǎn):DataStore并不是完全基于XML的,OpenDaylight子項目YANGTools提供了優(yōu)化YANG XML并使其適應(yīng)XML DOM的模塊。
DataStore由DataTree組成,Yang定義了該樹的地址空間,由根節(jié)點(diǎn)、葉子節(jié)點(diǎn)和內(nèi)部節(jié)點(diǎn)組成,如下圖所示:
圖片來自網(wǎng)絡(luò)
而DataTree分為兩個邏輯數(shù)據(jù)存儲:operational和config。這兩部分都有統(tǒng)一的視圖,并且可以使用實例標(biāo)識符InstanceIdentifier來定位特定節(jié)點(diǎn)。如下圖所示:
圖片來自網(wǎng)絡(luò)
2.2DataStore如何實現(xiàn)?
2.2.1如何進(jìn)行并發(fā)控制?
數(shù)據(jù)庫中經(jīng)常發(fā)生并發(fā)的場景:應(yīng)用邏輯A在讀取數(shù)據(jù)的同時,應(yīng)用邏輯B可能正在寫入數(shù)據(jù),應(yīng)用邏輯A就可能讀到不一致的數(shù)據(jù),也就是臟讀。為了解決上述出現(xiàn)的問題,實現(xiàn)并發(fā)控制,大家想到最簡單的方法便是加鎖,讓所有讀數(shù)據(jù)的應(yīng)用程序等待寫數(shù)據(jù)的應(yīng)用程序工作完成,這相當(dāng)于串行工作,效率非常低。現(xiàn)在大多數(shù)據(jù)庫實現(xiàn)的是MVCC(Multi-Version Concurrency Control,多版本并發(fā)控制機(jī)制),基本思想是通過對同一份數(shù)據(jù)保持多版本來并發(fā)問題,在不加鎖的情況下,實現(xiàn)讀與寫事務(wù)完成隔離。具體機(jī)制是:
l當(dāng)應(yīng)用邏輯需要讀取或更新數(shù)據(jù)時,數(shù)據(jù)庫會創(chuàng)建該數(shù)據(jù)的快照,數(shù)據(jù)庫中存在同一份數(shù)據(jù)的多個版本。
l每個應(yīng)用邏輯擁有一份獨(dú)立快照,數(shù)據(jù)更新在沒有完全提交之前,其他應(yīng)用邏輯不可見。
l數(shù)據(jù)庫會定期清理舊版本數(shù)據(jù),以最新版本數(shù)據(jù)替換主數(shù)據(jù)。
l數(shù)據(jù)庫讀通過timestamp 或 transaction id 來標(biāo)識數(shù)據(jù)最新的版本。
但如果是多個寫事務(wù)并發(fā),則有可能發(fā)生沖突,可通過樂觀鎖來解決。
同時,我們從第一部分分析OpenDaylight能力需求中可以看出,OpenDaylight內(nèi)存數(shù)據(jù)庫DataStore需要具備高并發(fā)、高性能的能力,DataStore同樣實現(xiàn)了MVCC。如果對MVCC感興趣,可以閱讀《數(shù)據(jù)庫村的旺財和小強(qiáng)》。
2.2.2 如何實現(xiàn)高可靠?
DataStore作為內(nèi)存數(shù)據(jù)庫,在遇到突然斷電或系統(tǒng)宕機(jī)的情況,將會是毀滅性的。因此,需要定時將數(shù)據(jù)保存到硬盤里面,也就是要做持久化的操作。
DataStore持久化的實現(xiàn)機(jī)制是在控制器啟動時對其創(chuàng)建快照,并在后續(xù)操作過程記錄日志。我們查看控制器的部署目錄,snapshots目錄用來保存快照,而journal目錄用來操作日志信息,如下圖所示:
現(xiàn)在我們將snapshots和journal目錄中的文件刪除掉,然后重啟OpenDaylight控制器,觀察目錄中又重新生成對應(yīng)的文件:
當(dāng)發(fā)生斷電或宕機(jī)等情況后,將取這兩個目錄的文件,恢復(fù)內(nèi)存數(shù)據(jù)庫。
事實上,上述實現(xiàn)是EV(Event Sourcing,事件溯源)思想的實現(xiàn),下面我們大致介紹下EV:生活中最常見的例子就是電信運(yùn)營商業(yè)務(wù)中的繳費(fèi)、扣費(fèi)、調(diào)賬、轉(zhuǎn)賬以及退款等業(yè)務(wù)流程,BOSS系統(tǒng)中會記錄每一筆交易發(fā)生的詳細(xì)信息,從而能夠得到某個時間點(diǎn)用戶的“錢”是多少。因此,EV也就是將數(shù)據(jù)的增刪改查每一操作都按照順序記錄,順次保存在日志文件中,如果想回到某個時間點(diǎn)的狀態(tài),則可以順次回放就可以了。
具體到DataStore內(nèi)存數(shù)據(jù)庫,將多個操作封裝到一個事務(wù)中,并生成本次事務(wù)的操作樹,持久化時按照操作日志的順序記錄下來就可以了。
2.2.3 如何實現(xiàn)高性能?
面對海量數(shù)據(jù),數(shù)據(jù)庫系統(tǒng)采用分庫、分表、分區(qū)、分片等手段來實現(xiàn)高性能,DataStore使用了分片(Sharding)技術(shù)。
YANG建模的DataStore是一個樹型結(jié)構(gòu)。一個分片就是一個子樹。子樹之間如果存在包含關(guān)系,則被包含的子樹作為一個獨(dú)立的分片,事實上是從根節(jié)點(diǎn)按照最長路徑匹配其父路徑所指定的分片。整個大樹是Default分片,Shard1作為一個新分片后,Default分片將不包含Shard1部分的數(shù)據(jù),其分片類同。當(dāng)啟用集群后,一個分片可以位于多臺機(jī)器上。如下圖所示:
2.3DataStore如何訪問?
MD-SAL中使用DataBroker訪問DataStore:
具體的訪問方式如下所示:
-
路由
+關(guān)注
關(guān)注
0文章
278瀏覽量
41946 -
廣域網(wǎng)
+關(guān)注
關(guān)注
1文章
246瀏覽量
21871 -
sdn
+關(guān)注
關(guān)注
3文章
254瀏覽量
44877
發(fā)布評論請先 登錄
相關(guān)推薦
![](https://file1.elecfans.com/web2/M00/84/5B/wKgZomRmBGeAE-NqAACiu3jMIgo820.png)
![](https://file1.elecfans.com/web2/M00/85/DD/wKgZomRmQj-AOdwIAACYNouAyBc015.png)
汽車車身控制與舒適性系統(tǒng)檢修:中控門鎖系統(tǒng)故障診斷和排除#汽車維修
![](https://file.elecfans.com/web2/M00/AD/6D/poYBAGSUeRuADs43AALKFWECK4U296.png)
TP-EIQ-BRING-YOUR-OWN-DATA-BYOD沒有名為“deepview”的模塊是怎么回事?
Vmware OVA 6.7模板導(dǎo)入6.5報錯模塊Nvman”打開電源失敗處理方法
![Vmware OVA 6.7模板導(dǎo)入6.5報錯模塊Nvman”打開電源失敗處理方法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
如何從零開始學(xué)OpenDaylight
![如何從零開始學(xué)<b class='flag-5'>OpenDaylight</b>](https://file.elecfans.com/web2/M00/91/27/pYYBAGPrJEOAQZQpAAEPdyndZQ4660.jpg)
什么是OpenDaylight的Maven
![什么是<b class='flag-5'>OpenDaylight</b>的Maven](https://file.elecfans.com/web2/M00/91/2D/pYYBAGPrMauAeJKTAAAp6PisAHU264.jpg)
OpenDaylight中的OSGi
![<b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的OSGi](https://file.elecfans.com/web2/M00/90/A9/poYBAGPrMi-AMpr5AACH6bGFhsw751.jpg)
OpenDaylight中的Karaf
![<b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的Karaf](https://file.elecfans.com/web2/M00/91/2D/pYYBAGPrMxCAe7wUAAB2kgkLXT4652.jpg)
OpenDaylight中的YANG
![<b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的YANG](https://file.elecfans.com/web2/M00/91/2E/pYYBAGPrM76APh3fAAB-Tov1LEc494.jpg)
OpenDaylight中的RPC & Notification是什么
![<b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的RPC & Notification是什么](https://file.elecfans.com/web2/M00/91/2E/pYYBAGPrNN-AMZ8_AAB6pA7VEPs776.jpg)
OpenDaylight中的MD-SAL是什么
![<b class='flag-5'>OpenDaylight</b><b class='flag-5'>中</b>的MD-SAL是什么](https://file.elecfans.com/web2/M00/91/2F/pYYBAGPrNVaAWdQ1AACE3kH7sqM182.jpg)
評論