暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Elasticsearch 的节点、集群、分片及副本

唯自律方自由 2021-05-26
1165

1. 分布式系统的可用性与扩展性

  • 高可用性

    • 服务可用性 - 允许有节点停止服务:整个集群中,当有部分节点停止工作时,不影响服务的正常使用。

    • 数据可用性 - 部分节点丢失,不会丢失数据:集群的数据被分配在各个节点中,Elasticsearch 可以确保冗余,这既可以防止硬件故障,又可以在将节点添加到集群中时提高查询能力。

  • 可扩展性

    • 请求量提升、数据不断增长,可将数据分布到所有节点上,这样就能灵活处理数据激增带来的服务瓶颈。


2. 分布式特性

  • ES 的分布式架构的好处:

    • 数据存储的水平扩容。

    • 提高系统的可用性,部分节点停止服务,整个集群的服务不受影响。

    • 同时多个节点的协同运作,提高了集群服务的计算能力和吞吐量。

  • ES 的分布式架构:

    • 不同集群通过不同名字来区分,默认集群名字是:elasticsearch。

    • 可以通过修改配置文件来修改集群名称,或者通过命令中的 -E cluster.name=es_cluster 进行设定。

    • 一个集群可以有一个或者多个节点。

  • ES 集群架构图:

对于用户来说, ES 是一个无中心化的集群,ES 集群内部运行原理是对外面来说是透明的。用户操作一个节点跟操作一个集群是一样的。也就是说,ES 集群没有中心节点,任何一个节点出现故障都不会影响其它节点,这是由 ES 本身特性所决定的,这是它的典型特征。


3. ES 节点

3.1 什么是节点

  • 一个节点就是一个 ES 的实例:

    • 本质上一个节点就是一个 Java 进程。

    • 一台机器上可以运行多个 ES 进程,但是生产环境一般建议一台机器上只运行一个 ES 实例。

  • 每个节点都有自己的名字,可以通过配置文件配置,或者通过启动时的命令中的 -E node.name=node1 进行设定。

  • 每个节点在启动之后,会分配一个 UID,保存在 ES 的 data 目录下。

3.2 节点类型

  • (1)Master-eligible nodes 和 Master Node

    • 每个节点启动后,默认就是一个 Master-eligible 节点。

      • 可以设置 node.master:false 禁止。

    • Master-eligible 节点可以参加选主流程,选主成功即成为 Master 节点。

    • 第一个节点启动的时候(node.master:true),它会将自己选主为 Master 节点。

    • 每个节点上都保存了集群的状态,但只有 Master 节点才能修改集群的状态信息,试想一下,如果任意节点都能修改集群信息,将会导致数据的不一致性。

      • 集群状态(Cluster State),维护了一个集群中必要的信息:

        • 所有节点的信息

        • 所有索引和及其相关的 Mapping 与 Setting 信息

        • 分片的路由信息


  • (2)Data Node 和 Coordinating Node

    • Data Node

      • 保存数据的节点,负责保存分片数据,在数据扩展上起到了至关重要的作用。

    • Coordinating Node

      • 协调节点负责接受 Client 请求,将请求分发到合适的节点,最终把结果汇总到一起返回给 Client。

      • 每个节点默认都起到了 Coordinating Node 的职责。


  • (3)其他节点

    • Hot & Warm Node

      • 不同硬件配置的 Data Node,用来实现 Hot & Warm 架构,降低集群部署成本。

      • Hot 通常机器的 CPU、内存、I/O 等配置资源比较高,Warm 则相反。

      • Hot 节点通常存储使用频率比较高的数据,Warm 节点通常存储使用频率比较低的数据。

    • Machine Learning Node

      • 负责跑机器学习的 Job,用来做异常检测。

    • Ingest Node

      • Ingest 节点可以看作是数据前置处理转换的节点,支持 pipeline 管道设置,可以使用 Ingest 节点对数据进行过滤、转换等操作,类似于 logstash 中 filter 的作用,功能相当强大。

      • 我们把 Ingest 节点的功能抽象为:大数据处理环节的“ETL” - 抽取、转换、加载。

3.3 配置节点类型

  • 开发环境中,一个节点可以承担多种角色

  • 生产环境中,一个节点应该设置单一角色

节点类型

配置参数

默认值

master eligible

node.master

true

data

node.data

true

ingest

node.ingest

true

coordinating only

每个节点默认都是 coordinating 节点,如果设置的话,其他类型全部为 false,所以默认不能设置

machine learning

node.ml

true(需要 enable x-pack)

4. 分片

4.1 主分片和副本分片

  • 主分片(Primary Shard)用以解决水平扩展的问题,通过主分片可以将数据分布到集群内所有节点之上。

    • 一个分片是一个运行的 Lucene 实例

    • 主分片数在索引创建时指定,后续不允许修改,除非 Reindex

  • 副本(Replica Shard)用以解决数据高可用问题,副本分片是主分片的拷贝。

    • 副本分片数是可以动态调整的

    • 增加副本数,可以在一定程度上提高服务的可用性(读取的吞吐)

4.2 分片的设定

  • 集群 movies 有三个节点,movie 索引的分片分布情况(3 个主分片,1 个副本分片)如下图所示:

【思考】增加一个节点或增加主分片数对系统的影响是什么?

  • 对于生产环境中分片的设定,需要提前做好容量规划

    • 分片数设置过小

      • 导致后续无法增加节点,无法实现水平扩展

      • 单个分片的数据量太大,导致数据重新分配耗时

    • 分片数设置过大

      • 影响搜索结果的相关性打分,影响统计结果的准确性

      • 单个节点上过多的分片,会导致资源浪费,同时也会影响性能

      • 从 7.0 版本开始,默认主分片设置成 1(之前版本默认是 5),解决了 over-sharding 的问题

5. 查看集群的健康状况

  • status 参数表示的就是集群的健康状况:

    • green:主分片和副本都正常分配

    • yellow:主分片全部分配正常,有副本分片未能正常分配

    • red:有主分片未能正常分配(比如:当节点服务器磁盘容量超过 85%时,去创建了一个新的索引)

6. 小结

  • 一个节点就是一个运行 ES 的 Java 进程

  • 一个集群由一个或多个节点共同组成,每个节点可以承担不同的角色

  • 一个主分片是一个 Lucene 运行实例,存储索引的一部分或全部数据

  • 一个副本分片是一个主分片的拷贝

  • ES 可以通过分片来实现水平扩展和数据可用性

  • 集群的健康状态分为 3 种,也是分片的 3 种不同状态


文章转载自唯自律方自由,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论