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 种不同状态