es集群知识
-
ElasticSearch 集群
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 集群运行正常
Elasticsearch在7.0.0之后免费使用x-pack,也为了系统业务数据安全,所以我们使用x-pack对Elasticsearch进行密码设置。
设置密码前注意事项
-
Elasticsearch需要提前启动一次,否则会出现以下Error:
ERROR: Elasticsearch keystore file is missing [/kaysen/daemon/elasticsearch-7.7.0/config/elasticsearch.keystore]
-
Elasticsearch必须处于启动状态,否则会出现以下Error:
Connection failure to: http://127.0.0.1:9200/_security/_authenticate?pretty failed: Connection refused (Connection refused) ERROR: Failed to connect to elasticsearch at http://127.0.0.1:9200/_security/_authenticate?pretty. Is the URL correct and elasticsearch running?
-
密码生成的两种方式:
- auto:各用户自动生成密码;
- interactive:手动设置密码。
-
以下操作操作都是使用
普通用户
权限进行操作。
配置x-pack步骤
- 进入
elasticsearch
目录,执行以下命令:./bin/elasticsearch-setup-passwords interactive
- 会出现以下错误信息:
Unexpected response code [500] from calling GET http://127.0.0.1:9200/_security/_authenticate?pretty It doesn't look like the X-Pack security feature is enabled on this Elasticsearch node. Please check if you have enabled X-Pack security in your elasticsearch.yml configuration file.
- 我们需要配置文件中开启x-pack验证,修改
config/elasticsearch.yml
配置文件,在尾部添加以下内容,然后重启elasticsearch:xpack.security.enabled: true
./bin/elasticsearch -d
- 重复第1步,为
elastic
、apm_system
、kibana
、logstash_system
、beats_system
、remote_monitoring_user
设置密码,这里我设置了统一密码:123456
,具体操作:./bin/elasticsearch-setup-passwords interactive
future versions of Elasticsearch will require Java 11; your Java version from [/kaysen/tools/java/jre] does not meet this requirement Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user. You will be prompted to enter passwords as the process progresses. Please confirm that you would like to continue [y/N]y Enter password for [elastic]: Reenter password for [elastic]: Enter password for [apm_system]: Reenter password for [apm_system]: Enter password for [kibana]: Reenter password for [kibana]: Enter password for [logstash_system]: Reenter password for [logstash_system]: Enter password for [beats_system]: Reenter password for [beats_system]: Enter password for [remote_monitoring_user]: Reenter password for [remote_monitoring_user]: Changed password for user [apm_system] Changed password for user [kibana] Changed password for user [logstash_system] Changed password for user [beats_system] Changed password for user [remote_monitoring_user] Changed password for user [elastic]
- 先不加用户密码进行访问:
curl 127.0.0.1:9200
:{ "error": { "root_cause": [ { "type": "security_exception", "reason": "missing authentication credentials for REST request [/]", "header": { "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\"" } } ], "type": "security_exception", "reason": "missing authentication credentials for REST request [/]", "header": { "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\"" } }, "status": 401 }
CURL密码访问Elasticsearch
curl -u elastic:123456 127.0.0.1:9200 # 或者 curl -u elastic 127.0.0.1:9200 Enter host password for user 'elastic': 123456
成功打印:
{ "name" : "localhost.localdomain", "cluster_name" : "elasticsearch", "cluster_uuid" : "MZlO8UPyS52AuuCrFwABvQ", "version" : { "number" : "7.7.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf", "build_date" : "2020-05-12T02:01:37.602180Z", "build_snapshot" : false, "lucene_version" : "8.5.1", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
-