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. pytest自学第一期

    开始自学pytest了,我并不想看网上的各种自学教程和文档,要看咱们今天就看pytest的官方文档,不会英语咱们就用翻译,看不懂原理咱们就翻源码,就人肉试错 学习一个技术,使用速成鸡的套路是一个办法, ...

  2. dubbo学习(十一)dubbo知识点总结

    一.基础概念 Dubbo是个啥? 定义:Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式远程调用服务框架,现已成为 Apache 基金会孵化项目. 核心功能:远程服务调用. 为什么要 ...

  3. Salesforce LWC学习(二十七) File Upload

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/lightning-file-upload/documenta ...

  4. 关于Xilinx PCIE DMA的问答

    关于Xilinx PCIE DMA的问答 很久没上博客园了,但由于之前在博客园写了几篇关于PCIE DMA的文章,很多同学给我发消息询问相关知识点,之前有空的时候都是语音一小时跟人细讲,最近由于工作繁 ...

  5. python_多级菜单_纯循环与分支

    源代码: #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog__ = 'http://www.cnblogs.com/2bjiujiu/' d ...

  6. RT Thread的SPI设备驱动框架的使用以及内部机制分析

    注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...

  7. LRC 滚动器 + Vue.js

    LRC 滚动展示VueJS cnblogs @ Orcim  最 近一直在学习尤大大的这个前端框架.Vue 无疑是一款极易上手的前端框架,因为官方的文档就是中文的,十分"本土化", ...

  8. VS2015中无法查找或打开 PDB 文件

    装载:https://blog.csdn.net/aalonso/article/details/90672072 MFCApplication1.exe"(Win32): 已加载" ...

  9. Ubuntu通过Apache安装WebDav

    使用KeePass保存密码,在个人服务器上安装WebDav协议. # 安装Apache2服务器 sudo aptitude install -y apache2 # 开启Apache2中对WebDav ...

  10. pycharm里面同级目录的py文件引用报错

    使用pycharm开发py遇到很烦的事儿,就是在同级目录引用另外一个py文件,pycharm里面总是会红杠,代码还是 照样可以跑,只是看着烦. 查询了一下,通过将当前目录设置为sources_root ...