写点什么

大数据 ELK(十一):Elasticsearch 架构原理

作者:Lansonli
  • 2022 年 10 月 03 日
    广东
  • 本文字数:1955 字

    阅读完需:约 6 分钟

大数据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、指定分片、副本数量

// 创建指定分片数量、副本数量的索引PUT /job_idx_shard{    "mappings": {        "properties": {            "id": { "type": "long", "store": true },            "area": { "type": "keyword", "store": true },            "exp": { "type": "keyword", "store": true },            "edu": { "type": "keyword", "store": true },            "salary": { "type": "keyword", "store": true },            "job_type": { "type": "keyword", "store": true },            "cmp": { "type": "keyword", "store": true },            "pv": { "type": "keyword", "store": true },            "title": { "type": "text", "store": true },            "jd": { "type": "text"}
} }, "settings": { "number_of_shards": 3, "number_of_replicas": 2 }}
复制代码


// 查看分片、主分片、副本分片GET /_cat/indices?v
复制代码

三、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 的数据)


发布于: 刚刚阅读数: 5
用户头像

Lansonli

关注

微信公众号:三帮大数据 2022.07.12 加入

CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师

评论

发布
暂无评论
大数据ELK(十一):Elasticsearch架构原理_elasticsearch_Lansonli_InfoQ写作社区