專利名稱:一種高可用分布式全文索引方法
技術領域:
本發(fā)明涉及信息索引和搜索領域,更具體而言,涉及一種針對海量文本數(shù)據(jù)構建分布式全文索引并且提供高可用的查詢服務的方法。
背景技術:
隨著互聯(lián)網(wǎng)的發(fā)展,尤其是Web2. O的出現(xiàn),文本信息量呈指數(shù)級速度增長。用戶希望能夠有效的管理海量文本數(shù)據(jù),并對這些文本進行快速的搜索得到相應的信息。Google,百度,必應等搜索引擎的出現(xiàn),滿足了用戶對于信息搜索的需求。而搜索引擎所采用的核心技術就是通過網(wǎng)絡爬蟲收集網(wǎng)絡中的各類數(shù)據(jù)信息,對這些數(shù)據(jù)進行索弓丨,然后對外提供查詢服務。由于隨著數(shù)據(jù)信息的不斷增長,所建立的索引文件規(guī)模大小也隨之增長,導致單機服務器已經(jīng)無法保存所有的索引文件。此外,建立單一巨大的索引文件 所耗費的時間以及在該索引文件上執(zhí)行查詢的時間也不斷增加,導致無法滿足海量客戶查詢需求。一個可行方案是將單個索引文件切分成多個索引分片,并將每一個索引分片分布存儲在不同的主機上,最后對外提供索引服務。然而通過對業(yè)界所采取的若干方案研究,發(fā)現(xiàn)這些方案都存在以下幾個突出的缺點
I、索引與查詢服務是相關聯(lián)的,即索引服務建立的本地索引文件直接為查詢提供服務。然而,查詢與索引集群的緊耦合導致二者不可分離,在容錯性和系統(tǒng)復雜性上發(fā)生故障的可能性大大增加。2、常見的分布式索引系統(tǒng)采取索引分片或者索引復制的方法來增加分布式索引擴展性以及可用性。然而,它們所采用的分片策略通常是按照數(shù)據(jù)的屬性來劃分,因此產(chǎn)生固定數(shù)目的索引分片,而每一個索引分片的大小卻急劇增大。此外,另一些分布式索引系統(tǒng)按固定大小劃分索引,在查詢過程中需要對所有的索引分片進行查詢,增加查詢的時間以及網(wǎng)絡的開銷。3、一般而言分布式索引系統(tǒng)都是為了滿足特定的需求,不能支持動態(tài)對不同類別的數(shù)據(jù)進行索引操作。因此如果需要對新的索引域進行索引,需要停止分布式索引集群,重新部署索引任務,重啟索引集群以重新建立相應的索引。4、當前的分布式索引系統(tǒng)采用多節(jié)點備份實現(xiàn)系統(tǒng)容災。當索引集群的節(jié)點發(fā)生故障的,使用系統(tǒng)中其它節(jié)點的備份對其進行恢復,然而如果這些存在備份的節(jié)點同時發(fā)生故障,那么失效節(jié)點上的索引就無法正?;謴汀Mㄟ^以上的分析,可以知道當前的分布式索引系統(tǒng)中存在諸多問題。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對現(xiàn)有技術的不足,提供一種高可用分布式全文索引方法 本發(fā)明的目的是通過以下技術方案來實現(xiàn)的一種高可用分布式全文索引方法,該方
法包括以下步驟
(I)啟動基礎服務系統(tǒng),包括分布式文件系統(tǒng)、分布式列式數(shù)據(jù)庫以及元數(shù)據(jù)目錄服務;所述分布式文件系統(tǒng)用于存儲索引節(jié)點建立的索引文件,同時為查詢集群中的節(jié)點提供索引文件;所述分布式列式數(shù)據(jù)庫用于提供本發(fā)明中的操作日志服務,操作日志存儲本發(fā)明執(zhí)行的各項操作,此外,分布式列式數(shù)據(jù)庫還用于存儲原始全文數(shù)據(jù)文件,分布式列式數(shù)據(jù)庫應支持按列存儲數(shù)據(jù);元數(shù)據(jù)目錄服務實現(xiàn)元數(shù)據(jù)的存儲; (2)在各個節(jié)點上啟動索引集群服務和查詢集群服務,其中,索引集群服務包括索引主節(jié)點服務和索引節(jié)點服務,查詢集群服務包括查詢主節(jié)點服務和查詢節(jié)點服務;該步驟具體為首先,索引主節(jié)點和搜索主節(jié)點分別啟動,進入安全模式,并分別掃描并監(jiān)聽元數(shù)據(jù)目錄中索引節(jié)點和查詢節(jié)點目錄節(jié)點,以分別管理這些目錄下的節(jié)點;其次,索引節(jié)點和查詢節(jié)點啟動,并將自身的信息注冊到元數(shù)據(jù)節(jié)點目錄之上,此時索引主節(jié)點和搜索主節(jié)點監(jiān)聽到消息,將新加入的節(jié)點納入自身管理之中;最后,如果在安全模式下,節(jié)點不在發(fā)生變化,那么退出安全模式;至此完成了整個分布式全文索引系統(tǒng)啟動的過程;
(3)在全文數(shù)據(jù)上創(chuàng)建索引、更新索引、刪除索引;其中,創(chuàng)建索引包括增量式創(chuàng)建索引和批量式創(chuàng)建索引;該步驟通過以下子步驟來實現(xiàn)
(3. I)所述的增量式創(chuàng)建索引,需要用戶在索引任務定義中將創(chuàng)建索引的模式設置為增量式模式;增量式創(chuàng)建索引的過程包括
(3. I. I)當數(shù)據(jù)插入到存儲系統(tǒng)中,觸發(fā)增量建立索引的任務,索引主節(jié)點通過反射機制實例化索引任務定義中的索引分片策略,判定該數(shù)據(jù)的索引歸屬于哪一個索引分片,此后從元數(shù)據(jù)目錄中讀取索引分片與索引節(jié)點的映射關系,找到負責建立該索引分片的索引節(jié)點;最后將節(jié)點ID寫入到消息中;
(3. I. 2)索引主節(jié)點將3. I. I生成的消息通過遠程調(diào)用的方式將該消息隨機塞到任意一個索引節(jié)點的本地消息隊列中;
(3. I. 3)索引節(jié)點讀取對應的消息,如果該消息屬于該節(jié)點,那么獲取消息后的索引節(jié)點會根據(jù)消息中的數(shù)據(jù)主鍵從數(shù)據(jù)存儲系統(tǒng)中讀出數(shù)據(jù),封裝成索引單元,否則此消息不屬于該節(jié)點,那么通過遠程調(diào)用以及消息中的節(jié)點信息將該消息轉發(fā)到對應索引節(jié)點;
(3. I. 3)索引節(jié)點處理該消息,如果不存在與該消息對應索引處理器,則創(chuàng)建索引處理器,并根據(jù)索引任務定義實例化索引器;索引器讀入索引單元,根據(jù)索引任務中的預定義索引域,對存儲于索引單元中的數(shù)據(jù)進行索引,同時在操作日志I中記錄索引分片ID與操作消息,并且在操作日志2中記錄數(shù)據(jù)主鍵與對應的索引子分片的名字;
(3. I. 4)如果此時滿足索引子分片文件上傳的條件且此時該索引處理器中合并線程不在運行,那么停止當前的索引子分片文件上的索引器,新建一個文件目錄作為新的索引器的索引目錄,轉步驟3. I. 3 ;上傳索引文件線程并執(zhí)行步驟3. I. 5 ;否則依然將索引建在本地的索引子分片目錄之下,轉步驟3. I. 3 ;
(3. I. 5)將舊的索引子分片文件重新命名為合并文件,設置索引正在合并的標志,并且在合并文件目錄上啟動一個索引文件合并線程,將索引文件合并;上傳索引文件線程將合并的結果上傳到分布式文件系統(tǒng)中的索引子分片文件目錄;并且將新增索引子分片的操作消息插入到元數(shù)據(jù)目錄中的Master_queue上;
(3. I. 6)如果上傳成功,那么就刪除與該索引分片對應的索引操作日志1,否則跳轉至步驟3. I. 5重復上傳索引分片的過程;
(3. 2)更新索引的過程包括(3. 2. I)更新數(shù)據(jù)的操作觸發(fā)更新索引的任務,索引主節(jié)點根據(jù)索引分片策略判定該數(shù)據(jù)歸屬于哪一個索引分片,并從元數(shù)據(jù)目錄上讀取索引分片與索引節(jié)點的映射關系,找到對應的索引節(jié)點;
(3. 2. 2)索引主節(jié)點通過遠程調(diào)用將生成的更新索引消息傳遞給任意索引節(jié)點的本地消息隊列,該索引節(jié)點從中讀取對應的更新消息,如果該消息不屬于當前節(jié)點,那么該節(jié)點根據(jù)消息中的節(jié)點信息將消息轉發(fā)到真正的處理節(jié)點;
(3. 2. 3)獲取更新消息后的索引節(jié)點會根據(jù)消息中的信息,根據(jù)數(shù)據(jù)ID在該索引分片的操作日志2中查找對應的索引子分片,將索引子分片ID寫入消息中,如果此時索引子分片在本地磁盤上,轉步驟3. 2. 4 ;否則轉步驟3. 2. 5 ;
(3. 2. 4)根據(jù)該數(shù)據(jù)的文檔主鍵,如果此時該數(shù)據(jù)的索引在本地的索引子分片之中,直接更新對應的索引;并在操作日志I中記錄索引分片ID和對應的消息,轉步驟3. 2. 2 ;
(3. 2. 5)判定當前更新緩存隊列中的消息數(shù)目是否到達閾值,如果沒有到達則將該消息存入該隊列,返回步驟3. 2. 2 ;否則轉步驟3. 2. 6 ;
(3. 2. 6)將更新緩存隊列中的消息全部交給處理隊列,啟動更新線程,更新線程處理每一個消息,根據(jù)每一個數(shù)據(jù)主鍵和索引子分片的對應關系,生成索引子分片與索引主鍵的一對多映射關系,此后,從分布式文件系統(tǒng)中將索引子分片下載本地磁盤,在該分片上實例化出索引處理器以及對應的索引器,根據(jù)消息中的數(shù)據(jù)主鍵從分布式列式數(shù)據(jù)庫中讀取數(shù)據(jù),封裝成索引單元并執(zhí)行更新索引操作,成功之后在操作日志I中記錄該索引子分片執(zhí)行的更新操作;
(3. 2. 7)當完成該索引子分片中所有更新操作,關閉在該目錄上的索引器,并將更新目錄中的索引文件上傳至分布式索引子分片的目錄;刪除操作日志I中與該索引子分片相關的操作記錄,同樣的操作重復執(zhí)行直至遍歷完映射關系;
(3. 3)刪除索引的過程包括
(3. 3. I)刪除數(shù)據(jù)的操作觸發(fā)刪除索引的任務,索引主節(jié)點根據(jù)索引分片策略判定該數(shù)據(jù)歸屬于哪一個索引分片,并從元數(shù)據(jù)目錄上讀取索引分片與索引節(jié)點的映射關系,找到對應的索引節(jié)點;
(3. 3. 2)索引主節(jié)點通過遠程調(diào)用將生成的刪除索引消息傳遞給任意索引節(jié)點的本地消息隊列,該索引節(jié)點從中讀取對應的刪除消息,如果該消息不屬于當前節(jié)點,那么該節(jié)點根據(jù)消息中的節(jié)點信息將消息轉發(fā)到真正的處理節(jié)點;
(3. 3. 3)獲取刪除消息后的索引節(jié)點會根據(jù)消息中的信息,根據(jù)數(shù)據(jù)ID在該索引分片的操作日志2中查找對應的索引子分片,將索引子分片ID寫入消息中,如果此時索引子分片在本地磁盤上,轉步驟3. 3. 4 ;否則轉步驟3. 3. 5 ;
(3. 3. 4)根據(jù)該數(shù)據(jù)的文檔主鍵,如果此時該數(shù)據(jù)的索引在本地的索引子分片之中,直接刪除對應的索引;并在操作日志I中記錄索引分片ID和對應的消息,轉步驟3. 3. 2 ;
(3. 3. 5)判定當前刪除緩存隊列中的消息數(shù)目是否到達閾值,如果沒有到達則將該消息存入該隊列,返回步驟3. 3. 2 ;否則轉步驟3. 3. 6 ;
(3. 3. 6)將刪除緩存隊列中的消息全部交給處理隊列,啟動刪除線程,刪除線程處理每一個消息,根據(jù)每一個數(shù)據(jù)主鍵和索引子分片的對應關系,生成索引子分片與索引主鍵的一對多映射關系,此后,從分布式文件系統(tǒng)中將索引子分片下載本地磁盤,在該分片上實例化出索引處理器以及對應的索引器,根據(jù)消息中的數(shù)據(jù)主鍵從分布式列式數(shù)據(jù)庫中讀取數(shù)據(jù),封裝成索引單元并執(zhí)行刪除索引操作,成功之后在操作日志I中記錄該索引子分片執(zhí)行的刪除操作;
(3. 3. 7)當完成該索引子分片中所有刪除操作,關閉在該目錄上的索引器,并將刪除目錄中的索引文件上傳至分布式索引子分片的目錄;刪除操作日志I中與該索引子分片相關的操作記錄,同樣的操作重復執(zhí)行直至遍歷完映射關系;
(3. 4)所述的批量式索引模式是當用戶在索引任務定義中定義了批量式建立索引模式,此時,索引主節(jié)點將模式轉換為批量式索引模式,批量式索引方法具體包含以下步驟(3. 4. I)調(diào)用MapReduce框架,在Map階段調(diào)用索引分片策略,將數(shù)據(jù)劃分為η個數(shù)據(jù)集合;然后將每個數(shù)據(jù)集合中的數(shù)據(jù)隨機劃分到若干個索引節(jié)點上;
(3. 4. 2)每個索引節(jié)點對劃分的數(shù)據(jù)根據(jù)其所屬的索引分片,分別建立索引子分片,每 一個索引子分片按照大小劃分,當索引子分片大小超過閾值,則創(chuàng)建新的索引子分片;
(3. 4. 3)在Reduce階段,每個索引節(jié)點將自身中索引子分片文件合并到的對應的索引分片文件,將會生成η個索引分片文件;
(3. 4. 4)當完成批量式建索引任務之后,索引主節(jié)點在元數(shù)據(jù)目錄下的Master_queue下寫入載入索引分片的操作;查詢主節(jié)點根據(jù)此操作通過節(jié)點選擇策略將索引分片分配給若干個查詢節(jié)點,并且在元數(shù)據(jù)目錄下的Node_qUeUe中寫入載入索引分片的操作,各個對應的查詢節(jié)點執(zhí)行此操作,載入對應的索引;
(4)查詢索引,包括以下子步驟
(4. I)查詢客戶端根據(jù)查詢內(nèi)容生成分布式查詢,對該查詢進行解析,產(chǎn)生對應的解析結果;
(4. 2)此后查詢客戶端利用步驟4. I中產(chǎn)生的結果,調(diào)用本地的查詢節(jié)點選擇策略;該策略會遠程調(diào)用查詢主節(jié)點上的索引分片選擇策略,根據(jù)元數(shù)據(jù)目錄保存的查詢節(jié)點與索引分片的信息,決定該查詢屬于哪些索引分片,由于一個索引分片有多個索引子分片,因此根據(jù)元數(shù)據(jù)目錄中索引子分片與查詢節(jié)點的映射關系,利用負載均衡技術從這些節(jié)點中選擇負載最輕的查詢節(jié)點,生成與該查詢相對應的查詢節(jié)點列表;最后,將該列表返回給查詢客戶端;
(4. 3)查詢客戶端獲取該查詢節(jié)點列表,通過遠程調(diào)用的方法,并行向這些查詢節(jié)點發(fā)布查詢請求;
(4. 4)查詢節(jié)點執(zhí)行該查詢請求,通過一個線程池在不同的索引分片之上查詢對應的結果,將結果返回給查詢客戶端;
(4. 5)客戶端獲取各個查詢節(jié)點的查詢結果之后,對查詢結果進行合并操作,完成整個查詢過程。本發(fā)明的有益效果是,首先,本發(fā)明分離查詢與索引過程,使二者相互透明。優(yōu)點在于索引集群可以同時支持增量式或批量式地建立索引。批量式索引可以滿足短時間對大規(guī)模數(shù)據(jù)建立索引的需求。而增量式索引可以避免對已建立好的索引文件進行重建操作。另一方面,查詢集群只需要從分布式文件系統(tǒng)中讀取索引文件,而并不要求索引文件是如何建立的。其次,本發(fā)明將索引文件劃分為三層結構,在索引分片的基礎上再將其劃分為索引子分片,以增強索引文件的擴展性。在查詢集群中以索引子分片為單元,將索引子分片的拷貝復制到多個查詢節(jié)點,提高索引文件的可用性。再次,本發(fā)明提供動態(tài)索引任務配置服務,通過設置索引任務中的參數(shù),能夠滿足用戶對不同數(shù)據(jù)建立索引的需求。最后,本發(fā)明記錄了每一個操作的日志,當系統(tǒng)中節(jié)點發(fā)生故障,可以根據(jù)該日志對該節(jié)點中所有為備份的操作進行恢復。
圖I是分布式全文索引系統(tǒng)的架構 圖2是分布式全文索引系統(tǒng)的索引文件的組織結構 圖3是索引文件在分布式全文索系統(tǒng)中的分布圖; 圖4是分布式全文索引系統(tǒng)的元數(shù)據(jù)目錄結構 圖5是分布式全文索引系統(tǒng)索引主節(jié)點啟動流程 圖6是分布式全文索引系統(tǒng)索引節(jié)點啟動流程 圖7是分布式全文索引系統(tǒng)查詢主節(jié)點啟動流程 圖8是分布式全文索引系統(tǒng)查詢節(jié)點啟動流程 圖9是分布式全文索引系統(tǒng)建立索引的流程 圖10是分布式全文索引系統(tǒng)刪除和更新索引的流程 圖11是分布式全文索引系統(tǒng)執(zhí)行查詢的流程 圖12是分布式全文索引系統(tǒng)批量式索引示意圖。
具體實施例方式本發(fā)明的主要目的是提出建立一個分布式全文索引系統(tǒng)的方法。分布式全文索引系統(tǒng)對外提供海量文本索引和查詢服務。下面參照附圖對本發(fā)明進行全面詳實的描述。如圖I所示,通過本發(fā)明所使用的一個高可用分布式全文索引的方法可以構建一個分布式全文索引系統(tǒng)。一個完整的分布式全文索引方法應該由以下幾個步驟構成
I、啟動基礎服務系統(tǒng),包括分布式文件系統(tǒng)、分布式列式數(shù)據(jù)庫以及元數(shù)據(jù)目錄服務。分布式文件系統(tǒng)可以米用Hadoop的分布式文件系統(tǒng)HDFS,分布式數(shù)據(jù)庫可以米用HBase,元數(shù)據(jù)目錄服務可以采用Zookeeper來實現(xiàn)。上述的幾個系統(tǒng)都可以采用與其功能相同的其他系統(tǒng)代替。I. I、所述分布式文件系統(tǒng)用于存儲索引節(jié)點建立的索引文件,同時為查詢集群中的查詢節(jié)點提供索引文件。該分布式文件系統(tǒng)應該支持存儲海量數(shù)據(jù),且保證數(shù)據(jù)的安全性以及可用性,防止因系統(tǒng)故障導致數(shù)據(jù)缺失。I. 2、所述分布式列式數(shù)據(jù)庫用于提供本發(fā)明中的操作日志服務,操作日志存儲本發(fā)明所采用的方法中執(zhí)行的各項操作。此外,分布式列式數(shù)據(jù)庫還用于存儲原始全文數(shù)據(jù)文件。分布式列式數(shù)據(jù)庫應支持按列存儲數(shù)據(jù)。所述的操作日志包括操作日志I與操作日志2。二者格式如下表所示
表I :操縱日志I
丨索引分片ID 丨消息I丨消息2丨…丨消息i丨…丨消H
表2 :操縱日志2
1¥主鍵I索引子分ifTF I. 2. I、所述的操作日志I用于系統(tǒng)容災。其中“索引分片ID”表示索引分片名字。本發(fā)明將索引文件劃分為三層結構,如圖2所示。在圖中,一個特定的索引文件是由特定數(shù)目的索引分片文件組成。具體而言,可以根據(jù)特定的索引分片策略來決定每個數(shù)據(jù)歸屬于哪一個索引分片之中。本發(fā)明默認提供了一些索引分片策略,例如根據(jù)數(shù)據(jù)屬性來劃分,包括按照時間,按照文檔ID值取模等。用戶也可以自定義特定的索引分片策略,以滿足不同應用場景下對于數(shù)據(jù)劃分的需求。每一個索引分片文件又可以根據(jù)用戶設定的閾值劃分成索引子分片。三級不同索引文件在系統(tǒng)中的分布如圖3所示。所述的“消息i”中包含數(shù)據(jù)存儲在分布式列式數(shù)據(jù)庫中的主鍵ID以及操作類型。其中操作類型包括建立,更新以及刪除索引操作。索引分片的ID或索引子分片ID
記錄的是該數(shù)據(jù)歸屬于哪一個索引分片或子分片。消息格式如下表所示
權利要求
1. 一種高可用分布式全文索引方法,其特征在于,該方法包括以下步驟 (1)啟動基礎服務系統(tǒng),包括分布式文件系統(tǒng)、分布式列式數(shù)據(jù)庫以及元數(shù)據(jù)目錄服務;所述分布式文件系統(tǒng)用于存儲索引節(jié)點建立的索引文件,同時為查詢集群中的節(jié)點提供索引文件;所述分布式列式數(shù)據(jù)庫用于提供本發(fā)明中的操作日志服務,存儲本發(fā)明執(zhí)行的各項操作,此外,分布式列式數(shù)據(jù)庫還用于存儲原始全文數(shù)據(jù)文件,分布式列式數(shù)據(jù)庫應支持按列存儲,;元數(shù)據(jù)目錄服務實現(xiàn)元數(shù)據(jù)的存儲; (2)在各個節(jié)點上啟動索引集群服務和查詢集群服務,其中,索引集群服務包括索引主節(jié)點服務和索引節(jié)點服務,查詢集群服務包括查詢主節(jié)點服務和查詢節(jié)點服務;該步驟具體為首先,索引主節(jié)點和搜索主節(jié)點分別啟動,進入安全模式,并分別掃描并監(jiān)聽元數(shù)據(jù)目錄中索引節(jié)點和查詢節(jié)點目錄節(jié)點,以分別管理這些目錄下的節(jié)點;其次,索引節(jié)點和查詢節(jié)點啟動,并將自身的信息注冊到元數(shù)據(jù)節(jié)點目錄之上,此時索引主節(jié)點和搜索主節(jié)點監(jiān)聽到消息,將新加入的節(jié)點納入自身管理之中;最后,如果在安全模式下,節(jié)點不在發(fā)生變化,那么退出安全模式;至此完成了整個分布式全文索引系統(tǒng)啟動的過程; (3)在全文數(shù)據(jù)上創(chuàng)建索引、更新索引、刪除索引;其中,創(chuàng)建索引包括增量式創(chuàng)建索引和批量式創(chuàng)建索引;該步驟通過以下子步驟來實現(xiàn) (3. I)所述的增量式創(chuàng)建索引,需要用戶在索引任務定義中將創(chuàng)建索引的模式設置為增量式模式;增量式創(chuàng)建索引的過程包括 (3. I. I)當數(shù)據(jù)插入到存儲系統(tǒng)中,觸發(fā)增量建立索引的任務,索引主節(jié)點通過反射機制實例化索引任務定義中的索引分片策略,判定該數(shù)據(jù)的索引歸屬于哪一個索引分片,此后從元數(shù)據(jù)目錄中讀取索引分片與索引節(jié)點的映射關系,找到負責建立該索引分片的索引節(jié)點;最后將節(jié)點ID寫入到消息中; (3. I. 2)索引主節(jié)點將3. I. I生成的消息通過遠程調(diào)用的方式將該消息隨機塞到任意一個索引節(jié)點的本地消息隊列中; (3. I. 3)索引節(jié)點讀取對應的消息,如果該消息屬于該節(jié)點,那么獲取消息后的索引節(jié)點會根據(jù)消息中的數(shù)據(jù)主鍵從數(shù)據(jù)存儲系統(tǒng)中讀出數(shù)據(jù),封裝成索引單元,否則此消息不屬于該節(jié)點,那么通過遠程調(diào)用以及消息中的節(jié)點信息將該消息轉發(fā)到對應索引節(jié)點; (3. I. 3)索引節(jié)點處理該消息,如果不存在與該消息對應索引處理器,則創(chuàng)建索引處理器,并根據(jù)索引任務定義實例化索引器;索引器讀入索引單元,根據(jù)索引任務中的預定義索引域,對存儲于索引單元中的數(shù)據(jù)進行索引,同時在操作日志I中記錄索引分片ID與操作消息,并且在操作日志2中記錄數(shù)據(jù)主鍵與對應的索引子分片的名字; (3. I. 4)如果此時滿足索引子分片文件上傳的條件且此時該索引處理器中合并線程不在運行,那么停止當前的索引子分片文件上的索引器,新建一個文件目錄作為新的索引器的索引目錄,轉步驟3. I. 3 ;上傳索引文件線程并執(zhí)行步驟3. I. 5 ;否則依然將索引建在本地的索引子分片目錄之下,轉步驟3. I. 3 ; (3. I. 5)將舊的索引子分片文件重新命名為合并文件,設置索引正在合并的標志,并且在合并文件目錄上啟動一個索引文件合并線程,將索引文件合并;上傳索引文件線程將合并的結果上傳到分布式文件系統(tǒng)中的索引子分片文件目錄;并且將新增索引子分片的操作消息插入到元數(shù)據(jù)目錄中的Master_queue上; (3. I. 6)如果上傳成功,那么就刪除與該索引分片對應的索引操作日志1,否則跳轉至步驟3. I. 5重復上傳索引分片的過程; (3. 2)更新索引的過程包括 (3. 2. I)更新數(shù)據(jù)的操作觸發(fā)更新索引的任務,索引主節(jié)點根據(jù)索引分片策略判定該數(shù)據(jù)歸屬于哪一個索引分片,并從元數(shù)據(jù)目錄上讀取索引分片與索引節(jié)點的映射關系,找到對應的索引節(jié)點; (3. 2. 2)索引主節(jié)點通過遠程調(diào)用將生成的更新索引消息傳遞給任意索引節(jié)點的本地消息隊列,該索引節(jié)點從中讀取對應的更新消息,如果該消息不屬于當前節(jié)點,那么該節(jié)點根據(jù)消息中的節(jié)點信息將消息轉發(fā)到真正的處理節(jié)點; (3. 2. 3)獲取更新消息后的索引節(jié)點會根據(jù)消息中的信息,根據(jù)數(shù)據(jù)ID在該索引分片的操作日志2中查找對應的索引子分片,將索引子分片ID寫入消息中,如果此時索引子分片在本地磁盤上,轉步驟3. 2. 4 ;否則轉步驟3. 2. 5 ; (3. 2. 4)根據(jù)該數(shù)據(jù)的文檔主鍵,如果此時該數(shù)據(jù)的索引在本地的索引子分片之中,直接更新對應的索引;并在操作日志I中記錄索引分片ID和對應的消息,轉步驟3. 2. 2 ; (3. 2. 5)判定當前更新緩存隊列中的消息數(shù)目是否到達閾值,如果沒有到達則將該消息存入該隊列,返回步驟3. 2. 2 ;否則轉步驟3. 2. 6 ; (3. 2. 6)將更新緩存隊列中的消息全部交給處理隊列,啟動更新線程,更新線程處理每一個消息,根據(jù)每一個數(shù)據(jù)主鍵和索引子分片的對應關系,生成索引子分片與索引主鍵的一對多映射關系,此后,從分布式文件系統(tǒng)中將索引子分片下載本地磁盤,在該分片上實例化出索引處理器以及對應的索引器,根據(jù)消息中的數(shù)據(jù)主鍵從分布式列式數(shù)據(jù)庫中讀取數(shù)據(jù),封裝成索引單元并執(zhí)行更新索引操作,成功之后在操作日志I中記錄該索引子分片執(zhí)行的更新操作; (3. 2. 7)當完成該索引子分片中所有更新操作,關閉在該目錄上的索引器,并將更新目錄中的索引文件上傳至分布式索引子分片的目錄;刪除操作日志I中與該索引子分片相關的操作記錄,同樣的操作重復執(zhí)行直至遍歷完映射關系; (3. 3)刪除索引的過程包括 (3. 3. I)刪除數(shù)據(jù)的操作觸發(fā)刪除索引的任務,索引主節(jié)點根據(jù)索引分片策略判定該數(shù)據(jù)歸屬于哪一個索引分片,并從元數(shù)據(jù)目錄上讀取索引分片與索引節(jié)點的映射關系,找到對應的索引節(jié)點; (3. 3. 2)索引主節(jié)點通過遠程調(diào)用將生成的刪除索引消息傳遞給任意索引節(jié)點的本地消息隊列,該索引節(jié)點從中讀取對應的刪除消息,如果該消息不屬于當前節(jié)點,那么該節(jié)點根據(jù)消息中的節(jié)點信息將消息轉發(fā)到真正的處理節(jié)點; (3. 3. 3)獲取刪除消息后的索引節(jié)點會根據(jù)消息中的信息,根據(jù)數(shù)據(jù)ID在該索引分片的操作日志2中查找對應的索引子分片,將索引子分片ID寫入消息中,如果此時索引子分片在本地磁盤上,轉步驟3. 3. 4 ;否則轉步驟3. 3. 5 ; (3. 3. 4)根據(jù)該數(shù)據(jù)的文檔主鍵,如果此時該數(shù)據(jù)的索引在本地的索引子分片之中,直接刪除對應的索引;并在操作日志I中記錄索引分片ID和對應的消息,轉步驟3. 3. 2 ; (3. 3. 5)判定當前刪除緩存隊列中的消息數(shù)目是否到達閾值,如果沒有到達則將該消息存入該隊列,返回步驟3. 3. 2 ;否則轉步驟3. 3. 6 ; (3. 3. 6)將刪除緩存隊列中的消息全部交給處理隊列,啟動刪除線程,刪除線程處理每一個消息,根據(jù)每一個數(shù)據(jù)主鍵和索引子分片的對應關系,生成索引子分片與索引主鍵的一對多映射關系,此后,從分布式文件系統(tǒng)中將索引子分片下載本地磁盤,在該分片上實例化出索引處理器以及對應的索引器,根據(jù)消息中的數(shù)據(jù)主鍵從分布式列式數(shù)據(jù)庫中讀取數(shù)據(jù),封裝成索引單元并執(zhí)行刪除索引操作,成功之后在操作日志I中記錄該索引子分片執(zhí)行的刪除操作; (3. 3. 7)當完成該索引子分片中所有刪除操作,關閉在該目錄上的索引器,并將刪除目錄中的索引文件上傳至分布式索引子分片的目錄;刪除操作日志I中與該索引子分片相關的操作記錄,同樣的操作重復執(zhí)行直至遍歷完映射關系; (3. 4)所述的批量式索引模式是當用戶在索引任務定義中定義了批量式建立索引模式,此時,索引主節(jié)點將模式轉換為批量式索引模式,批量式索引方法具體包含以下步驟(3. 4. I)調(diào)用MapReduce框架,在Map階段調(diào)用索引分片策略,將數(shù)據(jù)劃分為η個數(shù)據(jù)集合;然后將每個數(shù)據(jù)集合中的數(shù)據(jù)隨機劃分到若干個索引節(jié)點上; (3. 4. 2)每個索引節(jié)點對劃分的數(shù)據(jù)根據(jù)其所屬的索引分片,分別建立索引子分片,每一個索引子分片按照大小劃分,當索引子分片大小超過閾值,則創(chuàng)建新的索引子分片; (3. 4. 3)在Reduce階段,每個索引節(jié)點將自身中索引子分片文件合并到的對應的索引分片文件,將會生成η個索引分片文件; (3. 4. 4)當完成批量式建索引任務之后,索引主節(jié)點在元數(shù)據(jù)目錄下的Master_queue下寫入載入索引分片的操作;查詢主節(jié)點根據(jù)此操作通過節(jié)點選擇策略將索引分片分配給若干個查詢節(jié)點,并且在元數(shù)據(jù)目錄下的Node_qUeUe中寫入載入索引分片的操作,各個對應的查詢節(jié)點執(zhí)行此操作,載入對應的索引; (4)查詢索引,包括以下子步驟 (4. I)查詢客戶端根據(jù)查詢內(nèi)容生成分布式查詢,對該查詢進行解析,產(chǎn)生對應的解析結果; (4. 2)此后查詢客戶端利用步驟4. I中產(chǎn)生的結果,調(diào)用本地的查詢節(jié)點選擇策略;該策略會遠程調(diào)用查詢主節(jié)點上的索引分片選擇策略,根據(jù)元數(shù)據(jù)目錄保存的查詢節(jié)點與索引分片的信息,決定該查詢屬于哪些索引分片,由于一個索引分片有多個索引子分片,因此根據(jù)元數(shù)據(jù)目錄中索引子分片與查詢節(jié)點的映射關系,利用負載均衡技術從這些節(jié)點中選擇負載最輕的查詢節(jié)點,生成與該查詢相對應的查詢節(jié)點列表;最后,將該列表返回給查詢客戶端; (4. 3)查詢客戶端獲取該查詢節(jié)點列表,通過遠程調(diào)用的方法,并行向這些查詢節(jié)點發(fā)布查詢請求; (4. 4)查詢節(jié)點執(zhí)行該查詢請求,通過一個線程池在不同的索引分片之上查詢對應的結果,將結果返回給查詢客戶端; (4. 5)客戶端獲取各個查詢節(jié)點的查詢結果之后,對查詢結果進行合并操作,完成整個查詢過程。
全文摘要
本發(fā)明公開了一種高可用分布式全文索引方法,該方法首先啟動基礎服務系統(tǒng),然后在各個節(jié)點上啟動索引集群服務和查詢集群服務,再在全文數(shù)據(jù)上創(chuàng)建、更新和刪除索引,最后查詢索引;本發(fā)明分離查詢與索引過程,可以同時支持增量或批量式地建立已有的索引,批量式索引在短時間對大規(guī)模數(shù)據(jù)建立索引,而增量式索引避免重建索引。本發(fā)明將索引文件劃分為三層結構,包括索引文件、索引分片、索引子分片,以增強索引文件的擴展性和可用性;本發(fā)明提供動態(tài)索引任務配置服務,通過設置索引任務中的參數(shù),能夠動態(tài)地滿足用戶對不同數(shù)據(jù)建立索引的需求。
文檔編號G06F17/30GK102779185SQ20121022635
公開日2012年11月14日 申請日期2012年6月29日 優(yōu)先權日2012年6月29日
發(fā)明者余斌, 陳嶺, 魯偉明 申請人:浙江大學