ElasticSearch 集群搭建、工作原理

it2023-12-20  67

目录

概述搭建es集群kibana连接es集群分片管理查看集群信息文档读写过程写操作读操作 es中的乐观锁倒排索引analyzer 分词器  

概述

es为什么要集群?(集群的作用)

高可用。高可用(High Availability)是分布式系统必须考虑的因素之一,实质是减少系统不能提供服务的时间。eg. 系统每运行100个时间单位,会有1个时间单位无法提供服务,则该系统的可用性是99%。

负载均衡:将流量分散到多个节点上,减轻单个节点的压力

提高整个系统的性能

 

es天生就是分布式的,就算只有一个节点,也是以集群方式部署的。

es集群的分布式优势

自动分配分片,自动确定文档的存储位置自动同步数据至副分片(数据冗余),以防止硬件故障导致的数据丢失集群扩容时可以无缝整合新节点,自动重新分配分片

 

一个es节点可以同时具有多种角色,常见的角色有2种

master:master备选节点,有被选举为master的资格,默认具有此角色data:数据存储节点,用于存储数据,默认具有此角色

一个es集群可以有多个master节点,但实际只有一个master节点,其余都是备胎。

当集群中一半以上的master正常时,集群才对外提供服务,否则集群不可用。这个数值可调,默认为 master数量/2+1 。

 

分片可分为

主分片( primary shard):每个主分片只存储索引的部分数据,也就是说一个索引的数据是分散存储在多个分片上的,多个分片构成全样数据。副本分片(replica shard):主分片的副本,用于备份主分片上的数据

 

搭建es集群

1、elasticsearch.yml

#集群名称 cluster.name: es #节点名称 node.name: node-1 #自动绑定本机实际ip,允许外网访问 network.host: 0.0.0.0 #es对外提供服务使用的端⼝,默认9200 #http.port: 9200 #es节点之间通信使用的端口,默认9300 #transport.tcp.port: 9300 #指定集群节点(ip+通信端口) discovery.seed_hosts: ["192.168.1.2:9300","192.168.1.3:9300","192.168.1.4:9300"] #初始主节点,集群启动时会从里面选出一个真正的master cluster.initial_master_nodes: ["node-1", "node-2","node-3"]

如果是本地模拟集群,需修改 http.port 、transport.tcp.port、discovery.seed_hosts 使用的端口。  

2、jvm.options

#设置jvm的最小、最大堆内存 -Xms10g -Xmx10g

  3、如果data目录下有内容,清空data目录  

4、其它系统配置参考:

https://blog.csdn.net/chy_18883701161/article/details/108859273

防火墙要开启es对外提供服务使用的9200端口、集群内部节点之间通信的9300端口。  

5、启动各节点,访问任意一个节点的 /_cat/nodes?v ,如果节点数正确,则集群搭建成功。*号标出的是真正的master节点。  

如果每个节点都是真正的master,组成的都是单独的集群,检查

discovery.seed_hosts配置是否正确启动之前是否未清空data目录

 

kibana连接es集群

kibana.yml

#指定es集群节点 elasticsearch.hosts: ["http://192.168.1.2:9200","http://192.168.1.3: 9200","http://192.168.1.4:9200"]

查询数据时只使用其中某个节点,该节点故障时自动使用另一个节点。

 

分片管理

分片是针对index而言的,es是分布式的搜索引擎,index通常会分解成不同部分(分片)分布在不同的数据节点上。es会自动分配、管理分片,在需要的时候会自动重新分配分片,无需用户手动管理分片。

从7.x开始,如果创建index时不指定分片数量,默认会创建1个主分片、⼀个副分片;7.x之前则是默认创建5个主分片。  

可以在创建index时指定分片数量

PUT /mall { "settings": { "number_of_shards": 1, #主分片 "number_of_replicas": 2 #副分片 }, "mappings": { "properties": { "goods_name": { "type": "keyword" }, "goos_price": { "type": "float" }, "goods_description": { "type": "text" } } } }

  可以修改分片数量

PUT /mall/_settings { "number_of_replicas": 3 #修改副分片数量 }

 

查看集群信息

GET /_cat #查看选项 GET /_cat/shards?v #查看所有分片的信息。?v会显示每一项的名称 GET /_cat/shards/mall?v #指定index的分片 GET /_cat/nodes?v #所有节点 GET /_cat/master?v #主节点 GET /_cat/indices?v #所有索引 GET /_cat/indices/mall?v #指定索引 GET /_cat/count?v #文档总数 GET /_cat/count/mall?v #指定index的文档数 GET /_cat/health?v #集群健康状况 GET /_cat/plugins?v #启用的插件

shards是分片,pri是主分片(primary shards)。  

集群状态

red:集群不可用。至少缺失一个主分片以及它的全部副分片,缺失部分数据,搜索只能返回部分数据,而分配到这个分片上的写请求会返回一个异常。yellow:集群可用但仍存在问题。所有的主分片都已分配,但缺失了至少一个副分片。数据是完整的,读写正常,但可用性降低了。green:正常。所有的主分片、副分片都已分配。

 

文档读写过程

master负责维护集群状态,在有新节点加入或离开时重新分配分片。

由主分片执行写操作,再同步到副分片。主分片往往分散在多个节点上,不一定在master上。(这一点和zk不同)

 

写操作

客户端向es集群发送文档写请求集群的某个节点接收到请求,通过路由算法确定该文档所属的主分片,将请求转发给该主分片所在节点主分片执行写请求,成功后将请求转发给对应副分片所在节点副本分片执行请求,将执行结果通知主分片所在节点如果所有副分片都执行(同步)成功,主分片节点通知接受请求的接待您操作成功,接收请求的节点向客户端返回操作成功

 

读操作

客户端向es集群发送文档读请求集群的某个节点接收到请求,根据路由算法确定文档所在分片的节点列表,再根据负载均衡算法(默认轮询)确定转发给其中的某个节点分片所在节点将数据返回给接收到请求的节点,接收到请求的节点将数据返回给客户端  

es集群中的概念和普通集群不同

普通集群:master处理写请求,master、slave都可以处理读请求es集群:master负责集群的分片管理,写请求由主分片处理,读请求主分片、副分片都可以处理。分工不同。

 

es中的乐观锁

悲观锁:每次操作时都认为别⼈会修改数据,所以操作时会先加锁。eg. 关系数据库的行锁、表锁,都是在做操作之前先上锁。乐观锁:每次操作时都认为别⼈不会修改数据,不上锁,但提交更新时会检测操作期间数据是否已被修改。

悲观锁适合写多读少、并发量小的场景,乐观锁适合读多写少、并发量大的场景。

es读多写少,常使用乐观锁解决并发问题,使用乐观锁也可以提⾼系统吞吐量。  

#读文档时会返回该文档的版本号_version,假设返回的是版本号是9 GET /mall/_doc/1999 #更新文档时校验版本号(+1)。如果更新后版本号为10则返回成功,否则返回失败 POST /mall/_doc/1999?version=10&version_type=external { "goods_price": 12.00 }

 

倒排索引

倒排索引记录词项(分词得到的词)信息,包括含有该词的文档id、字段名、出现次数(频率)等。

搜索时,并非遍历所有文档、从前往后匹配关键字,而是在倒排索引中检索关键字,直接定位匹配的文档。

添加、更新文档时,会先把字段值中的大写字母转成小写字母,再分词,更新倒排索引中的词项信息。

 

analyzer 分词器

分词器又叫做分析器,有2个作用时间点

全文检索时对搜索关键字进行分词插入、更新文档时给字段值分词,以更新倒排索引中的词项统计信息

这也是es计算相关性(score)中的重要依据。

 

分词器由三部分组成

char filter:以字符流的形式接收文本,并对文本进行预处理tokenizer : 分词器,对文本进行分词token filter :token过滤器,处理分词得到的词项

最新回复(0)