版本说明:5.6.4(要严格注意ES及其插件、第三方工具的版本匹配关系)
系统负载:(日志集群,日均写入10TB,保留7天)
1,出于高可用的考虑,同一个分区的多个副本不会被分配到同一台机器
如下截图所示,Index:queries,设置20副本,5分片。这个集群当前有14个可用数据节点,queries的0分区在这14个数据节点上均有且仅有一个副本,剩余的7个副本显示UNASSIGNED,并不会在当前14个节点上重复分配
2,Local Gateway参数生效顺序(仅在重启master时生效)
3,避免所有索引被删除
4,避免使用虚拟内存(三选一)
5,集群各类角色
node.master
, node.data
and node.ingest
set to false
will only act as a coordinating node, which cannot be disabled.6,master数量至少3个,避免脑裂
7,操作命令
8,集群健康状态
green
:所有的主分片和副本分片都正常运行。yellow
:所有的主分片都正常运行,但不是所有的副本分片都正常运行。red
:有主分片没能正常运行。9,故障节点分片延时分配
10,名词解释
11,滚动升级(升级期间,集群处于不可用状态)
12,关键指标(参考x-pack)
13,如何设置索引的分片数比较合适
条件:
结论:
索引主分片规模为:
单个分片容量:1200GB/(30*20)=2.165GB
对于一个新建索引,预测总大小10GB,则共设置主分片:10GB/2GB=5个
14,集群的索引副本数如何确定
参考文献:https://www.elastic.co/guide/en/elasticsearch/guide/2.x/replica-shards.html
https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index
15,es 配置多个 data path 时的分配策略
参考资料:https://cyberdak.github.io/es/2018/07/08/es-disk-allocate-strategy
16,ES集群的备份和恢复
官方给出的ES集群的数据备份方式
以下是使用HDFS进行数据备份和恢复,HDFS备份是基于增量备份方式进行备份的,需要安装repository-hdfs插件并重启集群才能生效。
对于使用HDFS来进行备份的方式,这是一种增量备份的方式(同一个存储库下,数据是增量备份的,每次备份,系统仅备份发生变化的segment)
使用的API:
#HDFS配置和创建存储库
curl -XPUT “http://localhost:9200/_snapshot/ my_backup” -d ‘
{
“type”: “hdfs”,
“settings”: {
“path”: “/back/es/”, #存储库路径
“load_defaults”: “true”, #加载Hadoop默认配置
“compress”: “true”,
“uri”: “hdfs://localhost:8020” } #Hadoop IP地址
}
#创建快照
# snapshot_1为快照名称
curl -XPUT “http://localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true ” -d ‘{
“indices”: “index_1,index_2”, //注意不设置这个属性,默认是备份所有索引
“include_global_state”: false
}
#ES数据恢复
#本集群恢复,查找要恢复的快照ID,执行如下命令恢复数据
curl -XPOST http://localhost:9200/_snapshot/my_backup/backup_1/_restore’
17,curator插件–ES索引管理插件
pip install elasticsearch-curator
curator需要两个文件来对集群进行操作:curator.yml(curator的配置文件),action_file.yml(curator执行的动作)
curator.yml格式:
更改hosts和port连接集群的地址和端口,更改logfile为日志路径。
action_file.yml格式:
1:模式是匹配
2.:匹配的索引的名称,支持正则
3,4:指删除7天前的索引
5:多个任务需要按照顺序添加
curator –config curator.yml action_file.yml
以上命名需要加上文件的路径
18,自动任务
通过系统的crontab来执行自动任务
对于自动删除索引这个任务来说,可以新建shell脚本curator.sh
#!/bin/sh
/usr/bin/curator –config /root/.curator/curator_config.yml /root/.curator/action_file.yml
crontab -e
crontab格式
30 3 * * * /data1/curator/curator.sh
crontab -l
19,监控
核心监控项:集群健康状态,功能监控,索引延迟,流量监控
黑:黑盒监控
白:白盒监控
监控项介绍:
pending task 反应了master节点尚未执行的集群级别的更改任务(例如:创建索引,更新映射,分配分片)的列表。pending task的任务是分级别的(优先级排序:IMMEDIATE>URGENT>HIGH>NORMAL>LOW>LANGUID),只有当上一级别的任务执行完毕后才会执行下一级别的任务,这也说明了:当出现HIGH级别以上的pending task任务时,备份和创建索引等一些低级别任务虽然任务对资源占用不多,也将不会执行,返回异常,“ProcessClusterEventTimeoutException”。
20,kibana调优
21,推荐插件
x-pack许可证书分为试用的许可证书和注册后的许可证书。安装证书不用重启节点
当x-pack禁用security functionality可以通过如下步骤来安装证许可证书:
curl -XPUT u elastic 'http://0.0.0.0:9200/_xpack/license?acknowledge=true&pretty' -H "Content-Type;application/json" -d @json
22,数据直接写入ES还是使用ELK?
23,ES引入代理的优势
24,集群出现UNASSIGNED shards
集群分片分配机制
ES集群的分片分配由“allocators”和“deciders”控制,“allocators”负责返回给“deciders”一个满足要求的nodes列表,“deciders”从列表中确定到底分片应分配到哪个nodes。
“allocators”按照各节点的分片数量来获得合适的nodes列表(如果有分配权重则另说)
“deciders”根据一些过滤器来确定最终的分配nodes(分配的设置要求)
对于一个分片的分配,分为新建索引的分片分配,对于已经存在的索引,分为主分片和副本分片的分配
对于新建的索引,“allocators”寻找nodes列表的原则是保持集群的平衡(各个nodes上的分片数尽量保持一致,不是nodes的size)
对于已经存在的索引的主分片:只会允许分配到良好的最新的副本分片上,之后会选择其他副本(数据将有丢失)
参考资料:https://www.elastic.co/blog/red-elasticsearch-cluster-panic-no-longer
原因:
有目的的延迟
分片太多,节点不够
需要重启分片分配
磁盘量达到限制,禁止写入新的索引
处理流程:
查看有哪些索引有UNASSIGEMED shards 注1
若对应的索引没用(数据没有用,索引可以删除)直接删除
查看UNASSIGNED shards的详细未分配原因 注2
针对不同的原因提供不同的解决办法
注1:
curl -XGET “http://hb-dev-es.jdcloud.com:80/_cat/shards?h=index,shard,prirep,state,unassigned.reason” | grep UNASSIGNED
注2:
curl -XGET “http://hb-dev-es.jdcloud.com:80/_cluster/allocation/explain?pretty”
25,ES集群重启预案及影响分析
ES集群重启预案
es每个节点均是有状态,不同索引分片配置设置不同,单个分片可能有冗余,可能有1备份。因此,为不影响服务,升级或者重启es服务需要逐个依次进行(滚动重启)
#注:重启操作应在集群状态为green时进行,重启任一一个节点前后,都要保证在集群状态恢复到green状态时。
#步骤1-禁用分片分配
#如果不禁止,当停止某一节点后,分片分配进程会进行UNASSIGNED分片的分配(当集群状态达到recovery要求,触发恢复阈值时)。这样的情况下,会造成大量的IO操作。但是禁用分片后,功能上会禁止新建索引。
curl -X PUT http://0.0.0.0:9200/_cluster/settings?pretty -d '{"transient": {"cluster.routing.allocation.enable": "none"}}'
#步骤2-验证修改后的配置:
curl -X GET http://0.0.0.0:9200/_cluster/settings?pretty
#步骤3-执行同步刷新
#这一步操作的原因是:当有分片在集群重启过程中并没有发生更新,则跳过对这些分片的同步校验,提高分片恢复的速度
curl -XPOST "http://0.0.0.0:9200/_flush/synced?pretty"
#步骤4-重启client-node节点
#重启client-node组节点有小概率导致写入丢失(由于LB的轮询策略:当一个节点离线后,10s内不会再将请求分配到该节点。可以通过不要立即重启另外的client节点来避免此问题)
##子步骤1--重启一个client-node组的节点
##子步骤2--确认节点加入集群
##通过命令查看集群状态和查看节点数
curl -XGET http://0.0.0.0:9200/_cluster/health?pretty
##子步骤3--按照子步骤1-2重启剩余的client-node节点
#步骤5-重启master节点
##子步骤1--重启一个master-node的非master节点
##子步骤2--确认节点加入集群
##子步骤3--重复子步骤1-2重启剩余的非master节点
##子步骤4--重复子步骤1-2重启剩余的master节点
##子步骤5--检查master是否重新选举成功(30s后会开始选举:原因discovery.zen.ping_timeout:30s)
##master选举过程中会堵塞写操作,对search无影响,堵塞API的操作
#步骤6-重启data-node节点
##子步骤1--重启一个data-node组的data-node节点
##子步骤2--确认节点加入集群
##子步骤3--重复子步骤1-2重启剩余的data节点
#步骤7-启用分片分配
curl -X PUT http://0.0.0.0:9200/_cluster/settings?pretty -d '{"transient": {"cluster.routing.allocation.enable": "all"}}'
最后,常见日志错误