Elasticsearch 基本概念:节点、集群、分片及副本 电脑版发表于:2020/8/14 21:44 ![elasticsearch](https://img.tnblog.net/arcimg/hb/5f1adabe8df94fdb8331eb80e393c4a3.jpeg "elasticsearch") >#Elasticsearch 基本概念:节点、集群、分片及副本 [TOC] <br/> 分布式系统的可用性与扩展性 ------------ - 高可用性 - 服务可用性 - 允许有节点可停止服务 - 数据可用性 - 部分节点丢失,不会丢失数据 - 可扩展性 - 请求量提升 / 数据的不断增长(将数据分布到所有的节点上) 分布式特性 ------------ - Elasticsearch 的分布式架构的好处 - 存储的水平扩容 - 提高系统的可用性,部分节点停止服务,整个集群的服务不受影响 - Elasticsearch 的分布式框架 - 不同的集群通过不同的名字来区分,默认名字“elasticsearch” - 通过配置文件修改,或者在命令行中通过 `-E cluster.name=elasticsearch` 进行设定。 - 一个集群可以有一个或多个节点 节点(node) ------------ - 是一个 Elasticsearch 的实例 - 本质上就是一个 Java 进程 - 一台实例上运行多个 Elasticsearch 进程,但是在生产环境一般建议一台机器上只运行一个 Elasticsearch 实例 - 每一个节点都有名字,通过配置文件配置,或者启动的时候 `-E node.name=node1` 指定 - 每一个节点启动后,会分配一个UID,保存到data目录下 Master-eligible nodes 和 Master node ------------ - 每一个节点启动后默认就是一个 Master eligible 节点 - 可以设置 node.master: false 禁止 - Master-eligible 节点参加选主流程,成为master节点 - 当第一个节点启动的时候,它会将自己选举成master节点 - 每个节点都保存了集群的状态,只有 Master 节点才能修改集群的状态信息 - 集群状态(Cluster state),维护了一个集群中,必要的信息 - 所有的节点信息 - 所有的索引和其相关的 Mapping 与 Setting 信息 - 分片的路由信息 - 任意节点都能够修改信息,会导致数据的不一致 Data Node & Coording Node ------------ <br/> >###Data Node tn>可以保存数据的节点,叫做Data Node。负责保存分片数据。在数据扩展上起到了至关重要的作用。 >###Coording Node tn>负责接收client的请求,并把请求分发到合适的节点中,最终把结果汇集在一起。 每个节点默认都起到了Coording Node的职责 其他节点类型 ------------ <br/> >###Hot & Warm Node tn>不同硬件配置的Data Node,用来实现 Hot & Ware 架构,降低集群部署的成本 >###Machine Learning Node tn>负责跑机器学习的Job,用来做异常检测。 >###Tribe Node tn>(5.3 开始使用 Close Cluster Search) Tribe Node 连接到不同到 Elasticsearch 集群,并且支持集群作为一个单独的集群处理 配置节点类型 ------------ - 开发环境中一个节点可以承担多种角色 - 生产环境中,应该设置单一的角色的节点(dedicated node) | 节点类型 | 配置参数 | 默认值 | | ------------ | ------------ | ------------ | | master.eligible | node.master | true | | data | node.data | true | | ingest | node.ingest | true | | coordinating | 无 | 每个节点默认都是coordinating | | machine learning | node.ml | true(需enable x-pack) | 分片(Primary Shard & Replica Shard) ------------ - 主分片用于作为数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有分片上 - 一个分片是运行 Lucene 的实例 - 主分片数在索引创建时指定,后续不允许修改,除非 Reindex - 副本,是用与解决高可用的问题。分片是主分片的拷贝 - 副本分片数,可以动态调整 - 增加副本数,还可以在一定程度上提高服务的可用性(读取可用性) - 一个三节点索引中,blogs 索引的分片分布情况 - 思考:增加一个节点或改大主分片数对系统的影响? >在 Dev Tools 中运行 `PUT /blogs` blogs 索引的分片分布情况 分片的设定 ------------ - 对于生产环境中分片的设定,需要提前做好容量的规划 - 分片数设置过小 - 导致无法增加节点实现水平扩展 - 单个分片数据量过大,导致数据重新分配耗时 - 分片数设置过大,7.0开始,默认主分片设置成1,解决了 over-sharding 的问题 - 影响搜索结果的相关打分,影响统计结果的准确性 - 单个节点上过多的分片,会导致资源浪费,同时也会影响性能 查看集群的健康状况 ------------ tn>我们可以通过 `_cluster/health` 来查看集群的健康状态 ![health](https://img.tnblog.net/arcimg/hb/ef7b7d001b484f9a9453b483210bee2b.png "health") >`Green` - 主分片与副本都正常分配 `Yellow` - 主分片全部正常分配,有副本分片未能正常分配 `Red` - 有主分片未能正常分配 tn>例如,当服务器的磁盘容量超过85%时,去创建了一个新的索引 cerebro 对 ES 的认识 ------------ ![](https://img.tnblog.net/arcimg/hb/686032a630704de49a314af217f69173.png) tn>从图中可以看到有2个节点,3个索引,6个分片,4719个文档;其中名为es7_01的es为主节点。如果当我们对副节点进行重起时我们可以看到 cerebro 会检测到,如下图所示。 ![](https://img.tnblog.net/arcimg/hb/2ad57a9ec32441ae8dd0e0a14b104eda.png)