1.為什么要使用Elasticsearch?
因為在我們商城中的數(shù)據(jù),將來會非常多,所以采用以往的模糊查詢,模糊查詢前置配置,會放棄索引,導致商品查詢是全表掃面,在百萬級別的數(shù)據(jù)庫中,效率非常低下,而我們使用ES做一個全文索引,我們將經(jīng)常查詢的商品的某些字段,比如說商品名,描述、價格還有id這些字段我們放入我們索引庫里,可以提高查詢速度。
2.Elasticsearch是如何實現(xiàn)Master選舉的?
Elasticsearch的選主是ZenDiscovery模塊負責的,主要包含Ping(節(jié)點之間通過這個RPC來發(fā)現(xiàn)彼此)和Unicast(單播模塊包含一個主機列表以控制哪些節(jié)點需要ping通)這兩部分;
對所有可以成為master的節(jié)點(node.master: true)根據(jù)nodeId字典排序,每次選舉每個節(jié)點都把自己所知道節(jié)點排一次序,然后選出第一個(第0位)節(jié)點,暫且認為它是master節(jié)點。
如果對某個節(jié)點的投票數(shù)達到一定的值(可以成為master節(jié)點數(shù)n/2+1)并且該節(jié)點自己也選舉自己,那這個節(jié)點就是master。否則重新選舉一直到滿足上述條件。
補充:master節(jié)點的職責主要包括集群、節(jié)點和索引的管理,不負責文檔級別的管理;data節(jié)點可以關(guān)閉http功能。
3.Elasticsearch中的節(jié)點(比如共20個),其中的10個選了一個master,另外10個選了另一個master,怎么辦?
當集群master候選數(shù)量不小于3個時,可以通過設(shè)置最少投票通過數(shù)量(discovery.zen.minimum_master_nodes)超過所有候選節(jié)點一半以上來解決腦裂問題;
當候選數(shù)量為兩個時,只能修改為唯一的一個master候選,其他作為data節(jié)點,避免腦裂問題。
es 寫數(shù)據(jù)過程
客戶端選擇一個 node 發(fā)送請求過去,這個 node 就是?coordinating node(協(xié)調(diào)節(jié)點)。
coordinating node?對 document 進行路由,將請求轉(zhuǎn)發(fā)給對應的 node(有 primary shard)。[路由的算法是?]
實際的 node 上的?primary shard?處理請求,然后將數(shù)據(jù)同步到?replica node。
coordinating node?如果發(fā)現(xiàn)?primary node?和所有?replica node?都搞定之后,就返回響應結(jié)果給客戶端。
es 讀數(shù)據(jù)過程
可以通過?doc id?來查詢,會根據(jù)?doc id?進行 hash,判斷出來當時把?doc id?分配到了哪個 shard 上面去,從那個 shard 去查詢。
客戶端發(fā)送請求到任意一個 node,成為?coordinate node。
coordinate node?對?doc id?進行哈希路由,將請求轉(zhuǎn)發(fā)到對應的 node,此時會使用?round-robin隨機輪詢算法,在?primary shard?以及其所有 replica 中隨機選擇一個,讓讀請求負載均衡。
接收請求的 node 返回 document 給?coordinate node。
coordinate node?返回 document 給客戶端。