“这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战”
一、ElasticSearch 节点类型
在ElasticSearch中主要分为两类节点,一类是Master节点,一类是DataNode。
1. Master节点
当某个节点启动
后,然后使用Discovery机制
找到集群中的其他节点
,并建立连接
。并从候选主节点
中选出一个Master节点
。
Discovery机制
:discovery.seed_hosts: ["s201", "s202", "s203"]
候选主节点
:cluster.initial_master_nodes: ["moe-es-node1", "moe-es-node2", "moe-es-node3"]
Master节点主要职责
- 管理索引:创建索引、删除索引、分配分片
- 维护元数据
- 管理集群节点状态
- 不负责数据写入和查询
2. DataNode节点
在ElasticSearch集群中,会有N个DataNode节点。
DataNode节点主要负责
- 数据写入
- 数据检索
大部分ElasticSearch的压力都在DataNode节点上,在生产环境中,内存最好配置大一些。
二、分片和副本机制
1. shard 分片
ElasticSearch是一个分布式的搜索引擎,索引的数据也是分成若干部分,分布在不同的服务器节点中,意思就是一台机器存不下,多台机器来存储。分布在不同服务器节点中的索引数据,就是分片(shard)。ElasticSearch会自动管理分片,如果发现分片不均衡,就会自动迁移。
一个索引(index)由多个shard(分片)组成,而分片是分布在不同服务器节点上的。
2. replica 副本
为了保证ElasticSearch分片(shard)的高可用、容错性,ElasticSearch会对分片(shard)引入replica(副本)机制,每一个分片都有对应的副本分片。
每个分片都会有一个主分片(Primary Shard),若干个副本分片(Replica Shard)
Primary Shard 和 Replica Shard不在同一个服务器节点上。
3. 创建索引时指定分片和副本
创建指定分片数量、副本数量的索引
PUT /moe_article
{
"mappings": {
"properties": {
}
},
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
假如有三台服务器节点
number_of_shards:3个主分片
number_of_replicas:2个副本
三、ElasticSearch 重要工作流程
1. ElasticSearch 文档写入原理
- 假如选择了Node2(DataNode)发送请求,此时Node2称为coordinating node(协调节点)
- 计算得到文档要写入的分片
shard = hash(routing) % number_of_primary_shards
routing 是一个可变值,默认是文档的 _id
- coordinating node会进行路由,将请求转发给其他DataNode(对应某个primary shard,假如主分片在Node1节点上)
- Node1上的Primary Shard处理请求,写入数据到索引库中,并将数据同步到其他的Replica Shard中
- Primary Shard 和 Replica Shard都保存完文档后,返回客户端。
2. ElasticSearch 检索原理
- 假如选择了Node2,此时Node2称为coordinating node(协调节点)
- 协调节点(Coordinating Node)将查询请求广播到每一个数据节点,这些数据节点的分片会处理该查询请求。
- 每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给协调节点。
- 协调节点将所有的结果进行汇总,并进行全局排序。
- 协调节点向包含这些文档ID的分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据返回给客户端。
四、总结
ElasticSearch节点类型分为 Master(主节点)和 DataNode(数据节点)。分片(Shard)分为 Primary Shard(主分片)和 Replica Shard(副分片)。分片(Shard)可以支撑海量数据,解决单机磁盘容量问题,副本(Replica)可以保证数据不丢失。
欢迎大家关注微信公众号(MarkZoe)互相学习、互相交流。