核心概念
- Cluster,服務(wù)節(jié)點集合,集群名稱必須唯一,默認為"elasticsearch"。
- Node, 單服務(wù)節(jié)點,通過名稱標(biāo)識,默認為UUID,節(jié)點通過集群名加入集群中。
- Index,把一個或多個分片的分組在一起的邏輯空間,默認分為5個主分片和一個replica分片,全部小寫。
- Type,索引的邏輯分區(qū),在Index里可定義多個Type。
- Document,被索引的基本單元,JSON格式。
- Shards & Replicas 分片&副本,一個分片就是一個lucene實例,實際索引數(shù)據(jù)。
- Cluster Health: green, yellow, red, green表示集群所有功能都完正常的, yellow表示所有數(shù)據(jù)都是有效的,但是部分副本還沒分配, red表示部分數(shù)據(jù)不是有效的。
- 提供REST API風(fēng)格請求處理方式: REST請求URI和REST請求體。
- NRT Near Real Time, 索引文檔到文檔可被搜索到通常延時1s,故是準(zhǔn)實時,時間可調(diào)節(jié)。(默認索引refresh時間,index.refresh_interval=1s)。
CURD
Term查詢
term是代表完全匹配,也就是精確查詢,搜索前不會再對搜索詞進行分詞,所以我們的搜索詞必須是文檔分詞集合中的一個,如果搜索詞不在文檔分詞中,即便搜索詞是文檔的子串也不行。
模式Mapping
類似于數(shù)據(jù)庫中標(biāo)表的定義。es已經(jīng)不支持刪除mapping了,可以添加新的字段,但是不能修改字段。如果要重建新的mapping,只能刪除索引重新建立新的mapping。
ttl可以動態(tài)修改,但是已經(jīng)索引的數(shù)據(jù)的ttl無法修改,只會對新索引的數(shù)據(jù)有效。
Zen Discovery發(fā)現(xiàn)機制
發(fā)現(xiàn)集群中其它節(jié)點;選舉master。
master功能:維護整個集群的狀態(tài),通知其他節(jié)點;同時當(dāng)有節(jié)點加入或離開集群時,負責(zé)重新分配shard。
對選主算法有個比較好的流程分析:http://www.easyice.cn/archives/164
選舉算法 https://en.wikipedia.org/wiki/Leader_election
master的選舉算法:
默認, 一個Node既可以是master節(jié)點,也可以是data節(jié)點。
只有具備成為master節(jié)點資格的候選節(jié)點才有可能成為master, 資格的配置通過node.master=true指定。
根據(jù)nodeId排序, 由小到達, 然后選擇第一個node為master節(jié)點。
ping請求通過transport發(fā)出
es的默認發(fā)現(xiàn)機制zen,2.0以上的版本提供了unicast, 1.x的版本還提供了multicast。新版的multicast已經(jīng)廢棄了。很多服務(wù),由于其安全性,如阿里云不支持多播,及時開啟了多播,也只能找到本機上的節(jié)點。
ping和unicaset均使用transport通信模塊來與其他節(jié)點通信。
手動指定transport.tcp.port時,需要配置unicast列表(只需集群中的一臺節(jié)點配置即可,便可以相互發(fā)現(xiàn),最好全部都配置,以免改服務(wù)器宕機)。
相互ping:
當(dāng)master節(jié)點停止或者遇到問題之后集群節(jié)點會相互ping并且產(chǎn)生一個新的master節(jié)點,這種相互ping會阻止一個節(jié)點和master節(jié)點出現(xiàn)網(wǎng)絡(luò)閃斷后,就認為master停止的情況,因為它還可以從其他節(jié)點獲取master節(jié)點是否是活躍的。
故障檢測FD
es 跑了兩個默認的感知線程,一個是master用來檢測集群中的其他成員節(jié)點是否存活,另一個是其他成員節(jié)點檢測master節(jié)點的存活(如果不存活,發(fā)起一個選舉進程)。
集群狀態(tài)更新
master節(jié)點是唯一能更新集群狀態(tài)的節(jié)點,每次只處理一個狀態(tài)的更新,之后再處理在隊列中的下一個更新。它發(fā)布狀態(tài)的更改給成員節(jié)點,成員節(jié)點收到通知,不會立刻更改狀態(tài),先回復(fù)消息給master節(jié)點,master會有一個等待超時(discovery.zen.publish_timeout ),等待至少discovery.zen.minimum_master_nodes個節(jié)點答復(fù),否則拒絕更新狀態(tài)。
無master阻塞:
當(dāng)集群不能產(chǎn)生一個master的時候,discovery.zen.no_master_block 用來配置操作的策略,它有兩個配置:
- all (節(jié)點上的所有讀寫操作都被拒絕,這也包括了集群api狀態(tài)的讀寫操作)
- write(寫操作會被拒絕,讀操作能成功)
discovery.zen.no_master_block 配置的設(shè)置不影響節(jié)點基本的api,如節(jié)點信息和節(jié)點統(tǒng)計api。