【原创】《从0开始学Elasticsearch》—集群健康和索引管理
内容目录
1.搭建Kibana
正如《Kibana 用户手册》中所介绍,Kibana 是一款开源的数据分析和可视化平台,因此我们可以借助 Kibana 来与Elasticsearch(简称ES) 交互。
下载并解压:
cd /usr/local
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.6.1-linux-x86_64.tar.gz
tar -zxvf kibana-6.6.1-linux-x86_64.tar.gz -C .
启动Kibana:
cd kibana-6.6.1-linux-x86_64/
bin/kibana
Kibana 所指向ES的地址默认为localhost,该配置在config/kibana.yml,若需要修改,可修改该配置文件。
Kibana 启动成功,我们便可以在 Dev Tools菜单下的Console中写 ES命令了,Kibana 的其他功能我们以后再做介绍。
2.集群健康
在进行索引操作之前,我们有必要先了解一下 ES集群的健康情况,这将有助于我们看懂索引操作的命令执行之后的运行结果。
查看集群的健康情况:GET _cluster/health
结果:
{
"cluster_name" : "elasticsearch",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 1,
"active_shards" : 1,
"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
}
从结果中我们可以看出当前集群的健康情况为 green,active_shards_percent_as_number 为 100.0,两者什么意思呢,有没有必然的联系呢?答案当然是有的。
正常情况下,集群的健康状态分为green、yellow、red三种。
- green:每个Index的primary shard (即shard)和replica shard(即replica)都是active状态,都已经分配好。集群100%可用
- yellow:每个Index的primary shard均为active状态,但至少还有一个replica shard不是active状态。此时数据没有丢失,集群仍然可用
- red:至少一个primary shard不是active状态,它的全部replica shard也已缺失。此时数据已经发生了丢失,搜索时只会返回部分的数据
当集群状态非green时,我们可以使用 GET _cluster/health?level=indices 命令查看各个Index的细节,进而定位具体哪一个索引出现了问题,以便解决问题。
输出中的relocating_shards为0表明当前没有分片正在从一个节点迁移至其他节点。为什么会出现分片迁移这种情况呢?因为ES是一个分布式搜索分析引擎,而分布式往往对应着海量数据,ES实现了shard负载均衡的功能,当添加新节点或者下线已有节点时,ES的集群发现机制会自动将shard进行均匀分配(由ES中的 decider 决定,它们是ES中作出分配决定的最高指挥,当使用多个decider 时,若其中一个decider通过投票不赞成重新分配一个分片,那该分片就不能移动了),以保证各个节点上的shard 数几乎相等,可以均衡的处理各种请求。所以一般情况下relocating_shards的值均为0。
那么什么情况下会出现initializing_shards不为0的情况呢?节点刚刚重启时、刚刚创建分片时等。
unassigned_shards又是一个什么状态呢?就是分片已经在集群状态中,但是在实际集群中你又找不到这个分片。例如:两个节点,一共有2个primary shard,每个primary shard又有两个replica shard,假设节点1中存在primary shard R0、replica shard R1,节点2中存在primary shard R1,replica shard R0,那么此时就会有2个replica shard未分配,因为replica shard既不能和自己的primary shard在同一个节点,又不能够和自己的primary shard的其他replica shard在同一个节点上(even_shard分片分配器决定),此时unassigned_shards就为2。一般未分配的分片都是replica shard。
此外,我们也可以借助ES的cat API查看集群的健康情况,不过cat API的输出结果并不是以json格式返回的,而是以不带表头的表格形式返回的,为了方便理解,我们可以通过添加参数v来将表头也输出出来。GET _cat/health?v
结果:

3.索引操作
- 查询索引:
GET _cat/indices?v
结果:

从结果中我们可以看到索引的健康情况、状态、索引名称、uuid、primary shard个数、replica shard个数、document 个数、被标记为deleted的document 的个数,索引大小、primary shard大小。
- 创建索引:
PUT /indexName
在创建索引时可以指定primary shard的个数,也可以指定一个primary shard配置几个replica shard。若不指定,则默认一个索引 10个shard,其中5个primary shard,5个replica shard,即使是单节点环境也会如此,这种就是典型的over allocation。如果你知道明确的要放入ES 中的数据集,最好在创建索引时指定一下所需的primary shard 个数及其replica shard个数;否则则需要根据节点数来做决定。
举例:创建索引order,并指定其包含3个primary shard,每个primary shard配置2个replica shard:
PUT /orders
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
一旦索引创建成功,则primary shard的个数就不能再修改了,replica shard的个数随时可以修改。因为ES是根据下面的路由算法来计算得出该document 应该存放在哪个shard 中的,为了保证在搜索document 时得出与存放时相同的路由值,故一旦索引创建成功,则primary shard的个数不能再修改。shard = hash(routing) % number_of_primary_shards
当对document 进行增删改查操作时,默认会带一个routing 值,这个值默认为document 的_id,当然也可以通过routing参数指定routing的值。
每个document 仅会存在于一个primary shard 及其 replica shard中,不同primary shard 上保存的document 都是不同的。
当数据量特别大,需要扩容时,我们一般采用水平扩容的方式,即采购更多相同配置的服务器,而非采用垂直扩容的方式,即增加容量更大、配置更高的服务器。之所以采用水平扩容,一是成本问题,二是使用更多的服务器,可以将shard分散到更多的node上,提高了系统的容错性,每个node上拥有更少的shard,那么cpu等资源也可以分配更多到shard上,三是易于以后再次扩容。
- 删除索引:
DELETE /indexName
如果这篇文章对你有帮助或启发,欢迎关注和转发,你的关注和转发是对我最大的支持。
如果你有什么疑问想要免费vip服务,欢迎扫描下方二维码,关注即可获得1v1免费vip服务。

【原创】《从0开始学Elasticsearch》—集群健康和索引管理的更多相关文章
- 干货 | Elasticsearch 集群健康值红色终极解决方案【转】
题记 Elasticsearch当清理缓存( echo 3 > /proc/sys/vm/drop_caches )的时候,出现 如下集群健康值:red,红色预警状态,同时部分分片都成为灰色. ...
- ElasticSearch 集群健康
1.介绍 一个 Elasticsearch 集群至少包括一个节点和一个索引.或者它 可能有一百个数据节点.三个单独的主节点,以及一小打客户端节点——这些共同操作一千个索引(以及上万个分片). 不管集群 ...
- Elasticsearch 集群 - 健康检查
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...
- elasticsearch集群健康状态查看
1. 查看ES集群健康状态 http://localhost:9200/_cluster/health?pretty 响应: { "cluster_name" : "if ...
- Elasticsearch 集群健康值红色终极解决方案
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247483905&idx=1&sn=acaff63 ...
- Elasticsearch集群 管理
第7章 深入Elasticsearch集群 启动一个Elasticsearch节点时,该节点会开始寻找具有相同集群名字并且可见的主节点.如 果找到主节点,该节点加入一个已经组成了的集群:如果没有找到, ...
- Elasticsearch 集群和索引健康状态及常见错误说明
之前在IDC机房线上环境部署了一套ELK日志集中分析系统, 这里简单总结下ELK中Elasticsearch健康状态相关问题, Elasticsearch的索引状态和集群状态传达着不同的意思. 一. ...
- ElasticSearch集群介绍二
ElasticSearch集群 一个运行中的 Elasticsearch 实例称为一个 节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力. ...
- ElasticSearch(七):ElasticSearch集群的搭建
由于资源有限,使用是一台机器上安装三个elasticSearch服务端组成的集群. 1. 安装elasticSearch6.3.2 将原本安装的elasticSearch6.3.2复制两份,分别重新命 ...
随机推荐
- Html.EditorFor 加 htmlAttributes
@Html.EditorFor(m => m.Name, new { htmlAttributes = new { @required = "true", @anotherA ...
- Meteor教程
Meteor 是一个构建在 Node.js 之上的平台,用来开发实时网页程序.Meteor 程序位于数据库和用户界面之间,保持二者之间的数据同步更新. 因为 Meteor 是基于 Node.js 开发 ...
- matlab 画图技巧
基本画图工具:matlab 画图中线型及颜色设置 matlab中坐标轴设置技巧 **Matlab中的坐标轴设置技巧** axisoff; %去掉坐标轴 axistight; ...
- jquery在ajax新加入的元素后绑定事件click
使用YII在做一个点击小图.能够在弹出窗体中显示大图的功能的时候,发现.GridView首页面的列表项按点击时一切正常,但按下了下一页后. 再点击小图,就不起作用了.原来,这是GridView使用了a ...
- C++卷积神经网络实例:tiny_cnn代码具体解释(6)——average_pooling_layer层结构类分析
在之前的博文中我们着重分析了convolutional_layer类的代码结构.在这篇博文中分析相应的下採样层average_pooling_layer类: 一.下採样层的作用 下採样层的作用理论上来 ...
- java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException 遇到这样的问题 ...
- iOS + Nodejs SSL/Https双向认证
移动互联网的大力发展,安全越来越重要. 什么是双向认证呢?双向认证就是client要验证server的合法性,同一时候server也要验证client的合法性. 这样两方都相互验证,提高安全性. 关于 ...
- 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制
第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...
- Ubuntu14.04 64bit下Caffe + CUDA 6.5安装详细步骤
不多说,直接上干货! 笔者花了很长时间才装完,主要是cuda安装和opencv安装比较费劲,cuda找不到32位的安装包只好重装64位的ubuntu系统,opencv 也是尝试了很久才解决,这里建议用 ...
- js常用的正则表达操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...