文章目录
前言
在之前工作中,简单接触过es,当时对这个中间件没有留意,只知道是个很厉害的‘东西’,现在回想起总感觉错过了些什么,决定渐渐深入的了解一下这个厉害东西,后面还会慢慢迭代出更深的理解
想要深入学习的同学请关注:铭毅天下
一、集群
这个概念想必大家已经很清楚来,为了保证服务的高可用,使用多节点来支持整个服务架构体系
集群搭建可转步到本人的另一片ELK搭建,其中提到整个搭建过程。
这里在温习一下,本次讲解的是在一台机器上部署多个节点,多是多台机器切换ip即可
- 首先将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
- 修改每个节点的配置文件,在每个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被清空。
- translog也有内存管理,发生故障后translog中的data未持久化,也会丢失。因此每隔5s或者完成已成一次请求后,translog都会fync写入磁盘,只有fync成功,ES才会向客户端返回成功的消息。
- 每秒生成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返回客户端