ES分布式搜索,依赖了Lucene来提供搜索引擎功能,每个数据节点都是一个Lucene实例,通过将索引进行分片,写入和查询时候操作或查询对应分片,来达到水平扩展的能力

节点

Master node:负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点,分片分配等。 主节点并不需要涉及到文档级别的变更和搜索等操作。可以通过属性node.master进行设置。

Data node: 数据节点 增删改查、搜索、聚合

ES的master选举用的类bulk算法,没有用zk

shard

分片,位于Data Node节点,每个索引会有1到多个分片来水平拆分,将写入请求均分到不同的节点,提升TPS,查询时,也可以利用副本来提升查询效率

由于分片可能包含较多的数据,将全量的分片数据写入一个文件可能会使该文件较大,访问时耗时变长。同时为了利用缓存的使用,将分片切分为多个segment文件保存

当一个搜索请求达到分片时,会遍历所有的segment来搜索数据,segment过多会导致扫描效率降低,因此ES会将segment进行合并,减少segment数量

segment 分段

最小搜索单元,查询时,如果分片有多个segment,会遍历每一个segment来搜索数据

refresh

轻量级的写入和打开一个cache中的segment的操作叫做refresh,默认情况下,ES集群中的每个shard会每隔1秒自动refresh一次,将1秒内写入内存的新文档写入到文件系统缓存,并构成一个分段segment,这就是我们为什么说ES是近实时的搜索引擎而不是实时的,也就是说给索引插入一条数据后,我们需要等待1秒才能被搜到这条数据,这是es对写入和查询一个平衡的设置方式,这样设置既提升了es的索引写入效率同时也使得ES能够近实时检索数据

refresh并不会将segment落盘,也就是没有fsync操作,但translog 默认情况下落盘,用translog来保证数据不会直接丢失

为了保证数据不丢失,同时效率也较高,transLog 默认 index.translog.durability = request, 保证每次translog执行fsync,保证数据不丢失。这样,当节点挂断后,可以使用translog进行恢复

更新(Update)和删除(Delete)文档

ES文档不能更新,索引一定创建就不能修改,因此ES的update和delete操作,实际上步骤为:记录old doc被删除了,创建新doc

如何保证一致性

client -> 协调 node(版本5前) -> shard寻找主分片 -> real data node -> insert 并行将请求发送给副本分片 -> 响应成功

写入时,先将文档写入内存中,并写入translog中,此时文档还不能被索引

写一致

当集群中active shard 为集群大多数shard时,才能写入

put /index/type/id?consistency=quorum

consistency的值列表:

  • one:要求我们这个写操作,只要有一个primary shard是active活跃可用的,就可以执行
  • all:要求我们这个写操作,必须所有的primary shard和replica shard都是活跃的,才可以执行这个写操作
  • quorum:默认的值,要求所有的shard中,必须是大部分的shard都是活跃的,可用的,才可以执行这个写操作

one或all都太绝对化了,容错性/可用性太差,默认值为quorum,但仅当number_of_replicas时才生效

quorum 不齐全时,会wait直到timeout

replication=async | sync 异步同步

读一致性

默认情况下主备分片的数据是sync机制 当在主分片和副本分片的写操作都完成后,写操作才返回,这种情况下,任何分片的数据都是最新的

追求高索引吞吐率,即新增文档耗时尽量小时,可以考虑replication=async(异步)+ _preference = primary 的方案,这样搜索时直接查询主分片,当然,系统稳定性也降低了,异步机制也将产生数据一致性风险,一旦primary挂掉,则replica可能会丢失部分数据

通常情况可以让primary shard负责写,replica shard负责读,来实现读写分离

primary shard不能和自己的replica shard 放在一个节点中,因为这样无法容灾,如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片的角色。

查询的第一步是广播请求到索引分片。

查询请求到达协调节点后,第一步是广播请求到所有分片,广播给主分片或副本分片,同时保证同一个分片,要么广播给主分片,要么给副本分片之一,不会重复通知,协调节点将在之后的请求中轮询所有的分片或拷贝来分摊负载。

每个分片将会在本地构建一个优先级队列。如果客户端要求返回结果排序中从第from名开始的数量为size的结果集,则每个节点都需要生成一个from+size大小的结果集,因此优先级队列的大小也是from+size。分片仅会返回一个轻量级的结果给协调节点,包含结果集中的每一个文档的ID和进行排序所需要的信息。

横向扩展

  • 加机器,将导致集群分区重分配,如原本只有两台机器单机3分片,共6个分片,现在加了1台机器,集群将会重新平衡,每台机器上各2个分片
  • 数据的冗余越多,我们能处理的搜索吞吐量就越大
  • 在同样数量的节点上增加更多的复制分片并不能提高性能,因为这样做的话平均每个分片的所占有的硬件资源就减少了

重建索引

如果你想修改分析器或修改已有字段,可以通过重建索引来完成。通过scan-scroll api,读取_source,放入新的索引中即可,同时可以使用条件过滤来并行执行

GET /old_index/_search?search_type=scan&scroll=1m
{
"query": {
"range": {
"date": {
"gte": "2014-01-01",
"lt": "2014-02-01"
}
}
},
"size": 1000
}

假如你继续在旧索引上做修改,你可能想确保新增的文档被加到了新的索引中。这可以通过重新运行重建索引程序来完成,但是记得只要过滤出上次执行后新增的文档就行了。

参考文档:

https://es.xiaoleilu.com/020_Distributed_Cluster/20_Add_failover.html

https://www.jianshu.com/p/61dd9fb7d785

https://blog.csdn.net/zkyfcx/article/details/79998197

ES概要的更多相关文章

  1. 集群版本升级——rolling upgrade在ES 单节点从 restart 到加入集群,大概要 100s 左右的时间。也就是说,这 100s 内,该节点上的所有分片都是 unassigned 状态

    集群版本升级 Elasticsearch 作为一个新兴项目,版本更新非常快.而且每次版本更新都或多或少带有一些重要的性能优化.稳定性提升等特性.可以说,ES 集群的版本升级,是目前 ES 运维必然要做 ...

  2. CQRS\ES架构介绍

    大家好,我叫汤雪华.我平时工作使用Java,业余时间喜欢用C#做点开源项目,如ENode, EQueue.我个人对DDD领域驱动设计.CQRS架构.事件溯源(Event Sourcing,简称ES). ...

  3. Linux Kernel系列一:开篇和Kernel启动概要

    前言 近期几个月将Linux Kernel的大概研究了一下,以下须要进行深入具体的分析.主要将以S3C2440的一块开发板为硬件实体.大概包含例如以下内容: 1 bootloader分析,以uboot ...

  4. Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述

    目录 引言 概要 Query and filter context Match All Query 全文查询 Full text queries 小结 参考文档 引言 虽然之前做过 elasticse ...

  5. ES之四、Elasticsearch集群和索引常用命令

    REST API用途 elasticsearch支持多种通讯,其中包括http请求响应服务,因此通过curl命令,可以发送http请求,并得到json返回内容. ES提供了很多全面的API,常用的RE ...

  6. ES系列(三):网络通信模块解析

    ES是一个分布式搜索引擎,其除了用户提供必要的通信服务外,集群间也必须保持紧密的通信联系,才能在必要的时候给出正确的结果.其则必然涉及到各种繁多且要求高的通信场景,那么如何实现高性能的通信,则是其必须 ...

  7. 多es 集群数据迁移方案

    前言 加入新公司的第二个星期的星期二 遇到另一个项目需要技术性支持:验证es多集群的数据备份方案,需要我参与验证,在这个项目中需要关注到两个集群的互通性.es集群是部署在不同的k8s环境中,K8s环境 ...

  8. 记一次线上环境 ES 主分片为分配故障

    故障前提 ElasticSearch 版本:5.2 集群节点数:5 索引主分片数:5 索引分片副本数:1 线上环境ES存储的数据量很大,当天由于存储故障,导致一时间 5个节点的 ES 集群,同时有两个 ...

  9. Elasticsearch(es)介绍与安装

    ### RabbitMQ从入门到集群架构: https://zhuanlan.zhihu.com/p/375157411 可靠性高 ### Kafka从入门到精通: https://zhuanlan. ...

随机推荐

  1. OOCSS是什么,该如何用?

    1 OOCSS的定义: Object Oriented css(面向对象css)的缩写,是一种用最简单的方式编写的CSS代码,从而使代码 重用性,可维护性和可扩展性更好的书写方法.   2 OOCSS ...

  2. 解决flutter 运行时:Waiting for another flutter command to release the startup lock...

    执行 Flutter 包管理相关命令时有可能遇到 Waiting for another flutter command to release the startup lock... 这样的错误,可尝 ...

  3. Oracle复习(复习精简版v1.0)

    自己没记不住的,超基础Oracle知识,新手可以看一下. 大多数例子是用scott用户中的emp表完成 排序:order by 列名    desc是降序,默认是升序: update 表名 set 列 ...

  4. 深度预警:深入理解HBase的系统架构

    HBase的构成 物理上来说,HBase是由三种类型的服务器以主从模式构成的.这三种服务器分别是:Region server,HBase HMaster,ZooKeeper. 其中Region ser ...

  5. MyBatis多对一,一对多,多对多,一对多关联查询

    一.Person实体类 1 public class Person { 2 private Integer personId; 3 private String name; 4 private Int ...

  6. 前端gitlab-ci.yml 入门

    说起来使用gitlab也有大半年了,每天都在跑pipeline,但是却没有好好研究过这个叫gitlab-ci.yml的文件.这次借着发布流程升级的机会,好好入门了一下. 主要分以下内容: stages ...

  7. Splay浅谈

    Splay是众多平衡树之一,它的功能十分强大,但常数极大.在LCT和许多数据结构中都能用到. Splay的核心操作,就是rotate.为了使树不是一条链,而是平衡的,我们需要旋转来维护形态.理论很简单 ...

  8. docker容器命令2

    docker容器命令2 启动守护式容器 docker run -d 镜像名字 [root@tzh ~]# docker images REPOSITORY TAG IMAGE ID CREATED S ...

  9. 浅谈Samsung Exynos4412处理器

    转载于:http://www.cnblogs.com/android210/archive/2013/01/16/2862349.html Topic:浅谈Samsung Exynos4412处理器( ...

  10. ASP课程实例1——简易的手机号抽奖

    本程序用到了最基本的vbscript函数. 请大家注意它们的用法并熟悉asp网页的基本结构. inputbox,mid() ,replace(),rnd(),fix(),document.write ...