分散式搜尋系統的設計

碼農談IT發表於2023-10-09

來源:小技術君

介紹

如今,我們幾乎在每個網站上都看到一個搜尋欄。搜尋欄使我們能夠快速找到我們需要的內容。

讓我們舉個例子。想象一下,如果YouTube沒有提供搜尋欄,我們如何在數百萬個影片中找到特定的影片,這些影片多年來都已上傳到YouTube?使用者僅透過滾動瀏覽很難找到他們想要的內容。

在每個搜尋欄背後,都有一個搜尋系統。

需求

可用性:系統應對使用者高度可用。可擴充套件性:系統應能夠隨著資料量的增加而擴充套件。換句話說,它應能夠索引大量資料。快速搜尋大資料:無論使用者搜尋多少內容,他們都應該能夠快速獲取結果。

核心概念

倒排索引

索引 — 是組織和運算元據的過程,旨在促進快速和準確的資訊檢索。

倒排索引 — 是一種類似於雜湊對映的資料結構,它使用文件-詞術矩陣。它不是將完整文件儲存,而是將文件拆分為單個詞語。然後,文件-詞術矩陣識別唯一的詞語,並丟棄頻繁出現的詞語,如“to”、“they”、“the”、“is”等等。

分散式搜尋系統的設計

圖1.0:倒排索引

“對映”列中的每個條目都包括三個列表:

詞語出現的文件列表統計詞語在每個文件中出現的頻率的列表。指出詞語在每個文件中的位置二維列表。一個詞語可以在同一文件中出現多次,因此使用二維列表。

對於提取的每個詞語,我們要麼在倒排索引中新增新行,要麼在該詞語已經在倒排索引中有條目的情況下更新現有條目。同樣,在刪除文件時,我們需要處理,找到已刪除文件詞彙在倒排索引中的條目,然後相應地更新倒排索引。

設計

在新增文件或執行搜尋查詢時,需要將倒排索引載入到主記憶體中。為了效率,必須將倒排索引的大部分內容適應於機器的RAM中。

這意味著我們必須將大量資料載入到RAM中。不是增加單臺機器的資源來索引十億頁,而是要轉向分散式系統,利用並行化的力量

分散式搜尋系統的設計

圖2.0:分散式搜尋系統的高階設計

索引器從分散式儲存中獲取文件,並使用MapReduce進行索引,MapReduce執行在分散式的普通機器叢集上。索引器使用分散式資料處理系統(例如MapReduce)進行並行和分散式索引構建。構建的索引表儲存在分散式儲存中。使用分散式儲存來儲存文件和索引。使用者在搜尋欄中輸入包含多個詞語的搜尋字串。搜尋器解析搜尋字串,從儲存在分散式儲存中的索引中搜尋對映,並將最匹配的結果返回給使用者。

資料分割槽

為了實現成本效益,我們在索引中使用了眾多小節點。這個過程要求我們對輸入資料(文件)進行分割槽或拆分

分散式搜尋系統的設計

圖3.0:在多個普通機器叢集中以並行方式進行分散式索引和搜尋

索引

叢集管理器將輸入文件集分成N個分割槽,其中N等於上圖中的2。每個分割槽的大小由叢集管理器決定,考慮到資料的大小、計算、記憶體限制和叢集中的節點數量。由於各種原因,可能不是所有節點都可用。叢集管理器透過定期心跳監視每個節點的健康狀況。要將文件分配給N個分割槽之一,可以使用雜湊函式分割槽後,叢集管理器在叢集中的N個節點上同時執行所有N個分割槽的索引演算法。每個索引過程都會生成一個小型的倒排索引,儲存在節點的本地儲存中。這樣,我們生成了N個小型倒排索引,而不是一個大的倒排索引。

搜尋

在搜尋階段,當使用者查詢進來時,我們在儲存在節點本地儲存中的每個小型倒排索引上執行並行搜尋,生成N個查詢。每個小型倒排索引的搜尋結果都是與查詢詞語匹配的對映列表(我們假設使用者查詢是單個詞語/術語)。合併器聚合這些對映列表。

聚合對映列表後,合併器根據每個文件中詞語的頻率對文件列表進行排序。

排序後的文件列表以升序順序返回給使用者。

複製

我們為生成分配分割槽的索引節點建立副本。

通常,三個副本足夠。三個副本意味著三個節點託管相同的分割槽並生成索引。三個節點中的一個成為主節點,而其他兩個是副本。同一分割槽將轉發到所有三個副本。我們假設每個副本都會獨立計算索引,這會導致資源的低效使用。與在副本上重新計算索引不同,我們只在主節點上計算倒排索引。接下來,我們將倒排索引(二進位制檔案)傳輸到副本。這種方法的主要好處是避免了在副本上使用重複的CPU和記憶體來進行索引。

分散式搜尋系統的設計

圖4.0:由索引節點生成的索引儲存在分散式儲存中,參與搜尋的節點從分散式儲存中讀取索引以為使用者的查詢生成結果

索引和搜尋之間有很強的分離,而沒有索引延遲的負面影響。由於這種分離,索引不會影響搜尋可擴充套件性,反之亦然。此外,與在副本上重新計算索引不同,我們只需複製索引檔案。

在硬體故障的情況下,會新增新的搜尋器或索引器機器,並從分散式儲存中檢索資料的副本。

評估

可用性

資料在分散式儲存中跨多個區域進行復制,使索引和搜尋的跨區域部署更加容易。因此,如果一個地方發生故障,我們可以在另一個叢集中處理請求。

索引是離線執行的,不在使用者的關鍵路徑上。我們不需要同步複製索引操作。無需在將新索引複製到響應搜尋查詢之前等待。這使得搜尋對使用者可用。

可擴充套件性

分割槽是搜尋系統擴充套件的重要組成部分。當增加分割槽的數量並向索引和搜尋叢集新增更多節點時,可以在資料索引和查詢方面實現擴充套件。

索引和搜尋過程之間的強分離有助於索引和搜尋獨立和動態地擴充套件。

大資料快速搜尋

我們利用了多個節點,每個節點在較小的倒排索引上並行執行搜尋查詢。然後,將每個搜尋節點的結果合併並返回給使用者。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2987572/,如需轉載,請註明出處,否則將追究法律責任。

相關文章