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

  前面幾課咱們已經把ES的基本概念和查詢瞭解了,你們知道ES的核心優點就是天生支持分佈式,因此,這課咱們專門講講怎麼搭建實現ES的集羣部署。node

ES分佈式原理

  一、es分佈式概念 

主分片(Primary shard) 索引的子集,索引能夠切分紅多個分片,分佈到不一樣的集羣節點上。分片對應的是 Lucene 中的索引。默認是根據id進行hash分片的。
副本分片(Replica shard)每一個主分片能夠有一個或者多個副本。
Mapping 至關於數據庫中的schema,用來約束字段的類型,不過 Elasticsearch 的 mapping 能夠自動根據數據建立。
分配(Allocation) 將分片分配給某個節點的過程,包括分配主分片或者副本。若是是副本,還包含從主分片複製數據的過程。數據庫

  在一個分佈式系統裏面,能夠經過多個elasticsearch運行實例組成一個集羣,這個集羣裏面有一個節點叫作主節點(master),elasticsearch是去中心化的,因此這裏的主節點是動態選舉出來的,不存在單點故障。es在外部看來elasticsearch就是一個總體。app

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

二、客戶端請求

請求能夠發送到es集羣中的任意一個節點上,該節點會將請求的query轉發給集羣中全部節點,各個節點返回是否包含該query的倒排索引信息給該節點,而後該節點再發送二次請求給具體包含該query倒排的節點上進行計算。分佈式

三、es集羣的選主和發現:

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

服務發現以及選主 ZenDiscoveryspa

節點啓動後先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。不能相同,不然會衝突。

安裝實踐

一、集羣將部署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

二、集羣配置

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

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

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

相關文章
相關標籤/搜索