1.ElasticSearch 集群相关概念
1.ES集群颜色状态
①. — 红色:数据都不完整
②. — 黄色:数据完整,但是副本有问题
③. — 绿色:数据和副本全都没有问题
2.ES 集群节点类型
①. — 主节点:负责调度分配数据
②. — 数据节点:处理分配到自己的数据
3.ES 集群分片类型
①. — 主分片:存储数据,负责读写数据
②. — 副本分片:主分片的备份
4.ES 集群安全保障
①. — 数据会自动分配到多个节点
②. — 如果主分片所在节点挂掉,副本节点的分片会自动升为主分片
③. — 如果主节点挂了,数据节点会自动提升为主节点
5.集群特点
1.集群中的数据不论在哪一台机器操作,都可以看到
2.使用插件连接任意一台机器,都能看到三个节点
3.数据会自动分配到多个节点
4.如果主分片所在节点挂掉,副本节点的分片会自动升为主分片
5.如果主节点挂了,数据节点会自动提升为主节点
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 " 33[1;32m 集群运行正常 33[0m"
elif status == "yellow":
print " 33[1;33m 副本分片丢失 33[0m"
else:
print " 33[1;31m 主分片丢失 33[0m"
[root@db01 ~]# python es_cluster_status.py
集群运行正常
3.监控插件 x-pack