1.es存儲的基本機關
es存儲的基本機關是索引。
// ES
index -> type -> mapping -> document -> field
//MySQL or PostgreSQL
database -> table -> table structure -> data -> table field
這裡将ES的基本術語和資料庫做了一個關聯,僅個人學習時的了解。
2.es的基本架構設計
一個index(索引)會被分割成多個shard(分片),每個shard都存儲了該index下的部分資料。這樣存儲有2個好處。支援橫向擴充,隻需要将shard數量增加即可;性能較高,所有的查詢操作都會在多個機器上運作,提升了穩定性。
每個shard是有多個備份的。有主分片(primary shard)和副本分片(replica shard),主分片用來執行寫操作,副本分片在主分片寫入完成之後同步其資料。如果某個機器停機了,其他分片的資料還是完整的。
es 叢集多個節點,會自動選舉一個節點為 master 節點,這個 master 節點其實就是幹一些管理的工作的,比如維護索引中繼資料、負責切換 primary shard 和 replica shard 身份等。
master 節點當機了,那麼會重新選舉一個節點為 master 節點。
非 master節點當機了,那麼會由 master 節點,讓那個當機節點上的 primary shard 的身份轉移到其他機器上的 replica shard。接着你要是修複了那個當機機器,重新開機了之後,master 節點會控制将缺失的 replica shard 配置設定過去,同步後續修改的資料之類的,讓叢集恢複正常。
3.es讀寫資料的基本原理
寫資料
1.用戶端選擇一個協調節點(coordinating node)發送請求;
2.由coordinating node對document進行路由,将請求轉發給對應的primary shard node
3.執行寫操作,同時同步資料至replica shard node
4.主從節點都寫入完成後,響應給用戶端。
寫資料底層原理
**注:**es是準實時。預設是寫入資料1秒之後才可以被看到,因為其預設1s執行一次refresh操作。
1.資料先寫入buffer;
2.每隔1s重新整理寫入至os cache(資料進入到os cache就可以被搜尋到);
3.每隔5s将os cache寫入到translog檔案中(如果機器在寫入translog之前當機,最多會丢失5秒的資料);
4.translog資料大到一定程度或者預設每隔30分鐘,會觸發一次commit操作,将緩沖區的資料都flush到segement file磁盤檔案中。
讀資料
1.發請求至任意一個coordinating node。
2.由coordinating node 對document id進行hash路由,将請求轉發到對應的node上,會使用随機輪詢算法在primary shard和replica shard中随機選一個,執行讀操作。
3.接收所有node傳回的document給 coordinating code,協調節點負責将資料進行合并、分頁、排序等操作。
4.傳回結果給用戶端。
删除/更新資料
如果是删除操作,commit的時候會生成一個
.del
檔案,将doc标記為delete狀态。在執行搜尋時根據.del就可以判斷出doc是否被删除。
如果是更新操作,會把之前的doc标記為delete狀态,重新寫入資料。
buffer每隔1秒進行refresh操作,則預設是每一秒生成一個segement file,當這個檔案增加到一定程度,會觸發merge操作,同時把.del檔案删除,将新的segement file寫入磁盤,同時替換掉之前的檔案。
4.什麼是反向索引
在搜尋引擎中,每個文檔都有一個對應的文檔 ID,文檔内容被表示為一系列關鍵詞的集合。例如,文檔 1 經過分詞,提取了 20 個關鍵詞,每個關鍵詞都會記錄它在文檔中出現的次數和出現位置。
那麼,反向索引就是關鍵詞到文檔 ID 的映射,每個關鍵詞都對應着一系列的檔案,這些檔案中都出現了關鍵詞。
有以下文檔:
DocId | Doc |
---|---|
1 | 谷歌地圖之父跳槽 Facebook |
2 | 谷歌地圖之父加盟 Facebook |
3 | 谷歌地圖創始人拉斯離開谷歌加盟 Facebook |
4 | 谷歌地圖之父跳槽 Facebook 與 Wave 項目取消有關 |
5 | 谷歌地圖之父拉斯加盟社交網站 Facebook |
對文檔進行分詞之後,得到以下反向索引(未進行嚴格的升序排列)。
WordId | Word | DocIds |
---|---|---|
1 | 谷歌 | 1,2,3,4,5 |
2 | 地圖 | 1,2,3,4,5 |
3 | 之父 | 1,2,4,5 |
4 | 跳槽 | 1,4 |
5 | 1,2,3,4,5 | |
6 | 加盟 | 2,3,5 |
7 | 創始人 | 3 |
8 | 拉斯 | 3,5 |
9 | 離開 | 3 |
10 | 與 | 4 |
… | … | … |
另外,實用的反向索引還可以記錄更多的資訊,比如文檔頻率資訊,表示在文檔集合中有多少個文檔包含某個單詞。
那麼,有了反向索引,搜尋引擎可以很友善地響應使用者的查詢。比如使用者輸入查詢
Facebook
,搜尋系統查找反向索引,從中讀出包含這個單詞的文檔,這些文檔就是提供給使用者展示的搜尋結果。
要注意反向索引的兩個重要細節:
- 反向索引中的所有詞項對應一個或多個文檔;
- 反向索引中的詞項根據字典順序升序排列