專利名稱:基于Berkeley DB的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)及方法
基于Berkeley DB的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)及方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,特別涉及其中的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)及數(shù)據(jù)訪問方法。
背景技術(shù):
在計(jì)算機(jī)服務(wù)器端,經(jīng)常存在著多個(gè)進(jìn)程和線程同時(shí)訪問一個(gè)數(shù)據(jù)庫的問題?,F(xiàn)有技術(shù)中存在的數(shù)據(jù)庫主要有 文件型數(shù)據(jù)庫文件型數(shù)據(jù)庫是早期使用的數(shù)據(jù)庫形式,現(xiàn)在不少簡(jiǎn)單的應(yīng)用服務(wù)器系統(tǒng)也是適用這種數(shù)據(jù)庫來管理數(shù)據(jù)。該方法的最大缺點(diǎn)就是不能實(shí)現(xiàn)數(shù)據(jù)的并發(fā)操作,一般一個(gè)對(duì)一個(gè)數(shù)據(jù)文件進(jìn)行操作時(shí),整個(gè)文件都是一個(gè)沖突域,即在其他進(jìn)程或者線程使用該數(shù)據(jù)庫時(shí),其他程序必須阻塞,等待其處理完成后,才能繼續(xù)訪問數(shù)據(jù)庫。因此,所有數(shù)據(jù)的訪問與線性訪問數(shù)據(jù)的時(shí)間基本相同,是一種性能很低的解決方案,另外,文件型數(shù)據(jù)庫由于沒有自身的索引信息,所以查找和處理數(shù)據(jù)都非常困難,很難實(shí)現(xiàn)分布式的系統(tǒng)架構(gòu)。但由于其本身比較簡(jiǎn)單,在現(xiàn)實(shí)中有不少的應(yīng)用。 關(guān)系型數(shù)據(jù)庫關(guān)系型數(shù)據(jù)庫是現(xiàn)在很多網(wǎng)站、公司內(nèi)部系統(tǒng)使用的數(shù)據(jù)庫解決方案,其中包括MySQL、 SQL Server、 Oracle等,可以說該方案是現(xiàn)有數(shù)據(jù)庫的主流解決方案,其最大的優(yōu)點(diǎn)就是使用簡(jiǎn)單,支持標(biāo)準(zhǔn)SQL,然而由于它支持標(biāo)準(zhǔn)SQL的需求,因此其具有以下缺點(diǎn) 主流的關(guān)系型數(shù)據(jù)庫都是連接型數(shù)據(jù)庫,即在每次客戶發(fā)出數(shù)據(jù)請(qǐng)求的時(shí)候,客戶端和數(shù)據(jù)庫之間首先建立一條TCP連接,然后使用這條連接進(jìn)行數(shù)據(jù)的交互,即使應(yīng)用程序和數(shù)據(jù)庫在同一臺(tái)機(jī)器上時(shí),也必須建立連接。因此,服務(wù)器的很多處理都浪費(fèi)在了處理連接的內(nèi)容上,由此也降低了數(shù)據(jù)庫的存儲(chǔ)效率。而且傳統(tǒng)的Select/Poll方式處理連接,處理的時(shí)間復(fù)雜度和連接數(shù)是平方的關(guān)系,所以,隨著數(shù)據(jù)庫處理的請(qǐng)求增多,處理的能力以平方的速度下降。 主流的關(guān)系型數(shù)據(jù)庫支持標(biāo)準(zhǔn)SQL,因此數(shù)據(jù)庫必須對(duì)每一個(gè)字段建立索引信息,而在實(shí)際的應(yīng)用程序中,大多數(shù)的字段索引是沒有用的。因此數(shù)據(jù)庫存儲(chǔ)了很多額外的信息,同時(shí)這些數(shù)據(jù)的存在也降低了數(shù)據(jù)庫的效率。
發(fā)明內(nèi)容
本發(fā)明的主要目的是提供一種實(shí)現(xiàn)高效訪問的數(shù)據(jù)庫存儲(chǔ)的解決方案。
為實(shí)現(xiàn)上述目的,本發(fā)明提出一種基于Berkeley DB的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),采用分布式架構(gòu),每個(gè)服務(wù)器上維護(hù)本地?cái)?shù)據(jù);本服務(wù)器在接到數(shù)據(jù)訪問的請(qǐng)求后,先查找本地?cái)?shù)據(jù)庫;如果本地?cái)?shù)據(jù)庫中不存在,再計(jì)算出存儲(chǔ)該數(shù)據(jù)的其他服務(wù)器,并把該數(shù)據(jù)緩存至本服務(wù)器的本地?cái)?shù)據(jù)庫中。 同時(shí),本發(fā)明提出了一種基于Berkeley DB的數(shù)據(jù)庫存儲(chǔ)方法,每個(gè)服務(wù)器上維護(hù)本地?cái)?shù)據(jù);本服務(wù)器在接到數(shù)據(jù)訪問的請(qǐng)求后,先查找本地?cái)?shù)據(jù)庫;如果本地?cái)?shù)據(jù)庫中不存在,再計(jì)算出存儲(chǔ)該數(shù)據(jù)的其他服務(wù)器,并把該數(shù)據(jù)緩存至本服務(wù)器的本地?cái)?shù)據(jù)庫中。
上述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)或數(shù)據(jù)庫存儲(chǔ)方法,每個(gè)服務(wù)器的本地?cái)?shù)據(jù)庫包括本服務(wù)器需要維護(hù)的本機(jī)的用戶數(shù)據(jù)存儲(chǔ)區(qū)、用作緩存其他服務(wù)器數(shù)據(jù)的緩存數(shù)據(jù)存儲(chǔ)區(qū)。
上述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)或數(shù)據(jù)庫存儲(chǔ)方法,在本地?cái)?shù)據(jù)庫中采用頁級(jí)鎖進(jìn)行數(shù)據(jù)
管理。在本地?cái)?shù)據(jù)庫中采用頁級(jí)鎖進(jìn)行數(shù)據(jù)管理時(shí),其中的磁盤頁的大小根據(jù)整個(gè)系統(tǒng)存儲(chǔ)總的用戶數(shù)和處理用戶請(qǐng)求的總的線程數(shù),進(jìn)行設(shè)定。可選方案之一,所述磁盤頁的大小
為每個(gè)頁存儲(chǔ)io個(gè)數(shù)據(jù)。 上述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)或數(shù)據(jù)庫存儲(chǔ)方法,在本服務(wù)器和其他服務(wù)器通信過程中,采用Epoll處理連接。 上述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)或數(shù)據(jù)庫存儲(chǔ)方法,根據(jù)散列算法計(jì)算出存儲(chǔ)該數(shù)據(jù)的服務(wù)器。通過基于Berkeley DB的應(yīng)用程序編程接口 ,提供所述數(shù)據(jù)訪問的統(tǒng)一接口 。
相較之現(xiàn)有技術(shù)的關(guān)系型數(shù)據(jù)庫,本發(fā)明在處理本地?cái)?shù)據(jù)的時(shí)候不需要建立TCP連接,提高了數(shù)據(jù)庫的存儲(chǔ)效率,大大降低了系統(tǒng)的開銷,大幅度的提高服務(wù)器的性能。
對(duì)于用戶多臺(tái)服務(wù)器在邏輯上可以當(dāng)成一臺(tái)服務(wù)器透明地使用,用戶可以就近連接服務(wù)器,解決網(wǎng)絡(luò)生存周期過高的問題; 同時(shí),在對(duì)底層數(shù)據(jù)的訪問上采用對(duì)頁加鎖的技術(shù),提高磁盤I/O的效率。
本發(fā)明中,應(yīng)用Berkeley DB提供的一些功能,可以對(duì)存儲(chǔ)系統(tǒng)的底層實(shí)現(xiàn)靈活配置,比如數(shù)據(jù)頁的大小、內(nèi)存緩存的大小、底層存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)等。整個(gè)存儲(chǔ)系統(tǒng)既支持單線程訪問,又支持多線程訪問。
圖1本發(fā)明實(shí)施例的具有兩個(gè)節(jié)點(diǎn)的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)的系統(tǒng)結(jié)構(gòu) 圖2是本發(fā)明實(shí)施例的分布式節(jié)點(diǎn)的架構(gòu) 圖3是本發(fā)明實(shí)施例的系統(tǒng)模塊圖。
具體實(shí)施方式
下面通過具體的實(shí)施例并結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)的描述。
實(shí)施例一 請(qǐng)結(jié)合圖l和圖2所示的系統(tǒng)結(jié)構(gòu)圖,為了提高系統(tǒng)的服務(wù)性能,本例的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),采用分布式架構(gòu),每個(gè)服務(wù)器上維護(hù)自己的數(shù)據(jù);本地?cái)?shù)據(jù)庫分兩部分1.本服務(wù)器需要維護(hù)的本機(jī)用戶數(shù)據(jù),存儲(chǔ)于本地?cái)?shù)據(jù)庫的用戶數(shù)據(jù)存儲(chǔ)區(qū)中;2.用作緩存其他服務(wù)器的數(shù)據(jù),緩存于本地?cái)?shù)據(jù)庫的緩存數(shù)據(jù)存儲(chǔ)區(qū)中。在接到數(shù)據(jù)請(qǐng)求后,先查找本地?cái)?shù)據(jù)庫,如果本地?cái)?shù)據(jù)庫中不存在,再根據(jù)散列算法計(jì)算出存儲(chǔ)該數(shù)據(jù)的服務(wù)器,并把這個(gè)數(shù)據(jù)緩存在本地?cái)?shù)據(jù)庫中。在這個(gè)基礎(chǔ)上,用戶可以就近連接服務(wù)器,解決網(wǎng)絡(luò)生存周期TTL(Time to Live)過高的問題。為提高訪問本地文件的并發(fā)度,使用Berkeley DB頁級(jí)鎖;為提高處理TCP連接的速度,采用Li皿x 2. 6內(nèi)核的Epoll技術(shù)。 在本地?cái)?shù)據(jù)庫中,采用Berkeley DB的頁級(jí)鎖的策略進(jìn)行數(shù)據(jù)管理,磁盤頁的大小(即加鎖的粒度)可以自行設(shè)定的,以增強(qiáng)系統(tǒng)的可配置性。對(duì)數(shù)據(jù)大小進(jìn)行計(jì)算,計(jì)算頁大小的方法是獲得整個(gè)系統(tǒng)存儲(chǔ)總的用戶數(shù)和處理用戶請(qǐng)求的總的線程數(shù),用系統(tǒng)用戶數(shù)除以線程數(shù),再除以一個(gè)經(jīng)驗(yàn)數(shù)據(jù),該數(shù)據(jù)可以隨時(shí)調(diào)整,由于對(duì)每頁都是加鎖的,所以這個(gè)經(jīng)驗(yàn)數(shù)據(jù)僅會(huì)影響系統(tǒng)的性能,而不會(huì)出錯(cuò)。本例中,經(jīng)測(cè)試采用每個(gè)頁存儲(chǔ)10個(gè)數(shù) 據(jù),這樣碰撞的概率比較低,此時(shí),多個(gè)進(jìn)程或者線程在這樣的頁面配置下基本不會(huì)發(fā)生碰 撞,達(dá)到了讀寫數(shù)據(jù)庫的并行性。 在本服務(wù)器和其他服務(wù)器通信過程中,采用Epoll處理連接,因此處理連接的速 度比現(xiàn)有的關(guān)系型數(shù)據(jù)庫速度要快。請(qǐng)參考圖3所示的系統(tǒng)模i央圖,MyDb構(gòu)造函數(shù)MyDb (string dbname, int env_
flag, int dataStruct) 5 dbname :要打開的數(shù)據(jù)庫名稱; env_flag :數(shù)據(jù)庫環(huán)境配置的參數(shù); dataStruct :數(shù)據(jù)庫存儲(chǔ)底層數(shù)據(jù)所采用的格式; MyTable構(gòu)造函數(shù);MyTable (string tbn謙,int db_flag, int pagesize); tbname :要打開的表的名稱; db_flag :配置數(shù)據(jù)庫表的參數(shù); pagesize :存儲(chǔ)該數(shù)據(jù)結(jié)構(gòu)所采用的頁的大小。 在構(gòu)造好MyDb和MyTable的指針后,可以使用圖2提供的應(yīng)用程序編程接口 API 訪問數(shù)據(jù)。 以上內(nèi)容是結(jié)合具體的優(yōu)選實(shí)施方式對(duì)本發(fā)明所作的進(jìn)一步詳細(xì)說明,不能認(rèn)定 本發(fā)明的具體實(shí)施只局限于這些說明。對(duì)于本發(fā)明所屬技術(shù)領(lǐng)域的普通技術(shù)人員來說,在 不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干簡(jiǎn)單推演或替換,都應(yīng)當(dāng)視為屬于本發(fā)明的 保護(hù)范圍。
權(quán)利要求
一種基于Berkeley DB的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),采用分布式架構(gòu),每個(gè)服務(wù)器上維護(hù)本地?cái)?shù)據(jù);本服務(wù)器在接到數(shù)據(jù)訪問的請(qǐng)求后,先查找本地?cái)?shù)據(jù)庫;如果本地?cái)?shù)據(jù)庫中不存在,再計(jì)算出存儲(chǔ)該數(shù)據(jù)的其他服務(wù)器,并把該數(shù)據(jù)緩存至本服務(wù)器的本地?cái)?shù)據(jù)庫中。
2. 如權(quán)利要求1所述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),其特征是每個(gè)服務(wù)器的本地?cái)?shù)據(jù)庫包括本服務(wù)器需要維護(hù)的本機(jī)的用戶數(shù)據(jù)存儲(chǔ)區(qū)、用作緩存其他服務(wù)器數(shù)據(jù)的緩存數(shù)據(jù)存儲(chǔ)區(qū)。
3. 如權(quán)利要求2所述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),其特征是在本地?cái)?shù)據(jù)庫中采用頁級(jí)鎖進(jìn)行數(shù)據(jù)管理。
4. 如權(quán)利要求2所述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),其特征是在本服務(wù)器和其他服務(wù)器通信過 程中,采用Epoll處理連接。
5. 如權(quán)利要求2所述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),其特征是根據(jù)散列算法計(jì)算出存儲(chǔ)該數(shù)據(jù)的服務(wù)器。
6. 如權(quán)利要求2所述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),其特征是通過基于Berkeley DB的應(yīng)用程序編程接口 ,提供所述數(shù)據(jù)訪問的統(tǒng)一接口 。
7. 如權(quán)利要求3所述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),其特征是在本地?cái)?shù)據(jù)庫中采用頁級(jí)鎖進(jìn)行數(shù)據(jù)管理時(shí),其中的磁盤頁的大小根據(jù)整個(gè)系統(tǒng)存儲(chǔ)總的用戶數(shù)和處理用戶請(qǐng)求的總的線程數(shù),進(jìn)行設(shè)定。
8. 如權(quán)利要求7所述的數(shù)據(jù)庫存儲(chǔ)系統(tǒng),其特征是所述磁盤頁的大小為每個(gè)頁存儲(chǔ)IO個(gè)數(shù)據(jù)。
9. 一種基于Berkeley DB的數(shù)據(jù)庫存儲(chǔ)方法,每個(gè)服務(wù)器上維護(hù)本地?cái)?shù)據(jù);本服務(wù)器在接到數(shù)據(jù)訪問的請(qǐng)求后,先查找本地?cái)?shù)據(jù)庫;如果本地?cái)?shù)據(jù)庫中不存在,再計(jì)算出存儲(chǔ)該數(shù)據(jù)的其他服務(wù)器,并把該數(shù)據(jù)緩存至本服務(wù)器的本地?cái)?shù)據(jù)庫中。
10. 如權(quán)利要求9所述的數(shù)據(jù)庫存儲(chǔ)方法,其特征是每個(gè)服務(wù)器的本地?cái)?shù)據(jù)庫包括本服務(wù)器需要維護(hù)的本機(jī)的用戶數(shù)據(jù)存儲(chǔ)區(qū)、用作緩存其他服務(wù)器數(shù)據(jù)的緩存數(shù)據(jù)存儲(chǔ)區(qū)。
全文摘要
本發(fā)明公開了一種基于Berkeley DB的數(shù)據(jù)庫存儲(chǔ)系統(tǒng)及數(shù)據(jù)庫存儲(chǔ)方法,系統(tǒng)采用分布式架構(gòu),每個(gè)服務(wù)器上維護(hù)本地?cái)?shù)據(jù);本服務(wù)器在接到數(shù)據(jù)請(qǐng)求后,先查找本地?cái)?shù)據(jù)庫;如果本地?cái)?shù)據(jù)庫中不存在,再計(jì)算出存儲(chǔ)該數(shù)據(jù)的其他服務(wù)器,并把該數(shù)據(jù)緩存至本服務(wù)器的本地?cái)?shù)據(jù)庫中。相較之現(xiàn)有技術(shù)的關(guān)系型數(shù)據(jù)庫,本發(fā)明在處理本地?cái)?shù)據(jù)的時(shí)候不需要建立TCP連接,提高了數(shù)據(jù)庫的存儲(chǔ)效率,大大降低了系統(tǒng)的開銷,大幅度的提高服務(wù)器的性能。
文檔編號(hào)G06F17/30GK101763390SQ20081024155
公開日2010年6月30日 申請(qǐng)日期2008年12月24日 優(yōu)先權(quán)日2008年12月24日
發(fā)明者李揮, 李曉明, 雷凱, 高曉飛 申請(qǐng)人:北京大學(xué)深圳研究生院