1. 程式人生 > >Es學習第十課,ElasticSearch集群搭建

Es學習第十課,ElasticSearch集群搭建

子網 日誌 工具 resp 配置 約束 location 開始 根據

前面幾課我們已經把ES的基本概念和查詢了解了,大家知道ES的核心優勢就是天生支持分布式,所以,這課我們專門講講怎麽搭建實現ES的集群部署。

ES分布式原理

1、es分布式概念

主分片(Primary shard) 索引的子集,索引可以切分成多個分片,分布到不同的集群節點上。分片對應的是 Lucene 中的索引。默認是根據id進行hash分片的。
副本分片(Replica shard)每個主分片可以有一個或者多個副本。
Mapping 相當於數據庫中的schema,用來約束字段的類型,不過 Elasticsearch 的 mapping 可以自動根據數據創建。
分配(Allocation) 將分片分配給某個節點的過程,包括分配主分片或者副本。如果是副本,還包含從主分片復制數據的過程。

在一個分布式系統裏面,可以通過多個elasticsearch運行實例組成一個集群,這個集群裏面有一個節點叫做主節點(master),elasticsearch是去中心化的,所以這裏的主節點是動態選舉出來的,不存在單點故障。es在外部看來elasticsearch就是一個整體。

在同一個子網內,只需要在每個節點上設置相同的集群名,elasticsearch就會自動的把這些集群名相同的節點組成一個集群。節點和節點之間通訊以及節點之間的數據分配和平衡全部由elasticsearch自動管理。

2、客戶端請求

請求可以發送到es集群中的任意一個節點上,該節點會將請求的query轉發給集群中所有節點,各個節點返回是否包含該query的倒排索引信息給該節點,然後該節點再發送二次請求給具體包含該query倒排的節點上進行計算。

3、es集群的選主和發現:

分布式系統要解決的第一個問題就是節點之間互相發現以及選主的機制。如果使用了 Zookeeper/Etcd 這樣的成熟的服務發現工具,這兩個問題都一並解決了。但 Elasticsearch 並沒有依賴這樣的工具,帶來的好處是部署服務的成本和復雜度降低了,不用預先依賴一個服務發現的集群,缺點當然是將復雜度帶入了 Elasticsearch 內部。

服務發現以及選主 ZenDiscovery

節點啟動後先ping(這裏的ping是 Elasticsearch 的一個RPC命令。如果 discovery.zen.ping.unicast.hosts 有設置,則ping設置中的host,否則嘗試ping localhost 的幾個端口, Elasticsearch 支持同一個主機啟動多個節點)


Ping的response會包含該節點的基本信息以及該節點認為的master節點。
選舉開始,先從各節點認為的master中選,規則很簡單,按照id的字典序排序,取第一個。
如果各節點都沒有認為的master,則從所有節點中選擇,規則同上。這裏有個限制條件就是 discovery.zen.minimum_master_nodes,如果節點數達不到最小值的限制,則循環上述過程,直到節點數足夠可以開始選舉。
最後選舉結果是肯定能選舉出一個master,如果只有一個local節點那就選出的是自己。
如果當前節點是master,則開始等待節點數達到 minimum_master_nodes,然後提供服務。
如果當前節點不是master,則嘗試加入master。
Elasticsearch 將以上服務發現以及選主的流程叫做 ZenDiscovery 。由於它支持任意數目的集群(1-N),所以不能像 Zookeeper/Etcd 那樣限制節點必須是奇數,也就無法用投票的機制來選主,而是通過一個規則,只要所有的節點都遵循同樣的規則,得到的信息都是對等的,選出來的主節點肯定是一致的。但分布式系統的問題就出在信息不對等的情況,這時候很容易出現腦裂(Split-Brain)的問題,大多數解決方案就是設置一個quorum值,要求可用節點必須大於quorum(一般是超過半數節點),才能對外提供服務。而 Elasticsearch 中,這個quorum的配置就是 discovery.zen.minimum_master_nodes 。

ES集群搭建流程

elasticsearch的config文件夾裏面有兩個配置文件:elasticsearch.yml和logging.yml,第一個是es的基本配置文件,第二個是日誌配置文件,es也是使用log4j來記錄日誌的,所以logging.yml裏的設置按普通log4j配置文件來設置就行了。

打開elasticsearch.yml的第一眼,配置文件的實例非常的簡單,我們主要講兩點:

cluster.name
配置es的集群名稱,默認是elasticsearch,不同的集群用名字來區分,es會自動發現在同一網段下的es,配置成相同集群名字的各個節點形成一個集群。如果在同一網段下有多個集群,就可以用這個屬性來區分不同的集群。
http.port
設置對外服務的http端口,默認為9200。不能相同,否則會沖突。

安裝實踐

1、集群將部署3個節點:

節點1:

cluster.name:elasticsearch-test

http.port:9200

節點2:

cluster.name:elasticsearch-test

http.port:19200

節點3:

cluster.name:elasticsearch-test

http.port:29200

2、集群配置

上文提到過,只要集群名相同,且機器處於同一局域網同一網段,es會自動去發現其他的節點。

3、配置完成,啟動三個es節點

4、上述三步完成後,一個集群就搭建好了,是不是很簡單;這時我們通過客戶端添加一個索引後,數據就會在這三個節點自動分片存儲,同時ES會自動分配副本分片做備份。



Es學習第十課,ElasticSearch集群搭建