ES概要
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概要的更多相关文章
- 集群版本升级——rolling upgrade在ES 单节点从 restart 到加入集群,大概要 100s 左右的时间。也就是说,这 100s 内,该节点上的所有分片都是 unassigned 状态
集群版本升级 Elasticsearch 作为一个新兴项目,版本更新非常快.而且每次版本更新都或多或少带有一些重要的性能优化.稳定性提升等特性.可以说,ES 集群的版本升级,是目前 ES 运维必然要做 ...
- CQRS\ES架构介绍
大家好,我叫汤雪华.我平时工作使用Java,业余时间喜欢用C#做点开源项目,如ENode, EQueue.我个人对DDD领域驱动设计.CQRS架构.事件溯源(Event Sourcing,简称ES). ...
- Linux Kernel系列一:开篇和Kernel启动概要
前言 近期几个月将Linux Kernel的大概研究了一下,以下须要进行深入具体的分析.主要将以S3C2440的一块开发板为硬件实体.大概包含例如以下内容: 1 bootloader分析,以uboot ...
- Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
目录 引言 概要 Query and filter context Match All Query 全文查询 Full text queries 小结 参考文档 引言 虽然之前做过 elasticse ...
- ES之四、Elasticsearch集群和索引常用命令
REST API用途 elasticsearch支持多种通讯,其中包括http请求响应服务,因此通过curl命令,可以发送http请求,并得到json返回内容. ES提供了很多全面的API,常用的RE ...
- ES系列(三):网络通信模块解析
ES是一个分布式搜索引擎,其除了用户提供必要的通信服务外,集群间也必须保持紧密的通信联系,才能在必要的时候给出正确的结果.其则必然涉及到各种繁多且要求高的通信场景,那么如何实现高性能的通信,则是其必须 ...
- 多es 集群数据迁移方案
前言 加入新公司的第二个星期的星期二 遇到另一个项目需要技术性支持:验证es多集群的数据备份方案,需要我参与验证,在这个项目中需要关注到两个集群的互通性.es集群是部署在不同的k8s环境中,K8s环境 ...
- 记一次线上环境 ES 主分片为分配故障
故障前提 ElasticSearch 版本:5.2 集群节点数:5 索引主分片数:5 索引分片副本数:1 线上环境ES存储的数据量很大,当天由于存储故障,导致一时间 5个节点的 ES 集群,同时有两个 ...
- Elasticsearch(es)介绍与安装
### RabbitMQ从入门到集群架构: https://zhuanlan.zhihu.com/p/375157411 可靠性高 ### Kafka从入门到精通: https://zhuanlan. ...
随机推荐
- 搭建ssm整合
一.导入依赖 二.新建java和resources目录 1.在java目录新建cn.itcat.domain包,继续添加controller,service,dao,的包 2.在domain里面创建A ...
- 类加载器ClassLoader
上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是 ...
- LDA主题模型困惑度计算
对于LDA模型,最常用的两个评价方法困惑度(Perplexity).相似度(Corre). 其中困惑度可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个主题有多不确定,这个不确定成都就是困惑度 ...
- 实用向—总结一些唯一ID生成方式
在日常的项目开发中,我们经常会遇到需要生成唯一ID的业务场景,不同的业务对唯一ID的生成方式与要求都会不尽相同,一是生成方式多种多样,如UUID.雪花算法.数据库递增等:其次业务要求上也各有不同,有的 ...
- 【记】《.net之美》之读书笔记(一) C#语言基础
前言 工作之中,我们习惯了碰到任务就直接去实现其业务逻辑,但是C#真正的一些基础知识,在我们久而久之不去了解巩固的情况下,就会忽视掉.我深知自己正一步步走向只知用法却不知原理的深渊,所以工作之余,一直 ...
- 基础篇:详解JAVA对象实例化过程
目录 1 对象的实例化过程 2 类的加载过程 3 触发类加载的条件 4 对象的实例化过程 5 类加载器和双亲委派规则,如何打破双亲委派规则 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 对象的 ...
- Spring学习(十一)--Spring MVC
1.MVC模式 (1)视图 通过视图展示应用数据 向应用数据提供更新动作 向控制器提交用户动作 运行控制器选择不同视图 (2)模型提供 封装应用数据状态 响应数据状态查询 提供应用功 ...
- Java 内功修炼 之 数据结构与算法(一)
一.基本认识 1.数据结构与算法的关系? (1)数据结构(data structure): 数据结构指的是 数据与数据 之间的结构关系.比如:数组.队列.哈希.树 等结构. (2)算法: 算法指的是 ...
- Vue学习笔记使用系列一【表单】
脚手架的搭建,请查看另外一篇日记:https://www.cnblogs.com/Fengge518/p/11837078.html 1:直接代码了 1 <!DOCTYPE html> 2 ...
- 031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级 本文知识点:Java中运算符的优先级 运算符的优先级问题 前面学习了很多的运算符,如果这些 ...