ElasticSearch的一点结构理解「集群」&&「增删改查」


前言

在之前工作中,简单接触过es,当时对这个中间件没有留意,只知道是个很厉害的‘东西’,现在回想起总感觉错过了些什么,决定渐渐深入的了解一下这个厉害东西,后面还会慢慢迭代出更深的理解


想要深入学习的同学请关注:铭毅天下


一、集群

这个概念想必大家已经很清楚来,为了保证服务的高可用,使用多节点来支持整个服务架构体系

集群搭建可转步到本人的另一片ELK搭建,其中提到整个搭建过程。

这里在温习一下,本次讲解的是在一台机器上部署多个节点,多是多台机器切换ip即可

  1. 首先将es包解压多份,每个文件就是一个节点
tar -zxvf elasticsearch-7.5.1-linux-x86_64.tar.gz elasticsearch-7.5.1-node1
cp elasticsearch-7.5.1-node1 elasticsearch-7.5.1-node2
cp elasticsearch-7.5.1-node1 elasticsearch-7.5.1-node3
  1. 修改每个节点的配置文件,在每个conf文件中的elasticsearch.yml文件
    节点1,同时该节点也是master节点。
# 集群名称,所有节点保持一直
cluster.name: shaun-es                                                                                                 
node.name: node-1                                                                                                     
# 主节点                                                                                                              
node.master: true                                                                                                     
# 数据节点                                                                                                            
node.data: true                                                                                                       
# 支持外网和内网都可访问
network.host: 0.0.0.0                                                                                                 
http.port: 9200                                                                                                       
transport.port: 9300                                                                                                  
# 最大节点数量
node.max_local_storage_nodes: 3      
#三个节点                                                                                 
discovery.seed_hosts: ["172.17.0.8:9300", "172.17.0.8:9301", "172.17.0.8:9302"]                                      
cluster.initial_master_nodes: ["node-1"] # 确保当前节点是主节点                                                       
http.cors.enabled: true                                                                                               
http.cors.allow-origin: "*" 

节点2,该节点为从节点,该节点不提供写数据的功能,可提供读数据服务

cluster.name: shaun-es                                                                                                                   
node.name: node-2                                                                                                                       
node.master: false                                                                                                                      
node.data: true                                                                                                                         
network.host: 0.0.0.0                                                                                                                   
http.port: 9201                                                                                                                         
transport.port: 9301                                                                                                                    
                                                                                                                                        
node.max_local_storage_nodes: 3                                                                                                         
discovery.seed_hosts: ["172.17.0.8:9300", "172.17.0.8:9301","172.17.0.8:9302"]                                                         
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]                                                                           
http.cors.enabled: true                                                                                                                 
http.cors.allow-origin: "*"  

节点3,与节点2相同功能

cluster.name: shaun-es                                                                                                 
node.name: node-3                                                                                                     
node.master: false                                                                                                    
node.data: true                                                                                                       
network.host: 0.0.0.0                                                                                                 
http.port: 9202                                                                                                       
transport.port: 9302                                                                                                  

discovery.seed_hosts: ["172.17.0.8:9300", "172.17.0.8:9301","172.17.0.8:9302"]                                         
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]                                                           
                                                                                                                       
http.cors.enabled: true                                                                                                 
http.cors.allow-origin: "*"

集群的多节点已经准备好,接下来就是依次启动每个节点,每个节点就会根据配置找到所配置的集群环境中
分别执行每个节点bin目录中elasticsearch执行文件,加上-d参数,该参数为后台执行。

./elasticsearch -d
#

集群到这里就启动好来,可以启动kibana进行查看,当前集群状态、节点数量和分片数量,es中的数据是我ELK同步上去的,所以会有16个index。
在这里插入图片描述
集群到这里就已经搭建好,每个集群会有多个节点,每个节点可能处于不用的角色,每个节点所有对应的功能可能不同

Master Eligible Npde(候选主节点)
Master Node (主节点)
负责管理集群,通过广播机制与其他节点维持关系
Date Node(数据节点)
存储数据,负责数据的CRUD
Ingest Node(提取节点)
执行预处理管道,有自己杜立的任务要执行,不负责数据也不负责集群
Tribe Node(部落节点)
协调集群与集群之间的节点
Coordinating Node(协调节点)
每个节点都是潜在的协调节点

二、增删改查

1.增

集群上每个节点都是协调节点,通过hash计算出主分片的位置,然后将请求转发到主分片所在的节点上

主节点现将data写入buffer缓存区,每秒从buffer中refresh到FileSystemCache中,生成Segment,通过translog记录,并清空缓存buffer,生成Segmeng后,索引就可以查到了。buffer再refresh时候会被清空,但是translog不会,所以translog会越来越大, 当translog足够大或者距上次commit有30min,会自动commit,FileSystemCache中的全量Segmegt(追加的倒排索引)被fsync写入磁盘,translog被清空。

  1. translog也有内存管理,发生故障后translog中的data未持久化,也会丢失。因此每隔5s或者完成已成一次请求后,translog都会fync写入磁盘,只有fync成功,ES才会向客户端返回成功的消息。
  2. 每秒生成Segment,shard会存在大量的Segemnt,搜索时候会查询全部的Segment,效率降低。ES会自动合并大小相似的Segment,并删除旧的Segment。

2.删/改

删除:每个Segment中维护了一个.del文件,ES只是逻辑删除,在.del文件标记已删除,查询依旧可以查单,在结果中会过滤掉,当Segment文件过多的时候会执行merge操作,删除有delete标记的数据,物理删除

更新:旧版本中在.del文件中标记要删除的数据,新版本将document索引到一个新的Segemnt

3.查

协调节点接收到请求,将请求分配到相应的shard上(可能是primarty shard,也可能是replieas shard,也可以在查询的时候指定shard)每个shard创建10个结果的优先级队列以相关性排序返回给协调节点,然后将拿到的全部结果通过ducomen_id查到对应的Document组成装队列里,将有序的data返回客户端


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值