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. ...
随机推荐
- pytest自学第一期
开始自学pytest了,我并不想看网上的各种自学教程和文档,要看咱们今天就看pytest的官方文档,不会英语咱们就用翻译,看不懂原理咱们就翻源码,就人肉试错 学习一个技术,使用速成鸡的套路是一个办法, ...
- dubbo学习(十一)dubbo知识点总结
一.基础概念 Dubbo是个啥? 定义:Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式远程调用服务框架,现已成为 Apache 基金会孵化项目. 核心功能:远程服务调用. 为什么要 ...
- Salesforce LWC学习(二十七) File Upload
本篇参考: https://developer.salesforce.com/docs/component-library/bundle/lightning-file-upload/documenta ...
- 关于Xilinx PCIE DMA的问答
关于Xilinx PCIE DMA的问答 很久没上博客园了,但由于之前在博客园写了几篇关于PCIE DMA的文章,很多同学给我发消息询问相关知识点,之前有空的时候都是语音一小时跟人细讲,最近由于工作繁 ...
- python_多级菜单_纯循环与分支
源代码: #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog__ = 'http://www.cnblogs.com/2bjiujiu/' d ...
- RT Thread的SPI设备驱动框架的使用以及内部机制分析
注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...
- LRC 滚动器 + Vue.js
LRC 滚动展示VueJS cnblogs @ Orcim 最 近一直在学习尤大大的这个前端框架.Vue 无疑是一款极易上手的前端框架,因为官方的文档就是中文的,十分"本土化", ...
- VS2015中无法查找或打开 PDB 文件
装载:https://blog.csdn.net/aalonso/article/details/90672072 MFCApplication1.exe"(Win32): 已加载" ...
- Ubuntu通过Apache安装WebDav
使用KeePass保存密码,在个人服务器上安装WebDav协议. # 安装Apache2服务器 sudo aptitude install -y apache2 # 开启Apache2中对WebDav ...
- pycharm里面同级目录的py文件引用报错
使用pycharm开发py遇到很烦的事儿,就是在同级目录引用另外一个py文件,pycharm里面总是会红杠,代码还是 照样可以跑,只是看着烦. 查询了一下,通过将当前目录设置为sources_root ...