Elasticsearch之分布式介绍
分布式特性
- es支持集群模式,是一个分布式系统,其好处主要有两个:
- 增大系统容量,如内存、磁盘、使得es集群可以支持PB级的数据
- 提高系统可用性,即使部分节点停止服务,整个集群依然可以正常服务 - es 集群由多个es实例组成
- 不同集群通过集群名字来区分,可通过cluster.name 进行修改,默认elasticsearch
- 每个es实例本质上是一个JVM进程,且有自己的名字,通过node.name进行修改
- 运行如下命令可以启动一个es节点实例
- bin/elasticsearch -E cluster.name=my_cluster -E node.name=node1 -E http.port=5200 -d(以后台守护进程运行)
Master Node
- 可以修改 cluster state 的节点称为 master 节点, 一个集群只能有一个
- cluster state 存储在每个节点上,master 维护最新版本并同步给其他节点
- master 节点通过集群中所有节点选举产生的,可以被选举的节点称为 master-eligible 节点,相关配置如下
- node.master:true (默认 true)
Coordinating Node
- 处理请求的节点即为 coordinating 节点,该节点为所有节点的默认角色,不能取消
路由请求到正确的节点处理,比如创建索引的请求到master节点
Data Node
- 存储数据的节点即为data节点,默认节点都是data类型,相关配置如下
node.data: true
副本与分片
提高系统可用性
- 服务可用性
- 2个节点的情况下,允许其中1个节点停止服务 - 数据可用性
- 引入副本(Replication)解决
- 每个节点上都有完备的数据
增大系统容量
- 如何将数据分布于所有节点上?
- 引入分片(Shard)解决问题 - 分片是 es支持PB级数据的基石
- 分片存储了部分数据,可以分布于任意节点上
- 分片数在索引创建时指定且不允许在更改,默认为5个
- 分片有分片和副分片之分,以实现数据的高可用(副分片数可以随时调整)
- 副本分片的数据由主分片同步,可以有多个,从而提高读取的吞吐量
分片
- 下图演示的是三个节点的集群中 test_index 的分片分布情况创建时我们指定了3个分片和一个副本,api如下图所示:(实际节点数较少,比如两个,一个节点将会有两个分片)
- 此时增加节点是否会提高 test_index 的数据容量
- 不能,因为只要3个分片,已经分布在3台节点上,新增的节点无法利用。
- 此时增加副本数是否提高 test_index 的读取吞吐量?
- 不能。因为新增的副本就是分布在这3个节点上,还是利用了同样的资源,如果需要增加吞吐量,还需要新增节点。
- 分片数的设定很重要,需要提前规划好
- 过小会导致后续无法添加节点实现水平扩容
- 过大会导致一个节点上分布过多分片,造成资源浪费,同时会影响查询性能
Cluster Health
- 通过如下 api 可以查看集群健康状态,包括以下三种:
- green 健康状态,指所有主副分片都正常分配
- yellow 指所有主分片都正常分配,但是有副本分片未正常分配
- red 有主分片为分配
故障转移
node1 所在机器宕机导致服务终止,此时集群会如何处理?
- nodel2 和node3发现nodel1无法响应一段时间后会发起 master选举,比如这里选择 node2为master,此时由于主分片P0下线,集群状态变为Red。
- nodel2 和node3发现nodel1无法响应一段时间后会发起 master选举,比如这里选择 node2为master,此时由于主分片P0下线,集群状态变为Red。
- node2 发现主分片P0未分配,将R0提升为主分片。此时有所有主分片都正常分配,集群状态变成Yellow。
- node2 发现主分片P0未分配,将R0提升为主分片。此时有所有主分片都正常分配,集群状态变成Yellow。
- nodel2为P0和P1生成新的副本,集群状态变成绿色
- nodel2为P0和P1生成新的副本,集群状态变成绿色
文档分布式存储
文档最终会存储在分片上,如下图所示:
- Document 1最终存储在分片P1上
Document1 是如何存储到分片P1的?选择P1的依据是什么?
需要文档到分片的映射算法
- 目的
使得文档均匀分布在所有分片上,以充分利用资源
- 算法
- 随机选择或者 round-robin 算法
- 不可取,因为需要文档到分片的映射关系,成本巨大
- 根据文档值试试极端对应的分片 - es 通过如下的公式计算文档对应的分片
- shard = hash(rounting) % number_of_primary_shards
- hash 算法保证可以将数据均匀的分散在分片中
- routing是一个关键参数,默认是文档id,也可以自行指定(比如统一板块的数据放在一个分片上,以提高查询效率)
- number_of_primary_shards 是主分片数 - 该算法与珠分配数相关,这也是分片数一旦确定后便不能改的原因
文档创建的流程
- Client 向node3 发起创建文档的请求
- node3通过 routing计算该文档应该在 Shard1 上,查询cluster state后确认主分片P1在node2 上,然后转发创建文档的请求到node2
- P1 接受并执行创建文档请求后,将同样的请求发送到副本分片R1
- R1接受并执行创建文档请求后,通知P1成功的结果
- P1接受副本分片结果后,通知node3创建成功
- P1接受副本分片结果后,通知node3创建成功
文档读取的流程
文档批量创建的流程
文档批量读取流程
脑裂问题
- 脑裂问题,英文为split-brain,是分布式系统中的经典网络问题,如下图所示:
- 3 个节点组成的集群,突然node1的网络和其他两个节点中断
- node2 与node3会重新选举master,比如node2成为新master,此时会更新cluster state
- node1 自己组成集群后,也会更新cluster state - 同一个集群有两个 master,而且维护不同 cluster status ,网络恢复后无法选择正确的 master
解决方案为尽在选举master-eligible 节点数大于等于quorum时才可以进行 master选举
- quorum = master-eligible 节点数/2 + 1,列如3个 master-eligible节点时,quorum为2。
- 设定 discovery.zen.minimum_master_nodes 为quorum即可避免脑裂问题
倒排索引的不可变更
倒排索引一旦生成,不能更改
其好处如下:
- 不用考虑并发写文件的问题,杜绝了锁机制带来的性能问题
- 由于文件不再更改,可以充分利用文件系统缓存,只需载入一次,只要内存足够对该文件的读取都会从内存读取,性能高
- 利于生成缓存数据
- 利于对文件进行压缩存储,节省磁盘和内存存储空间坏处为需要写入新文档时,必须重新构建倒排索引文件然后替换老文件后,新文档才能被索引到,导致文档实时性差
解决方案是新文档直接生成新的倒排索引文件,查询的时候同时查询所有的倒排文件,然后做结果的汇总计算即可
Lucene 便是采用了这种方案,他构建的单个倒排索引称为 segment,合在一起称为Index,与ES中的Index感念不同。ES中的一个Shard对应一个 Lucene Index.
Lucene 会有一个专门的文件来记录所有的segment 信息,称为 commit point
文档搜索实时性 - refresh
- segment 写入磁盘的过程依然很耗时,可以借助文件系统缓存的特性,先将 segment在缓存中创建并开发查询来进一步提升实时性改过程在es中称为 refresh
- 在refresh之前文档会先存储在一个buffer中, refresh时将 buffer 中的所有文档清空并生成 segment
- es 默认每1s执行UI次 refresh,因此文档的实时性被提高到1s,这也是es被称为近实时(Near Real Time)的原因
文档搜索实时性 - translog
- 如果在内存中的segment还没有写入磁盘前发生了宕机,那么其中的文档就无法恢复了,如何解决问题?
- es引入了 translog机制,写入文档到buffer时, 同时将该操作写入 translog。
- translog 文件会即时写入磁盘(fsync),6.x默认每个请求都会漏盘,可以修改为每5秒写入一次,这样风险便是丢失5秒内的数据,相关配置为 index.translog.*
- es 启动时会检查 translog文件,并从中恢复数据
文档搜索实时性 - flush
flush 负责将内存中的 segment写入磁盘,主要做如下的工作:
- 将 translog 写入磁盘
- 将 index buffer清空,其中的文档生成一个新的segment,相当于一个refresh操作
- 更新 commit point 并写入磁盘
- 执行 fsync 操作,将内存中的 segment 写入磁盘
- 删除旧的translog
refresh 发送的时机主要有如下几种情况:
- 间隔时间达到时,通过 index.settings.refresh_interval 来设定,默认是1秒
- index.buffer 占满时,其大小通过 indices.menory.index_buffer_size设置,默认为 jvm heap的10%,所有shard共享
- flus发生时也会发生refreshflush 发生的时机主要有如下几种情况:
- 间隔时间达到时,默认是30分钟,5.x之前可以通过index.translog,flush_threshold_period 修改,之后无法修改
- translog 暂满时,其大小 index.translog.flush_threshold_size 控制,默认是512 mb,每个 index有自己的translog
删除与更新文档
- segment一旦生成就不能更改, 那么如果你要删除温暖当该如何操作?
- Lucene 专门维护一个 .del的文件,记录所有已经删除的文档, 注意.del 上记录的是文档在 Lucene 内容的 id
- 在查询结果返回前会过滤掉 .del 中的所有文档 - 更新文档如何进行呢
- 首先删除文档,然后在创建新文档
整体视角
- ES Index 与 Lucene Index 的术语对照入校所示:
Segment Merging
- 随着 segment 的增多,由于一次查询的 segment数增多,查询速度会慢
- es会定时在后台进行segment merge的操作,减少 segment数量
- 通过 force_merge api 可以手动强制做 segment merge 的操作
Elasticsearch之分布式介绍相关推荐
- 结合CAP理论分析ElasticSearch的分布式实现方式
简介 首先引出本人对ElasticSearch分布式的特点:再者针对分布式系统CAP理论,来论证分析ElasticSearch如何实现分布式?另外分析ElasticSearch在CAP理论的实现中是如 ...
- 2021年大数据ELK(十五):Elasticsearch SQL简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...
- Memcache的分布式介绍
Memcache的分布式介绍 memcached虽然称为"分布式"缓存服务器,但服务器端并没有"分布式"功能.服务器端仅包括内存存储功能,其实现非常简单.至于m ...
- elasticsearch集群介绍及数据存储过程原理
elasticsearch集群介绍原理 Elasticsearch集群架构介绍 集群架构介绍 节点介绍 Elasticsearch集群搭建 Elasticsearch分片介绍 主分片 复制分片 Ela ...
- Elasticsearch-基础介绍及索引原理分析
介绍 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 L ...
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍(转)
[-] 一普通同步方式 二事务方式Transactions 三管道Pipelining 四管道中调用事务 五分布式直连同步调用 六分布式直连异步调用 七分布式连接池同步调用 八分布式连接池异步调用 九 ...
- elasticsearch(es)分布式全文检索引擎 简介
0. 带着问题上路-ES是如何产生的? (1)思考:大规模数据如何检索? 如:当系统数据量上了10亿.100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题: 1)用什么数据库好?(MyS ...
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍--转载
原文地址:http://www.blogways.net/blog/2013/06/02/jedis-demo.html redis是一个著名的key-value存储系统,而作为其官方推荐的java版 ...
- ElasticSearch logo 分布式搜索引擎 ElasticSearch
原文来自:http://www.oschina.net/p/elasticsearch Elastic Search 是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中 ...
最新文章
- pytorch读取文本训练
- 使一个div垂直+水平居中的几种方法
- JavaScript基础13-day15【DOM增删改、DOM添加删除记录、操作内联样式、获取元素的样式、DOM Element 对象、滚动条练习、事件对象、div跟随鼠标移动、事件冒泡】
- Java中JDBC进阶教程之数据库的隔离级别!
- 湖南工程学院计算机毕业设计,湖南工程学院毕业设计模板.docx
- Markdown 五分钟速成
- java 静态缓存示例_Java 9 JShell示例:集合静态工厂方法
- 【报告分享】后疫情时代第一个消费狂欢:品牌如何转型与突围.pdf(附下载链接)...
- android获取根视图
- UG NX 12 重复命令
- AD18绘制AHT20原理图及PCB电路设计
- CentOS安装SVN
- 过滤器和拦截器区别以及执行顺序
- HTML学生个人网站作业设计:旅游景点网站设计——北京故宫(9页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
- 2019033期3d计算机开机号,3D历史120期开奖
- 【PM学习笔记】酸梅干超人 - 零基础学Figma学习笔记
- 怎么隐藏CAD文件里的图层?
- i了i了,这简直就是2020全网最全最强的MyBatis面试题!
- ERP系统常用SQL集锦(转, 一个网友写的,感觉有点虎头蛇尾,不过还是有价值参考)...
- 人体姿态估计-评价指标(一)
热门文章
- R语言ggplot2可视化:ggplot2使用geom_mark_ellipse函数进行椭圆形圈定(注释)特定的数据簇或组
- R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_ellipse函数在数据簇或数据分组的数据点周围添加椭圆(ellipse)进行注释(对椭圆包围的区域进行着色为阴影区域)
- R绘制边缘直方图、箱图(Marginal Histogram / Boxplot)
- 奥卡姆剃刀是什么?机器学习实践中那些学习模型或者那些评估指标践行了这一理论?
- IDEA(IntelliJ IDEA)+常用快捷键(short cuts)
- Object Detection+目标检测概述及其常见模型总结
- linux动态库注册函数,Linux动态库函数的详解
- java scanner和for_java中Scanner和random的用法
- 在layui中使用ajax传值给后台,浅谈layui 数据表格前后台传值的问题
- gatb_core_components