在分佈式搜索引擎中,elasticsSearch逐漸變成一種標準了,其經過簡單連貫的RESTful API讓全文搜索變得簡單並隱藏Lucene的複雜性。但底層仍是使用Lucene來實現搜索功能。算法
索引建立能夠指定分片的數量以及副本的數量,分片數量在建立以後沒法改變,副本數量在以後能夠改變,隨着集羣中節點的增長與刪除,各個分片與副本會從新分配到各個節點中。分片和副本不會分配到一個節點上,分片經過hash算法平均分佈在各個節點上,也能夠自定義分片分佈規則(讓在集羣的某些節點和某個節點建立分片),如經過自定義分片分佈規則實現冷熱分離提升性能。由於這種分片機制,咱們能夠經過增長集羣中節點保證一臺機器的分片不會太多提升搜索性能。數據庫
集羣中會自動選舉一個master節點,master節點的主要做用是管理集羣,維護索引元數據等。master掛掉,集羣從新選舉master節點,master節點而後切換節點的身份爲master。緩存
寫請求被路由到只往primaryShard寫,而後會自動同步到replicaShard,讀的話primaryShard和replicaShard讀均可以。性能優化
協調節點接收到寫入請求,將寫入請求數據經過哈希算法路由到對應的shard的primaryShard上去。primaryShard的節點接收到請求數據,首先把segment fiel以及transLog(事務日誌)寫入本身的應用內存buffer當中,而後默認每隔1s,將buffer中的數據refresh數據到osCache(文件系統緩存)中。此時客戶端就能查詢到數據了。這個過程很是快,由於並無涉及到數據的持久化(因此是準實時的)。當translog文件過大或達到必定時間(默認30分鐘)會觸發flush操做,flush操做會將segmentfile統一flush到磁盤文件,同時生成一個commitpoint,記錄生成的segmentfile,而後清空translog。負載均衡
注意:分佈式
刪除有點相似僞刪除,它先是經過將對應刪除的記錄寫入磁盤上的.del文件,標誌那些document被刪除(若是此時搜索將會搜索到這些文檔但不會返回)。當segment File多到必定程度時候,ES將執行物理刪除操做, 完全清除這些文檔。函數
修改數據是先刪後增,將原來的數據標誌位deleted狀態,而後新寫入一個document。性能
經過document 的id hash到指定分片,而後根據負載均衡算法(默認輪詢),路由到該分片節點之一讀取數據。優化
協調節點,把請求發送到全部擁有該索引的節點上去,可是對於主parimaryShard和replicaShard只會查其中之一,每一個shard把查詢結果的docId返回給協調節點。接着協調節點根據docId去實際存放數據的節點拉取docment,由協調節點進行合併、排序、分頁等操做,而後返回給客戶端。搜索引擎
elasticsSearch的高性能很大程度依賴於osCache的大小,畢竟走內存確定比走硬盤快,因此能夠提升filesystemCache的大小盡量覆蓋多的segment文件來提升性能。
作一個子系統,每隔一段對熱點數據搜索一下。由於osCache實際上仍是基於LRU緩存的。
將熱數據專門寫一個索引,冷數據又單獨寫個索引,經過控制分片規則分放在不一樣的機器,由於熱數據數據量少,沒有冷數據的話,能夠保證儘量多的數據都在osCache裏面,而由於冷數據不走熱數據節點,避免oscache頻繁切換數據的開銷。
寫入es模型的就完成Type之間的關聯,創建冗餘字段(別在es中join),由於若是在搜索中運用到了索引之間的關聯效率是很低的。
假設查詢100頁,會有1-100頁的數據到協調節點來,而後協調節點才完成排序、篩選、分頁,這是深度分頁。應對方案有兩種,一是咱們的系統設計不容許翻那麼深的頁,或默認翻的越深,性能越差。二是利用elasticsSearch的ScrollAPI,ScrollAPI容許咱們作一個初始階段搜索而且持續批量從Elasticsearch里拉取結果直到沒有結果剩下,缺點是隻能一頁一頁日後翻,不能跳着翻。