目录
-
-
- 概述
- 搭建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):主分片的副本,用于备份主分片上的数据
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、其它系统配置参考:
防火墙要开启es对外提供服务使用的9200端口、集群内部节点之间通信的9300端口。
5、启动各节点,访问任意一个节点的 /_cat/nodes?v ,如果节点数正确,则集群搭建成功。*号标出的是真正的master节点。
如果每个节点都是真正的master,组成的都是单独的集群,检查
- discovery.seed_hosts配置是否正确
- 启动之前是否未清空data目录
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负责集群的分片管理,写请求由主分片处理,读请求主分片、副分片都可以处理。分工不同。
- 悲观锁:每次操作时都认为别⼈会修改数据,所以操作时会先加锁。eg. 关系数据库的行锁、表锁,都是在做操作之前先上锁。
- 乐观锁:每次操作时都认为别⼈不会修改数据,不上锁,但提交更新时会检测操作期间数据是否已被修改。
悲观锁适合写多读少、并发量小的场景,乐观锁适合读多写少、并发量大的场景。
es读多写少,常使用乐观锁解决并发问题,使用乐观锁也可以提⾼系统吞吐量。
#读文档时会返回该文档的版本号_version,假设返回的是版本号是9
GET /mall/_doc/1999
#更新文档时校验版本号(+1)。如果更新后版本号为10则返回成功,否则返回失败
POST /mall/_doc/1999?version=10&version_type=external
{
"goods_price": 12.00
}
倒排索引记录词项(分词得到的词)信息,包括含有该词的文档id、字段名、出现次数(频率)等。
搜索时,并非遍历所有文档、从前往后匹配关键字,而是在倒排索引中检索关键字,直接定位匹配的文档。
添加、更新文档时,会先把字段值中的大写字母转成小写字母,再分词,更新倒排索引中的词项信息。
分词器又叫做分析器,有2个作用时间点
- 全文检索时对搜索关键字进行分词
- 插入、更新文档时给字段值分词,以更新倒排索引中的词项统计信息
这也是es计算相关性(score)中的重要依据。
- char filter:以字符流的形式接收文本,并对文本进行预处理
- tokenizer : 分词器,对文本进行分词
- token filter :token过滤器,处理分词得到的词项