天天看點

Elasticsearch叢集部署詳解

1、題記

之前應用都是Elasticsearch單節點,随着業務的拓展、資料量的增多,部署分布式Elasticsearch刻不容緩。

本文以Elaticsearch2.3.4版本為基礎,講解Elasticsearch三個節點的分布式部署、核心配置的含義以及分布式部署遇到的坑。

2、三節點 Elasticsearch 分布式部署。

步驟1:配置好主節點Master資訊。

# ======================== Elasticsearch Configuration =========================
 13 # ---------------------------------- Cluster -----------------------------------
 14 #
 15 # Use a descriptive name for your cluster:
 16 # 簇名稱,分布式部署,確定該名稱唯一。
 17 cluster.name: my-application
 18 #
 19 # ------------------------------------ Node ------------------------------------
 20 #
 21 # Use a descriptive name for the node:
 22 # 節點名稱
 23 node.name: laoyng
 24 node.master: true
 25 node.data: true
 26 #
 27 # Add custom attributes to the node:
 28 #
 29 # node.rack: r1
 30 #
 31 # ----------------------------------- Paths ------------------------------------
 32 # 資料存儲
 33 # Path to directory where to store the data (separate multiple locations by comma):
 34 #
 35 path.data: /data/elasticsearch/data
 36 path.logs: /data/logs/elasticsearch
 37 path.plugins: /data/elasticsearch/plugins
 38 path.scripts: /data/elasticsearch/scripts
 39 #
 40 # Path to log files:
 41 #
 42 # path.logs: /path/to/logs
 43 #
 44 # ----------------------------------- Memory -----------------------------------
 45 #
 46 # Lock the memory on startup:
 47 #
 48 bootstrap.mlockall: true
 49 #
 50 # Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory
 51 # available on the system and that the owner of the process is allowed to use this limit.
 52 #
 53 # Elasticsearch performs poorly when the system is swapping the memory.
 54 #
 55 # ---------------------------------- Network -----------------------------------
 56 #
 57 # Set the bind address to a specific IP (IPv4 or IPv6):
 58 # IP位址
 59 network.host: 110.10.11.130
 60 #
 61 # Set a custom port for HTTP:
 62 # 端口
 63 http.port: 9200

 68 # --------------------------------- Discovery ----------------------------------
 69 #
 70 # Pass an initial list of hosts to perform discovery when new node is started:
 71 # The default list of hosts is ["127.0.0.1", "[::1]"]
 76 discovery.zen.ping.unicast.hosts: [" 110.10.11.130 :9300", "10.118.110.112:9300", "110.0.11.143:9300"]
 77 # Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1):
 78 #
 79 # discovery.zen.minimum_master_nodes: 3
 80 #
 81 discovery.zen.minimum_master_nodes: 2
 82 # For more information, see the documentation at:
 85 # ---------------------------------- Gateway -----------------------------------
 86 #
 87 # Block initial recovery after a full cluster restart until N nodes are started:
 88 #
 89 # gateway.recover_after_nodes: 3
 90 gateway.recover_after_nodes: 3
 91 gateway.recover_after_time: 5m
 92 gateway.expected_nodes: 1
 93 #
 97 # ---------------------------------- Various -----------------------------------
 98 #
 99 # Disable starting multiple nodes on a single system:
100 #
101 # node.max_local_storage_nodes: 1
102 #
103 # Require explicit names when deleting indices:
104 #
105 # action.destructive_requires_name: true
106 #index.analysis.analyzer.ik.type : “ik”
107 script.engine.groovy.inline.search: on
108 script.engine.groovy.inline.aggs: on
109 indices.recovery.max_bytes_per_sec: 100mb
110 indices.recovery.concurrent_streams: 10           

步驟2:拷貝到節點2 cient節點;修改節點名稱資訊。

隻列舉不一樣的配置:

node.name: laoyng02
node.master: true
node.data: false
network.host: 10.118.110.112           

步驟3:拷貝到節點3 data節點;修改節點名稱

node.name: laoyng03
node.master: false
node.data:  true
network.host:  110.0.11.143           

步驟4:分别運作Master,client,data節點(順序無關)

./elasticsearch -d           

部署成功标志

Elasticsearch叢集部署詳解

2、部署節點原理

多機叢集中的節點可以分為master nodes和data nodes,在配置檔案中使用Zen發現(Zen discovery)機制來管理不同節點。Zen發現是ES自帶的預設發現機制,使用多點傳播發現其它節點。隻要啟動一個新的ES節點并設定和叢集相同的名稱這個節點就會被加入到叢集中。(是以,同叢集的叢集名稱一緻,才能便于自動發現)

Elasticsearch叢集中有的節點一般有三種角色:master node、data node和client node。

1)master node——master節點點主要用于中繼資料(metadata)的處理,比如索引的新增、删除、分片配置設定等。

2)client node——client 節點起到路由請求的作用,實際上可以看做負載均衡器。

3)data node——data 節點上儲存了資料分片。它負責資料相關操作,比如分片的 CRUD,以及搜尋和整合操作。這些操作都比較消耗 CPU、記憶體和 I/O 資源;

3、elasticearch配置含義解釋

1)叢集名和節點名:

#cluster.name: elasticsearch
#node.name: "Franz Kafka"           

2)是否參與master選舉和是否存儲資料

#node.master: true
#node.data: true           

3)分片數和副本數

#index.number_of_shards: 5
#index.number_of_replicas: 1           

4)master選舉最少的節點數,這個一定要設定為N/2+1,其中N是:具有master資格的節點的數量,而不是整個叢集節點個數。

#discovery.zen.minimum_master_nodes: 2           

5)discovery ping的逾時時間,擁塞網絡,網絡狀态不佳的情況下設定高一點

#discovery.zen.ping.timeout: 3s           

6)關閉自動發現節點:

discovery.zen.ping.multicast.enabled: false           

單點傳播模式安全,也高效,但是缺點就是如果增加了一個新的機器的話,就需要每個節點上進行配置才生效了。

多點傳播是需要看伺服器是否支援的,由于其安全性,其實作在基本的雲服務(比如阿裡雲)是不支援多點傳播的,是以即使你開啟了多點傳播模式,你也僅僅隻能找到本機上的節點。

7)定義發現的節點:

discovery.zen.ping.unicast.hosts: [" 110.10.11.130 :9300", "10.118.110.112:9300", "110.0.11.143:9300"]           

此處也可以寫成hostname的形式。

注意,分布式系統整個叢集節點個數N要為奇數個!!

4、分布式部署遇到的坑

三節點不能聯通的原因:

1、各節點的hostname沒有正确設定,和節點名稱設定為一緻。

2、關閉防火牆,service iptables stop;否則,打開防火牆會導緻無法正常通信,head插件不能看到節點資料資訊。

參考:

1、[官網部署參考]:

https://www.elastic.co/guide/en/elasticsearch/guide/current/deploy.html

2、

http://blog.csdn.net/napoay/article/details/52202877

題外話——一個bug引發的思考

注意:

我們正常配置叢集的時候,往往會配置好一台機器,然後拷貝這台機器的全部資訊到另外兩台或者更多台機器。

如果這樣的話,可能就會出現:"master_not_discovered_exception 的異常。

[es@master root]$ curl -XGET 'http://localhost:9200/_cluster/state?pretty'
{
  "error" : {
    "root_cause" : [
      {
        "type" : "master_not_discovered_exception",
        "reason" : null
      }
    ],
    "type" : "master_not_discovered_exception",
    "reason" : null
  },
  "status" : 503
}           

主節點異常的一般原因是:網絡問題,防火牆設定的問題等。

但,還有一種原因是:我把之前的copy到裡另外兩台,data裡的節點沒有删除。

根據進一步的錯誤日志

elasticsearch.log

進行排查,

] failed to send join request to master            

錯誤原因在github上有讨論:

描述的情況是因為第二個節點使用的資料檔案夾是第一個節點檔案夾的副本,這包括其節點ID。這是不受支援的,

如果你這樣做,各種各樣的事情都可能出錯。您應該使用空資料檔案夾啟動一個新節點,并允許Elasticsearch跨自身複制資料。

思考:

  • 遇到類似叢集問題,通過state API看到的是狀态:“aster_not_discovered_exception”,
  • 而通過錯誤日志:“failed to send join request to master ”,基本能定位到代碼級别的報錯,
  • 進一步結合日志,就能定位到原因。
https://discuss.elastic.co/t/cluster-node-not-joining/136072 https://github.com/elastic/elasticsearch/issues/21405

作者:銘毅天下

轉載請标明出處,原文位址:

http://blog.csdn.net/laoyang360/article/details/72850834

繼續閱讀