在Elasticsearch主要分成两类节点,一类是Master,一类是DataNode。
在Elasticsearch启动时,会选举出来一个Master节点。当某个节点启动后,然后使用Zen Discovery机制找到集群中的其他节点,建立连接,并从候选主节点中选举出一个主节点。
Master节点主要负责:
Master Node的最佳实践
选主的过程
在Elasticsearch集群中,会有N个DataNode节点。DataNode节点主要负责:数据写入、数据检索,大部分Elasticsearch的压力都在DataNode节点上在生产环境中,内存最好配置大一些。
可以保存数据的节点,叫做Data Node,负责保存分片数据。在数据扩展上起到了至关重要的作用。
节点启动后,默认就是数据节点,可以设置node.data: false 禁止。
由Master Node决定如何把分片分发到数据节点上,通过增加数据节点可以解决数据水平扩展和解决数据单点问题。
1.4 其他节点
Elasticsearch是一个分布式的搜索引擎,索引的数据也是分成若干部分,分布在不同的服务器节点中。分布在不同服务器节点中的索引数据,就是分片(Shard)。Elasticsearch会自动管理分片,如果发现分片分布不均衡,就会自动迁移一个索引(index)由多个shard(分片)组成,而分片是分布在不同的服务器上的
对于生产环境中分片的设定,需要提前做好容量规划
7.0 开始,默认主分片设置成1,解决了over-sharding(分片过度)的问题
PUT /blogs
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1 // 0或1
}
}
#查看集群的健康状况
GET _cluster/health
为了对Elasticsearch的分片进行容错,假设某个节点不可用,会导致整个索引库都将不可用。所以,需要对分片进行副本容错。每一个分片都会有对应的副本。在Elasticsearch中,默认创建的索引为1个分片、每个分片有1个主分片和1个副本分片。每个分片都会有一个Primary Shard(主分片),也会有若干个Replica Shard(副本分片)
Primary Shard和Replica Shard不在同一个节点上
// 创建指定分片数量、副本数量的索引

● Green: 主分片与副本都正常分配
● Yellow: 主分片全部正常分配,有副本分片未能正常分配
● Red: 有主分片未能分配。例如,当服务器的磁盘容量超过85%时,去创建了一个新的索引
CAT API查看集群信息:
GET /_cat/nodes?v #查看节点信息
GET /_cat/health?v #查看集群当前状态:红、黄、绿
GET /_cat/shards?v #查看各shard的详细情况
GET /_cat/shards/{index}?v #查看指定分片的详细情况
GET /_cat/master?v #查看master节点信息
GET /_cat/indices?v #查看集群中所有index的详细信息
GET /_cat/indices/{index}?v #查看集群中指定index的详细信息

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.
注意:es路由分片规则是 shard = hash(routing) % number_of_primary_shards,其中number_of_primary_shards为分片数。

一个集群总共需要多少个节点?一个索引需要设置几个分片?规划上需要保持一定的余量,当负载出现波动,节点出现丢失时,还能正常运行。
做容量规划时,一些需要考虑的因素:
● 机器的软硬件配置
● 单条文档的大小│文档的总数据量│索引的总数据量((Time base数据保留的时间)|副本分片数
● 文档是如何写入的(Bulk的大小)
● 文档的复杂度,文档是如何进行读取的(怎么样的查询和聚合)
评估业务的性能需求:
● 数据吞吐及性能需求
○ 数据写入的吞吐量,每秒要求写入多少数据?
○ 查询的吞吐量?
○ 单条查询可接受的最大返回时间?
● 了解你的数据
○ 数据的格式和数据的Mapping
○ 实际的查询和聚合长的是什么样的
ES集群常见应用场景:
● 搜索: 固定大小的数据集
○ 搜索的数据集增长相对比较缓慢
● 日志: 基于时间序列的数据
○ 使用ES存放日志与性能指标。数据每天不断写入,增长速度较快
○ 结合Warm Node 做数据的老化处理
硬件配置:
● 选择合理的硬件,数据节点尽可能使用SSD
● 搜索等性能要求高的场景,建议SSD
○ 按照1∶10的比例配置内存和硬盘
● 日志类和查询并发低的场景,可以考虑使用机械硬盘存储
○ 按照1:50的比例配置内存和硬盘
● 单节点数据建议控制在2TB以内,最大不建议超过5TB
● JVM配置机器内存的一半,JVM内存配置不建议超过32G
● 不建议在一台服务器上运行多个节点
内存大小要根据Node 需要存储的数据来进行估算
● 搜索类的比例建议: 1:16
● 日志类: 1:48——1:96之间
假设总数据量1T,设置一个副本就是2T总数据量
● 如果搜索类的项目,每个节点3116 = 496 G,加上预留空间。所以每个节点最多400G数据,至少需要5个数据节点
● 如果是日志类项目,每个节点3150= 1550 GB,2个数据节点即可