本文来自极客时间《Elasticsearch核心技术实战》 课程学习笔记,感兴趣的同学可以订阅该课程,本文介绍集群、节点、分片和副本的一些概念
架构
-
高可用
- 服务可用性 - 允许部分节点停止服务
- 数据可用性 - 部分节点丢失数据,整个系统不会丢失数据
-
可扩展性
- 请求量的上升、数据不断增长(将数据分布到所有节点上)
Elasticsearch分布式架构的好处
- 储存水平扩容
- 系统的高可用性,部分节点停止服务,整个集群服务不受影响
Elasticsearch的分布式架构
- 不同集群是通过集群名称来区分的,默认集群名称为“elasticsearch”
- 可在配置文件(elasticsearch.yml)中修改集群名称,也可以在启动命令中通过
cluster.name=${clusterName}
指定 - 一个集群可以有一个或多个节点
节点
- 节点就是一个Elasticsearch实例
- 本质上是一个java进程
- 一台机器上可以多个Elasticsearch实例,在生产环境中,一般一台机器运行一个Elasticsearch实例
- 每个节点都有自己的名字,可以在配置文件中配置,也可以在启动命令中通过
-E node.name=${nodeName}
指定 - 每个节点启动之后,系统会分配一个全局唯一的uid,保存在data目录下。
Master-eligible节点和Master节点
-
每个节点启动后,默认就是一个Master-eligible节点,但可通过
node:master = false
来禁止 -
Master-eligible节点可参加选主流程,有机会成为Master节点
-
当第一个节点启动的时候,它会将自己选举成为Master节点
-
每个节点都会保存集群的状态,只有Mater节点才可修改集群的状态信息
- 集群状态,维护了一个集群中的必要信息,包括:
- 所有的节点信息
- 所有的索引及其相关的Mapping和Setting信息
- 分片的路由信息
-
- 集群状态,维护了一个集群中的必要信息,包括:
-
任意节点都能修改信息的话,将导致数据不一致
Data节点和Coordinating节点
-
Data节点
- 可以保存数据的节点,叫做Data Node。负责保存分片数据,在数据的水平扩展方面起到了很重要的作用。
-
Coordinating节点
- 负责接收客户端请求,并将请求分发到合适的节点,最终又将结果进行汇总
- 每个节点默认都起到了 Coordinating节点 的作用
其他节点
-
Hot Node & Warm Node 。又叫冷热节点,比如日志场景
-
Machine Learning node 。跑机器学习的job
-
tribe node deprecend 。开始被废弃,使用Cross Cluster Search来代替
配置节点类型
- 开发环境,一个节点可承担多种角色
- 生产环境,应设置单一节点角色
分片
-
主分片,解决了数据水平扩展问题。可以将数据分布到集群内的所有节点
- 一个分片就是一个运行的Lucene实例
- 主分片数在创建索引时指定,后续不允许修改,除非reindex
-
副本分片,解决了数据高可用问题
- 副本分片数可动态调整
- 增加副本分片数,一定程度上可提高服务可用性、读吞吐量等
一个三节点的集群,blogs索引的分片分布情况
![image-20200730083336811](/Users/book/Library/Application Support/typora-user-images/image-20200730083336811.png)
分片的设定
对于生产环境片数的设定,需要提前做好容量规划。
-
分片数过小
- 后续无法增加节点来实现水平扩展
- 单个分片数据量太大,导致数据重新分配耗时
-
分片数过大。7.0开始,默认主分片数由0更改为1,从而解决了
over-sharding
- 影响搜索结果相关性分数,影响统计结果的准确性
- 单个节点上过多分片,资源浪费,也会影响性能
查看集群的健康状态
- green - 主副分片都正常
- yellow - 主分片全部正常分配,副本分片不能正常分配
- red - 有主分片不能分配,比如:服务器磁盘容量使用超过85%时,创建一个新的索引
- 查看集群状态:GET _cluster/health
- 查看节点信息:GET _cat/nodes
- 可以使用Kibana+Cerebro (之前有过课程介绍)
原文地址