一、ES介绍

1、基础概念介绍

1. 索引:Elasticsearch中的“索引”有点像关系数据库中的数据库。 它是存储/索引数据的地方;

2.分片 shard

“分片”是Lucene的一个索引。 它本身就是一个功能齐全的搜索引擎。

“索引”可以由单个分片组成,但通常由多个分片组成,一部分主分片、一部分副本分片。

3.分段 segment   

每个分片包含多个“分段”,其中分段是倒排索引,分段内的doc数量上限是2的31次方,默认每秒都会生成一个segment文件,通过GET /test/_segments查看

4.倒排索引:是一种将词项映射到文档ID的数据结构

5.translog日志文件:为了防止elasticsearch宕机造成数据丢失保证可靠存储,es会将每次写入数据同时写到translog日志中。

6.refresh操作:相比于Lucene的提交操作,ES的refresh是相对轻量级的操作,先将index-buffer中文档(document)生成的segment写到文件系统之中,默认1s钟刷新一次,所以说ES是近实时的搜索引擎,不是准实时。

7.flush操作:新创建的document数据会先进入到index buffer之后,与此同时会将操作记录在translog之中,当发生refresh时ranslog中的操作记录并不会被清除,而是当数据从filesystem cache中被写入磁盘之后才会将translog中清空

8.Mapping: 是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。不过es的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,

如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。

2、ES写过程拆解

1.写入集群

步骤1:首先客户端根据配置的连接节点,通过轮询方式连接到一个coordinate节点。

步骤2:coodinate节点通过hash算法计算出数据在shard1上shard = hash(document_id) % (num_of_primary_shards),然后根据节点上维护的shard信息,将请求发送到node1上。

步骤3:node1 对索引数据进行校验,然后写入到shard中。

步骤4:主节点数据写入成功后,将数据并行发送到副本集节点Node2,Node3。

步骤5:Node2,Node3写入数据成功后,发送ack信号给shard1主节点Node1。

步骤6:Node1发送ack给coordinate node;

步骤7:coordinate node发送ack给客户端。

2.写入shard

步骤1:新document首先写入index Buffer缓存中,同时写入到数据到translog buffer;

步骤2:每隔1s数据从buffer中refresh到FileSystemCache中,生成segment文件,一旦生成segment文件,就能通过索引查询到了。

步骤3:refresh完,memory buffer就清空了。

步骤4:每隔5s中,translog 从buffer flush到磁盘中。

步骤5:flush完,translog就被清空了。

3、ES搜索数据过程

步骤1:客户端发送请求到一个coordinate node
步骤2:协调节点将搜索请求转发到所有的shard对应的primary shard或replica shard也可以
步骤3:query phase:每个shard将自己的搜索结果(其实就是一些doc id),返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果
步骤4:fetch phase:接着由协调节点,根据doc id去各个节点上拉取实际的document数据,最终返回给客户端

4、集群规模与容量规划

http://doc.oppoer.me/pages/viewpage.action?pageId=165283623

5、集群冷热部署(hot-warm)

"hotwarm_type":"hot" – >"hotwarm_type":"warm"

5、性能优化实践

1.分片大小Elasticsearch官方建议一个分片的大小应该在20到40 GB左右,

如果您计算出索引将存储300 GB的数据,则可以为该索引分配9到15个主分片。

根据集群大小,假设群集中有10个节点,您可以选择为此索引分配10个主分片,以便在集群节点之间均匀分配分片。

2.设置历史索引为只读,并进行段合并操作。

3.禁止swap,一台物理机部署一个ES进程,分配一半的物理内存给JVM,剩余的一半给lucene segment缓存;

4.增加刷新间隔 refresh_interval,适当减少flush操作频率

默认刷新间隔为1秒。这迫使Elasticsearch每秒创建一个分段。实际业务中,应该根据使用情况增加刷新间隔,举例:增加到30秒。

这样之后,30s产生一个大的段,较每秒刷新大大减少未来的段合并压力。最终会提升写入性能并使搜索查询更加稳定

"refresh_interval": "90s",
"number_of_shards": "20",
"translog": {
"flush_threshold_size": "500mb",
"sync_interval": "60s",
"durability": "async"
},

5.较少不必要的字段映射(mapping)

二、ES监控

第一部分:监控指标获取(三个维度)

1、集群监控指标:

1.Cluster Health – Nodes and Shards 

通过GET _cluster/health监视群集时,可以查询集群的状态、节点数和活动分片计数的信息。还可以查看重新定位分片,初始化分片和未分配分片的计数。

1) Status:状态群集的状态。红色:部分主分片未分配。黄色:部分副本分片未分配。绿色:所有分片分配ok。
2) Nodes:节点。包括群集中的节点总数,并包括成功和失败节点的计数。 Count of Active
3) Shards:活动分片计数。集群中活动分片的数量。 Relocating Shards:重定位分片。由于节点丢失而移动的分片计数。
4) Initializing Shards:初始化分片。由于添加索引而初始化的分片计数。 Unassigned
5) Shards。未分配的分片。尚未创建或分配副本的分片计数。

2.Search  – Request Latency and Request Rate

GET /_nodes/stats

请求过程本身分为两个阶段:

第一阶段是查询阶段(query phase),集群将请求分发到索引中的每个分片(主分片或副本分片);

第二阶段是获取阶段(fetch phrase),查询结果被收集,处理并返回给用户。

1) query_current:当前正在进行的查询数。集群当前正在处理的查询计数。
2) fetch_current:当前正在进行的fetch次数。集群中正在进行的fetch计数。
3) query_total:查询总数。集群处理的所有查询的聚合数。
4) query_time_in_millis:查询总耗时。所有查询消耗的总时间(以毫秒为单位)。
5) fetch_total:提取总数。集群处理的所有fetch的聚合数。
6) fetch_time_in_millis:fetch所花费的总时间。所有fetch消耗的总时间(以毫秒为单位)。

3.Indexing  – Refresh Times and Merge Times

监视文档的索引速率( indexing rate )合并时间(merge time)有助于在开始影响集群性能之前提前识别异常和相关问题。将这些指标与每个节点的运行状况并行考虑,这些指标为系统内的潜问题提供重要线索,为性能优化提供重要参考。

2、主机监控指标

GET /_cat/nodes?v&h=id,disk.total,disk.used,disk.avail,disk.used_percent,ram.current,ram.percent,ram.max,cpu

1.Node – Memory Usage

2.Node – Disk I/O

3.Node – CPU

实际业务场景中推荐使用:Elastic-HQ, cerebro监控。

3、JVM监控指标

GET /_nodes/stats

1.jvm heap usage

2.gc

3.threads

第二部分:生产环境的监控

 

1、cerebro(集群状态、索引分片、主机层基础监控)http://cere-bjsm.oppoer.me

2、Kibana   http://kb-bjht.ops.oppoer.me  elastic  qeYM6NAuVNIxfEtedlRb

3、Promethues+Grafna  http://progra-bjsm.ops.oppoer.me/?orgId=1

参考:https://shenshengkun.github.io/posts/550bdf86.html

三、常用工具清单

1、集群监控工具 cerebro   https://github.com/lmenezes/cerebro

2、索引自动管理工具 curator  https://github.com/elastic/curator 

3、管理elasticsearch集群以及通过web界面来进行查询操作ES-HQ     https://github.com/royrusso/elasticsearch-HQ

4、集群间数据迁移工具 Elasticsearch-migration  https://github.com/medcl/elasticsearch-migration   

四、FAQ

1、基于X-Pack实现ES基础安全

https://www.elastic.co/cn/blog/getting-started-with-elasticsearch-security

2、利用别名和rollover机制实现大索引分割

https://www.cnblogs.com/lwhctv/p/12295025.html

ES介绍与实践的更多相关文章

  1. OpenGL ES应用开发实践指南:iOS卷

    <OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...

  2. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  3. RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  4. 关于Axure RP软件的介绍——软件工程实践第二次个人作业

    关于Axure RP软件的介绍——软件工程实践第二次个人作业 Axure RP是一个非常专业的快速原型设计的一个工具,客户提出需求,然后根据需求定义和规格.设计功能和界面的专家能够快速创建应用软件或W ...

  5. 搜索引擎ElasticSearchV5.4.2系列一之ES介绍

    相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x- ...

  6. ElasticSearch学习总结(二):ES介绍与架构说明

    本文主要从概念以及架构层面对Elasticsearch做一个简单的介绍,在介绍ES之前,会先对ES的"发动机"Lucene做一个简单的介绍 1. Lucene介绍 为了更深入地理解 ...

  7. 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  8. SVN 分支及合并的介绍和实践---命令行

    写在前面 一些相关的概念和原理 进行分支开发的最佳实践 合并的分类 在 Eclipse 中进行合并操作 相关资源 写在前面 本文是由演讲整理而来的,介绍了 SVN 分支与合并的概念.流程和一些实际操作 ...

  9. Android OpenGL ES 开发(一): OpenGL ES 介绍

    简介OpenGL ES 谈到OpenGL ES,首先我们应该先去了解一下Android的基本架构,基本架构下图: 在这里我们可以找到Libraries里面有我们目前要接触的库,即OpenGL ES. ...

随机推荐

  1. no.2淘宝架构背后——零售业务中台架构设计探讨及实践读后感

    2017年8月12日,袋鼠云首席架构师正风在“网易博学实践日:大数据与人工智能技术大会”进行<淘宝架构演进背后——零售业务中台架构设计探讨及实践>演讲分享.传统零售行业如何选择应对新经济模 ...

  2. CF 1047 C - Enlarge GCD [素数筛]

    传送门:http://codeforces.com/contest/1047/problem/C 题意:给出n个数字,求最少删除几个数可以使剩下的数字的GCD大于n个数字的GCD 思路:最开始想的是先 ...

  3. Linux Man手册的使用示例

    转载自:https://blog.csdn.net/ac_dao_di/article/details/54718710 Linux的命令非常多,很多人在学一个命令时,首先想到的是使用百度或者谷歌,或 ...

  4. 学习spring第三天

    Spring第三天笔记 今日内容 Spring的核心之一 -  AOP思想 (1) 代理模式- 动态代理 ① JDK的动态代理 (Java官方) ② CGLIB 第三方代理 (2) AOP思想在Spr ...

  5. You are attempting to install the android sdk inside your android studio installation

    原因 我的android studio文件名为AndroidStudio 我的android studio sdk文件名为AndroidStudioSDK 所以系统把AndroidStudioSDK自 ...

  6. 吴裕雄--天生自然python Google深度学习框架:Tensorflow实现迁移学习

    import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platfor ...

  7. [转载]Python方法绑定——Unbound/Bound method object的一些梳理

    本篇主要总结Python中绑定方法对象(Bound method object)和未绑定方法对象(Unboud method object)的区别和联系.主要目的是分清楚这两个极容易混淆的概念,顺便将 ...

  8. Eclipse Jee 2019-12 使用的一些小窍门(积累性更新)

    在安装使用 Eclipse IDE for Enterprise Java Developers  Version: 2019-12 M1 (4.14.0) 之前请确保已在系统环境变量配置好JDK1. ...

  9. Navicat-pymysql-sql注入问题

    一.Navicat 可视化工具的使用 1.Navicat [1]  是一套快速.可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设. 它的设计符合数据库管理员.开发人员及中小企 ...

  10. yum pip

    方式1(yum安装):1.首先安装epel扩展源:[root@localhost ~]#  yum -y install epel-release如果没有安装epel扩展源而直接安装python-pi ...