CentOS7下Elasticsearch叢集部署記錄

散盡浮華發表於2017-10-19

 

Elasticsearch是一個分散式搜尋服務,提供Restful API,底層基於Lucene,採用多shard的方式保證資料安全,並且提供自動resharding的功能,github等大型的站點也都採用Elasticsearch作為其搜尋服務。廢話在此就不多贅述了,下面記錄下CentOS7下Elasticsearch叢集部署過程:

1)基礎資訊

elk-es01.kevin.cn    192.168.10.44
elk-es02.kevin.cn    192.168.10.45
elk-es03.kevin.cn    192.168.10.46

下面操作在三個節點機上都要操作
[root@elk-es01 ~]# systemctl stop firewalld.service
[root@elk-es01 ~]# systemctl disable firewalld.service
[root@elk-es01 ~]# firewall-cmd --state
not running

[root@elk-es01 ~]# setenforce 0
setenforce: SELinux is disabled
[root@elk-es01 ~]# getenforce 
Disabled
[root@elk-es01 ~]# vim /etc/sysconfig/selinux 
......
SELINUX=disabled

[root@elk-es01 ~]# cat /etc/hosts
.....
192.168.10.44 elk-es01.kevin.cn
192.168.10.45 elk-es02.kevin.cn
192.168.10.46 elk-es03.kevin.cn

[root@elk-es01 ~]# /usr/sbin/ntpdate ntp1.aliyun.com

2)安裝java8環境,官方建議5.4版本最至少Java 8或以上(三個節點機都要操作)

[root@elk-es01 ~]# cd /usr/local/src/
[root@elk-es01 src]# ll jdk-8u131-linux-x64_.rpm 
-rw-r--r-- 1 root root 169983496 Nov 19  2017 jdk-8u131-linux-x64_.rpm
[root@elk-es01 src]# rpm -ivh jdk-8u131-linux-x64_.rpm
[root@elk-es01 src]# java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

3)安裝elasticsearch(三個節點機都要操作)

官方下載地址:https://www.elastic.co/downloads/past-releases
這裡選擇5.6.9版本
[root@elk-es01 src]# pwd
/usr/local/src
[root@elk-es01 src]# ll /usr/local/src/elasticsearch-5.6.9.rpm
-rw-r--r-- 1 root root 33701914 May 28 09:54 /usr/local/src/elasticsearch-5.6.9.rpm
[root@elk-es01 src]# rpm -ivh elasticsearch-5.6.9.rpm --force
  
elasticsearch叢集配置
[root@elk-es01 src]# cat /etc/elasticsearch/elasticsearch.yml |grep -v "#"
cluster.name: kevin-elk                              #叢集名稱,三個節點的叢集名稱配置要一樣
node.name: elk-es01.kevin.cn                #叢集節點名稱,一般為本節點主機名。注意這個要是能ping通的,即在各節點的/etc/hosts裡繫結。
path.data: /data/es-data                            #叢集資料存放目錄
path.logs: /var/log/elasticsearch                   #日誌路徑
network.host: 192.168.10.44                             #服務繫結的網路地址,一般填寫本節點ip;也可以填寫0.0.0.0
http.port: 9200                                     #服務接收請求的埠號
discovery.zen.ping.unicast.hosts: ["192.168.10.44", "192.168.10.45", "192.168.10.46"]    #新增叢集中的主機地址,會自動發現並自動選擇master主節點
  
另外兩個節點的elasticsearch.yml檔案配置,如上相似,只需修改節點名和地址即可。
  
[root@elk-es01 src]# mkdir -p /data/es-data
[root@elk-es01 src]# chown -R elasticsearch.elasticsearch /data/es-data       #這一步授權不能忘記,否則下面的es伺服器啟動會失敗!

啟動elasticsearch
[root@elk-es01 src]# systemctl daemon-reload
[root@elk-es01 src]# systemctl start elasticsearch
  
[root@elk-es01 src]# systemctl status elasticsearch
[root@elk-es01 src]# lsof -i:9200
COMMAND   PID          USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    20061 elasticsearch  195u  IPv6 1940586      0t0  TCP elk-es01.kevin.cn:wap-wsp (LISTEN)

4)檢視叢集資訊(如下操作在任意一臺節點機上都可操作)

注意:Elasticsearch 5.x版本不再支援相關外掛,比如elasticsearch-head,解釋可以訪問官網,實在需要,可以獨立執行(此處跳過)。
 
a)查詢叢集狀態方法
[root@elk-es01 src]# curl -XGET 'http://192.168.10.44:9200/_cat/nodes'
192.168.10.44  8 37 0 0.00 0.01 0.05 mdi - elk-es01.kevin.cn
192.168.10.46 20 36 0 0.00 0.01 0.05 mdi - elk-es03.kevin.cn
192.168.10.45 14 36 0 0.00 0.01 0.05 mdi * elk-es02.kevin.cn    #帶*號表示該節點是master主節點
 
後面新增 ?v ,表示詳細顯示
[root@elk-es01 src]# curl -XGET 'http://192.168.10.44:9200/_cat/nodes?v'
ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.10.44            9          37   0    0.00    0.01     0.05 mdi       -      elk-es01.kevin.cn
192.168.10.46           20          36   0    0.00    0.01     0.05 mdi       -      elk-es03.kevin.cn
192.168.10.45           16          36   0    0.00    0.01     0.05 mdi       *      elk-es02.kevin.cn
 
b)查詢叢集狀態方法
[root@elk-es01 src]# curl -XGET 'http://192.168.10.44:9200/_cluster/state/nodes?pretty'
{
  "cluster_name" : "kevin-elk",
  "nodes" : {
    "8xvAOooeQlK1cilfHGTdHw" : {
      "name" : "elk-es01.kevin.cn",
      "ephemeral_id" : "9MeQir6KQ-aG0_nlZnq87g",
      "transport_address" : "192.168.10.44:9300",
      "attributes" : { }
    },
    "Uq94w9gHRR6ewtI4SoXC2Q" : {
      "name" : "elk-es03.kevin.cn",
      "ephemeral_id" : "PLZfo1q9TzyJ61v2v4-5aA",
      "transport_address" : "192.168.10.46:9300",
      "attributes" : { }
    },
    "NOM0bFmvRDSJDLbJzRsKEQ" : {
      "name" : "elk-es02.kevin.cn",
      "ephemeral_id" : "VnhtQtjrT4eL3P4C3cY6uA",
      "transport_address" : "192.168.10.45:9300",
      "attributes" : { }
    }
  }
}
 
c)查詢叢集中的master
[root@elk-es01 src]# curl -XGET 'http://192.168.10.44:9200/_cluster/state/master_node?pretty'
{
  "cluster_name" : "kevin-elk",
  "master_node" : "NOM0bFmvRDSJDLbJzRsKEQ"
}
 
或者
[root@elk-es01 src]# curl -XGET 'http://192.168.10.44:9200/_cat/master?v'
id                     host      ip        node
NOM0bFmvRDSJDLbJzRsKEQ 192.168.10.45 192.168.10.45 elk-es02.kevin.cn
 
d)查詢叢集的健康狀態(一共三種狀態:green、yellow,red;其中green表示健康。)
[root@elk-es01 src]# curl -XGET 'http://192.168.10.44:9200/_cat/health?v'
epoch      timestamp cluster  status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1527489534 14:38:54  kevin-elk green           3         3      2   1    0    0        0             0                  -                100.0%
 
或者
[root@elk-es01 src]# curl -XGET 'http://192.168.10.44:9200/_cluster/health?pretty'
{
  "cluster_name" : "kevin-elk",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 1,
  "active_shards" : 2,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

=====================下面貼一個之前線上es叢集服務追加節點的操作記錄======================

之前線上的一個圖片搜尋業務使用了elasticsearch叢集服務, 叢集一開始是3個節點, 後來隨著業務量增加, 需要再追加一臺es節點到這個叢集中去. 
以下是操作記錄:

在追加的那臺es節點叢集上擦著:
1)安裝jdk和elasticsearch
jdk-8u5-linux-x64.rpm下載地址:
https://pan.baidu.com/s/1bpxtX5X      (提取密碼:df6s)

elasticsearch-5.5.0.rpm下載地址:
https://pan.baidu.com/s/1mibwWeG     (提取密碼:vtm2)

[root@qd-vpc-op-es04 ~]# cd tools/
[root@qd-vpc-op-es04 tools]# ls
elasticsearch-5.5.0.rpm  jdk-8u5-linux-x64.rpm
[root@qd-vpc-op-es04 tools]# rpm -ivh elasticsearch-5.5.0.rpm
[root@qd-vpc-op-es04 tools]# rpm -ivh jdk-8u5-linux-x64.rpm
[root@qd-vpc-op-es04 tools]# java -version
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

2)配置elasticsearch
[root@qd-vpc-op-es04 ~]# cd /etc/elasticsearch/
[root@qd-vpc-op-es04 elasticsearch]# ls
elasticsearch.yml  elasticsearch.yml.bak  jvm.options  log4j2.properties  nohup.out  scripts

[root@qd-vpc-op-es04 elasticsearch]# cat elasticsearch.yml|grep -v "#"           //叢集中每個節點的配置內容都基本一致
cluster.name: image_search                                                       //叢集名稱
node.name: image_search_node_4                                                   //叢集中本節點的節點名稱,這裡定義即可
path.data: /data/es/data                                                         //服務目錄路徑
path.logs: /data/es/logs                                                         //服務日誌路徑
discovery.zen.ping.unicast.hosts: ["172.16.50.247","172.16.50.249","172.16.50.254","172.16.50.16"]     //這裡是各節點的ip地址
network.host: 0.0.0.0                                                            //服務繫結的網路地址

預設elasticsearch服務埠時9200
[root@qd-vpc-op-es04 elasticsearch]# cat elasticsearch.yml|grep 9200
#http.port: 9200

[root@qd-vpc-op-es04 elasticsearch]# systemctl start elasticsearch.service
[root@qd-vpc-op-es04 elasticsearch]# systemctl restart elasticsearch.service
[root@qd-vpc-op-es04 elasticsearch]# systemctl status elasticsearch.service

[root@qd-vpc-op-es04 elasticsearch]# ps -ef|grep elasticsearch
[root@qd-vpc-op-es04 elasticsearch]# lsof -i:9200
COMMAND   PID          USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    10998 elasticsearch  320u  IPv4  39255      0t0  TCP *:wap-wsp (LISTEN)

檢查elasticsearch的健康狀態
[root@qd-vpc-op-es04 elasticsearch]# curl 'localhost:9200/_cat/indices?v'
health status index                    uuid                     pri rep docs.count   docs.deleted store.size pri.store.size
green  open   video_filter             Bx7He6ZtTEWuRBqXYC6gRw   5   1   458013       0            4.1gb      2gb
green  open   recommend_history_image  svYo_Do4SM6wUiv6taUWug   5   1   2865902      0            24.9gb     12.4gb
green  open   recommend_history_gif    rhN3MDN2TbuYILqEDksQSg   5   1   265731       0            2.4gb      1.2gb
green  open   post_images              TMsMsMEoR5Sdb7UEQJsR5Q   5   1   48724932     0            407.3gb    203.9gb
green  open   review_images_v2         qzqnknpgTniU4rCsvXzs0w   5   1   50375955     0            61.6gb     30.9gb
green  open   review_images            rWC4WlfMS8aGe-GOkTauZg   5   1   51810877     0            439.3gb    219.7gb
green  open   sensitive_images         KxSrjvXdSz-y8YcqwBMsZA   5   1   13393        0            128.1mb    64mb
green  open   post_images_v2           FDphBV4-QuKVoD4_G3vRtA   5   1   49340491     0            55.8gb     27.8gb

從上面的命令結果中可以看出,本節點已經成功加入到名為image_search的elasticsearch叢集中了,green表示節點狀態很健康,資料也已經在同步中了。

3)在程式碼中更新elasticsearch的配置
通知開發同事,在程式碼中增加新增elasticsearch節點的配置,上線更新後,到新節點上檢視elasticsearch日誌是否有資訊寫入:
[root@qd-vpc-op-es04 ~]# cd /data/es/logs/
[root@qd-vpc-op-es04 ~]# chown -R elasticsearch.elasticsearch /data/es
[root@qd-vpc-op-es04 logs]# ls
image_search_deprecation.log  image_search_index_indexing_slowlog.log  image_search_index_search_slowlog.log  image_search.log

======特別注意=======
如果往elasticsearch叢集中新增一個節點,做法如下:
1)在新節點上安裝jdk和elasticsearch服務,配置elasticsearch.yml檔案了,啟動elasticsearch服務
2)在叢集中其他節點上配置elasticsearch.yml檔案,不需要啟動elasticsearch服務
3)在新節點上執行curl 'localhost:9200/_cat/indices?v'命令,檢視健康狀態以及資料同步情況
4)在程式碼中增加新增elasticsearch節點的配置,上線更新後,檢視新增節點的elasticsearch日誌是否有資訊寫入

==============================================================
順便貼一下之前其他三個es節點的elasticsearch.yml檔案配置:
[root@qd-vpc-op-es01 ~]# cat /etc/elasticsearch/elasticsearch.yml |grep -v "#"
cluster.name: image_search
node.name: image_search_node_1
path.data: /data/es/data
path.logs: /data/es/logs
discovery.zen.ping.unicast.hosts: ["172.16.50.16","172.16.50.247","172.16.50.249","172.16.50.254"]
network.host: 0.0.0.0

[root@qd-vpc-op-es02 ~]# cat /etc/elasticsearch/elasticsearch.yml |grep -v "#"
cluster.name: image_search
node.name: image_search_node_2
path.data: /data/es/data
path.logs: /data/es/logs
discovery.zen.ping.unicast.hosts: ["172.16.50.16","172.16.50.247","172.16.50.249","172.16.50.254"]
network.host: 0.0.0.0

[root@qd-vpc-op-es03 ~]# cat /etc/elasticsearch/elasticsearch.yml|grep -v "#"
cluster.name: image_search
node.name: image_search_node_3
path.data: /data/es/data
path.logs: /data/es/logs
discovery.zen.ping.unicast.hosts: ["172.16.50.247","172.16.50.249","172.16.50.254","172.16.50.16"]
network.host: 0.0.0.0

相關文章