大数据 ELK(十一):Elasticsearch 架构原理
Elasticsearch 架构原理
一、Elasticsearch 的节点类型
在 Elasticsearch 有两类节点,一类是 Master,一类是 DataNode。
1、Master 节点
在 Elasticsearch 启动时,会选举出来一个 Master 节点。当某个节点启动后,然后使用 Zen Discovery 机制找到集群中的其他节点,并建立连接。
discovery.seed_hosts: "node1", "node2", "node3"
并从候选主节点中选举出一个主节点。
cluster.initial_master_nodes: "node1", "node2"
Master 节点主要负责:
管理索引(创建索引、删除索引)、分配分片
维护元数据
管理集群节点状态
不负责数据写入和查询,比较轻量级
一个 Elasticsearch 集群中,只有一个 Master 节点。在生产环境中,内存可以相对小一点,但机器要稳定。
2、DataNode 节点
在 Elasticsearch 集群中,会有 N 个 DataNode 节点。DataNode 节点主要负责:
数据写入、数据检索,大部分 Elasticsearch 的压力都在 DataNode 节点上
在生产环境中,内存最好配置大一些
二、分片和副本机制
1、分片(Shard)
Elasticsearch 是一个分布式的搜索引擎,索引的数据也是分成若干部分,分布在不同的服务器节点中
分布在不同服务器节点中的索引数据,就是分片(Shard)。Elasticsearch 会自动管理分片,如果发现分片分布不均衡,就会自动迁移
一个索引(index)由多个 shard(分片)组成,而分片是分布在不同的服务器上的
2、副本
为了对 Elasticsearch 的分片进行容错,假设某个节点不可用,会导致整个索引库都将不可用。所以,需要对分片进行副本容错。每一个分片都会有对应的副本。在 Elasticsearch 中,默认创建的索引为 1 个分片、每个分片有 1 个主分片和 1 个副本分片。
每个分片都会有一个 Primary Shard(主分片),也会有若干个 Replica Shard(副本分片)
Primary Shard 和 Replica Shard 不在同一个节点上
3、指定分片、副本数量
三、Elasticsearch 重要工作流程
1、Elasticsearch 文档写入原理
1、选择任意一个 DataNode 发送请求,例如:node2。此时,node2 就成为一个 coordinating node(协调节点)
2、计算得到文档要写入的分片
shard = hash(routing) % number\_of\_primary\_shards
routing 是一个可变值,默认是文档的 _id
3、coordinating node 会进行路由,将请求转发给对应的 primary shard 所在的 DataNode(假设 primary shard 在 node1、replica shard 在 node2)
4、node1 节点上的 Primary Shard 处理请求,写入数据到索引库中,并将数据同步到 Replica shard
5、Primary Shard 和 Replica Shard 都保存好了文档,返回 client
2、Elasticsearch 检索原理
client 发起查询请求,某个 DataNode 接收到请求,该 DataNode 就会成为协调节点(Coordinating Node)
协调节点(Coordinating Node)将查询请求广播到每一个数据节点,这些数据节点的分片会处理该查询请求。协调节点会轮询所有的分片来自动进行负载均衡
每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档 ID、节点信息、分片信息返回给协调节点
协调节点将所有的结果进行汇总,并进行全局排序
协调节点向包含这些文档 ID 的分片发送 get 请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据返回给客户端
四、Elasticsearch 准实时索引实现
1、溢写到文件系统缓存
当数据写入到 ES 分片时,会首先写入到内存中,然后通过内存的 buffer 生成一个 segment,并刷到文件系统缓存中,数据可以被检索(注意不是直接刷到磁盘)
ES 中默认 1 秒,refresh 一次
2、写 translog 保障容错
在写入到内存中的同时,也会记录 translog 日志,在 refresh 期间出现异常,会根据 translog 来进行数据恢复
等到文件系统缓存中的 segment 数据都刷到磁盘中,清空 translog 文件
3、flush 到磁盘
ES 默认每隔 30 分钟会将文件系统缓存的数据刷入到磁盘
4.、segment 合并
Segment 太多时,ES 定期会将多个 segment 合并成为大的 segment,减少索引查询时 IO 开销,此阶段 ES 会真正的物理删除(之前执行过的 delete 的数据)
版权声明: 本文为 InfoQ 作者【Lansonli】的原创文章。
原文链接:【http://xie.infoq.cn/article/98ed9e37a5b06a4daabc39fc5】。文章转载请联系作者。
评论