1. 程式人生 > 實用技巧 >ElasticSearch 叢集

ElasticSearch 叢集

1.ElasticSearch 叢集相關概念

1.ES叢集顏色狀態

①. — 紅色:資料都不完整

②. — 黃色:資料完整,但是副本有問題

③. — 綠色:資料和副本全都沒有問題

2.ES 叢集節點型別

①. — 主節點:負責排程分配資料

②. — 資料節點:處理分配到自己的資料

3.ES 叢集分片型別

①. — 主分片:儲存資料,負責讀寫資料

②. — 副本分片:主分片的備份

4.ES 叢集安全保障

①. — 資料會自動分配到多個節點

②. — 如果主分片所在節點掛掉,副本節點的分片會自動升為主分片

③. — 如果主節點掛了,資料節點會自動提升為主節點

2.ES 叢集配置注意事項

1.叢集節點的配置,不需要將所有節點的 IP 都寫入配置檔案,只需要寫本機 IP 和叢集中任意一臺機器的 IP 即可:

# 修改 /etc/elasticsearch/elasticsearch.yml 配置檔案
122 配置:    discovery.zen.ping.unicast.hosts: ["10.0.0.121", "10.0.0.122"]
123 配置:    discovery.zen.ping.unicast.hosts: ["10.0.0.121", "10.0.0.123"]
xxx 配置:    discovery.zen.ping.unicast.hosts: ["10.0.0.121", "10.0.0.xxx"]

2.— 叢集選舉節點配置數量,一定是 N(叢集節點總數)/2+1:

# 修改 /etc/elasticsearch/elasticsearch.yml 配置檔案,當前叢集節點總數 N = 3
discovery.zen.minimum_master_nodes: 2

3.ES 預設 5 個分片 1 個副本,索引建立以後,分片數量不得修改,副本數可以修改

# ======= 配置檔案 ======= #
# 修改 /etc/elasticsearch/elasticsearch.yml 配置引數
# 設定索引的分片數 , 預設為 5 
index.number_of_shards: 5  

# 設定索引的副本數 , 預設為 1  
index.number_of_replicas: 1  

4.資料分配時,分片顏色

# 紫色:資料正在遷移(擴充套件節點時會遇到)


# 黃色:資料正在複製(節點宕機,其他節點需要補全分片副本)

5.當叢集共有三個節點時,根據配置的分片副本數,可發生的故障:

 1)三個節點,沒有副本時,一臺機器都不能壞

​ 2)三個節點,一個副本時,可以壞兩臺,但是隻能一臺一臺壞(要時間複製生成新的副本)

​ 3)三個節點,兩個副本時,可以壞兩臺(一起壞)

3.ES 叢集相關命令

# ======= ES 叢集狀態 ======= #
# 1.檢視主節點
GET _cat/master

# 2.檢視叢集健康狀態
GET _cat/health

# 3.檢視索引
GET _cat/indices

# 4.檢視所有節點
GET _cat/nodes

# 5.檢視分片
GET _cat/shards

# 一般可以通過以下兩個命令監控叢集的健康狀態,兩者有一個發變化,說明叢集發生故障
GET _cat/health
GET _cat/nodes
# 實際上 Kibana 會內建 X-Pack 軟體,監控叢集的健康狀態

4.ElasticSearch 叢集配置修改

1.配置分片數 & 副本數

# ES 預設 5 個分片 1 個副本,索引建立以後,分片數量不得修改,副本數可以修改

# ======= 配置檔案 ======= #
# 修改 /etc/elasticsearch/elasticsearch.yml 配置引數
# 設定索引的分片數 , 預設為 5 
index.number_of_shards: 5  

# 設定索引的副本數 , 預設為 1  
index.number_of_replicas: 1  

2.修改指定索引副本數

PUT /index/_settings
{
  "number_of_replicas": 2
}

3.修改所有索引副本數

PUT _all/_settings
{
  "number_of_replicas": 2
}

4.建立索引時指定分片數 & 副本數

PUT /testone
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

5.注意,分片數不是越多越好:

1.分片數不是越多越好,會佔用資源
2.每個分片都會佔用檔案控制代碼數
3.查詢資料時會根據演算法去指定節點獲取資料,分片數越少,查詢成本越低

6.分片數 & 副本數配置建議

1.跟開發溝通
2.看一共要幾個節點
    2個節點,預設就可以了
    3個節點,重要的資料,2副本5分片,不重要的資料,1副本5分片
3.在開始階段, 一個好的方案是根據你的節點數量按照1.5~3倍的原則來建立分片. 
    例如:如果你有3個節點, 則推薦你建立的分片數最多不超過9(3x3)個.
4.儲存資料量多的可以設定分片多一些,儲存資料量少的,可以少分寫分片

5.ElasticSearch 配置優化

1.限制記憶體

1.啟動記憶體最大是32G
2.伺服器一半的記憶體全都給ES
3.設定可以先給小一點,慢慢提高
4.記憶體不足時
	1)讓開發刪除資料
	2)加節點
	3)提高配置
5.關閉swap空間

2.檔案描述符

1.配置檔案描述符
[root@db02 ~]# vim /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
* soft nofile 131072
* hard nofile 131072

2.普通使用者
[root@db02 ~]# vim /etc/security/limits.d/20-nproc.conf 
*          soft    nproc     65535
root       soft    nproc     unlimited

[root@db02 ~]# vim /etc/security/limits.d/90-nproc.conf 
*          soft    nproc     65535
root       soft    nproc     unlimited

3.語句優化

1.條件查詢時,使用term查詢,減少range的查詢
2.建索引的時候,儘量使用命中率高的詞

5.叢集的監控

1.監控內容

1.檢視叢集健康狀態
	GET _cat/health

2.檢視所有節點
	GET _cat/nodes
	
# 兩者有一個產生變化,說明叢集出現故障

2.指令碼監控

[root@db01 ~]# vim es_cluster_status.py
#!/usr/bin/env python
#coding:utf-8
#Author:_DriverZeng_
#Date:2017.02.12

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import subprocess
body = ""
false = "false"
clusterip = "10.0.0.51"
obj = subprocess.Popen(("curl -sXGET http://"+clusterip+":9200/_cluster/health?pretty=true"),shell=True, stdout=subprocess.PIPE)
data =  obj.stdout.read()
data1 = eval(data)
status = data1.get("status")
if status == "green":
    print "\033[1;32m 叢集執行正常 \033[0m"
elif status == "yellow":
    print "\033[1;33m 副本分片丟失 \033[0m"
else:
    print "\033[1;31m 主分片丟失 \033[0m"
    
[root@db01 ~]# python es_cluster_status.py
 叢集執行正常 

3.監控外掛 x-pack