ES知识点
2022-01-26 15:58:12 2 举报
ElasticSearch知识点概要
作者其他创作
大纲/内容
概述
定义
开源的、高扩展的、分布式的、全文搜索引擎
Restful风格的搜索和分析
数据格式
结构化数据 mysql postgresql 数据库等
半结构化数据 MongoDB redis等
非结构化数据 html和xml 也是存储MongoDB
ES和Solr
都是基于Lucene开发,功能侧重点不一样
基础操作
Restful
GET、PUT、DELETE、HEAD
POST
返回值 JSON
索引
创建索引 PUT index-001
查看索引
GET index-001
GET _cat/indices?v
删除索引 DELETE index-001
文档
创建
不指定ID POST index-001/_doc {}
指定ID POST index-001/_doc/10001 {}
查询
主键查询 GET index-001/_doc/10699
条件查询 GET index-001/_search {条件}
分页查询 GET index-001/_search {from,size}
指定字段查询 GET index-001/_search {"_source":[]}
排序查询 {"sort":{}}
多条件查询 must should
范围查询 filter range gt lt
全文检索和完全匹配 match和match_phrase
高亮查询 highlight 跟query并列
聚合查询 aggs (terms,cardinality,range ,avg)
映射关系查询 GET index-001/_mapping
修改
完全修改 PUT index-001/_doc/10699 {}
局部修改 POST index-001/_update/10699 {"doc":{}}
删除 DELETE index-001/10699
JavaAPI
链接客户端 RestHighLevelClient
索引
创建索引 CreatIndexRequest
查询索引 GetIndexRequest
删除索引 DeleteIndexRequest
文档
新增 IndexRequest
查询 GetRequest
修改 UpdateRequest
删除 DeleteRequest
批量插入 BulkRequest 包装多个IndexRequest一起发送
批量删除 BulkRequest 包装多个DeleteRequest一起发送
全量查询 new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
分页查询 SearchSourceBuilder.from(0) SearchSourceBuilder.size(2)
排序查询 SearchSourceBuilder.sort(field,SortOrder.DESC)
部分字段查询 SearchSourceBuilder.fetchSource(includes,excludes)
组合查询 new SearchSourceBuilder().query(QueryBuilders.boolQuery())
范围查询 QueryBuilders.rangeQuery(field);
模糊查询 QueryBuilders.fuzzyQuery(field,keyword).fuzziness(Fuzziness.ONE);
高亮查询 HighlightBuilder
最大值查询 SearchSourceBuilder.aggregation(AggregationBuilders.max(name).field();
分组聚合查询 SearchSourceBuilder.aggregation(AggregationBuilders.term());
部署环境
单机 (单点故障,容量不行,并发能力有限)
集群 Cluster
三节点部署
准备一份ES得解压缩环境;
修改配置文件 config/elasticsearch.yml
集群名称:cluster.name
节点名称 node.name 三个节点名字不一致
主机名称 network.host 写对应得IP 也行
端口号 http.post
通信端口 transport.tcp.port
跨域配置 : http.cors.enabled:true http.cors.allow-origin:"*"
查看集群状态 http://localhost:port/_cluster/health
配置其他节点 需要修改节点名称,还要配置发现其他节点得配置
集群全部配置完毕,挨个启动节点,
linux 单机版
解压缩 tar.gz
创建用户 不允许root用户直接运行
修改配置文件
linux 集群版
加入基本配置项 config/elasticsearch.yml
修改/etc/security/limits.conf
修改/etc/security/limits.d/20-nproc.conf 文件句柄数
修改/etc/sysctl.conf
重新加载 sysctl -p
启动 bin/elasticsearch 不能再root用户下启动
高级
核心概念
索引 index 提高搜索得性能
类型 type 在索引中定义得类型 默认_doc
文档 document 一条数据 json格式
字段 field 文档数据得不同属性得分类标识
映射 mapping 索引得结构信息
分片 shards 将索引划分成多分 提高性能和吞吐量
副本 Replicas 保证数据安全,高可用性,做数据备份
系统架构
Master 节点管理 一个分片就是lucene 得index
分布式集群
单节点结群 分片*副本 = 节点数 默认是1
集群健康值 yellow 主分片可用,副本不合理 不健康
故障转移 起动另一个节点 将分片副本切换到 另一个节点上
水平扩容 自动分配节点,互相备份,将分片平均合理分配到节点上
扩容得节点超过所有分片数量时,可以扩大副本分片,主分片不能修改
故障应对 节点分片正常使用,可能发生主节点得转移
路由计算和分片控制
数据插入和查询 需要路由计算 用hash/分片数
分片控制 一般是轮询 取数据
数据写流程 默认一致性配置 consistency 绝大部分,one , all
数据读流程
更新流程 先读取 后写入
分片原理 ES得最小工作单元
倒排索引 快速得全文搜索
分词后得单词和文章之间的映射关系和词典顺序称之为倒排索引
分词器 keyword 不会被分词 text会被分词
ik_max_word 最细粒度分词 ik_smart最粗粒度
词条 : 索引中最小存储和查询单元
词典:字典,词条的集合 B+树 或 Hash表
倒排表:文档的词典位置集合
文档搜索
修改使用补充索引而不是重建索引,查询会按照段查询
近实时搜索(文档刷新 文档刷写 文档合并)
文档分析(分词器)
字符过滤器
分词器
Token过滤器
中文分词器,可以添加自定义的词汇
自定义分词器:
文档冲突(局部更新)并发操作
悲观锁 : 保证锁定 性能低, 阻塞
乐观锁 : 结合版本号去更新数据,失败就重试
if_seq_no
if_primary_term
_version 和 version_type=external
Kibana ES的可视化工具
使用集成
Spring Data
spring-boot-data-elasticsearch
SparkStreaming
Scala文件
Flink
优化
硬件选择
索引和文档全是存储在本地磁盘中,具体路径在config/elasticsearch.yml中配置path.data,需要优化磁盘I/O
使用固态优盘SSD 电子存储芯片阵列 闪存
RAID 0,分散存储,分散读取,提高性能,故障安全性差
使用多块硬盘,配置多个path.data
不能使用远程挂载的,NFS或者SMB/CIFS,存在网络延时
分片策略
分片和副本是为了 支持分布式和故障转移的特性,分片在索引见好之后不可修改,副本可以,是因为索引的路由机制
分片需要合理配置,一个节点上的分片过多会竞争资源,导致性能变差。
计算相关度的词项统计信息是基于分片的,分片很多会使得相关度变得很低。
每个分片占用磁盘大小不超过ES的最大JVM的堆空间设置。一般32G
一般分片数不超过节点数的3倍
节点数<= 主分片数*(副本数+1)
推迟分片分配(给问题节点留有恢复余地)
修改参数delayed_timeout
单独对索引设置
路由选择
路由计算值=hash%分片数 到具体分片
查询不带路由参数 查所有节点再汇总
带路由查询,速度快
写入速度优化
加大Tanslog Flush,目的是降低磁盘写频率,和写锁频率
增加Index Refresh 间隔, 目的减少Segment merge的次数
调整Bluk线程池和队列,多用批量处理
优化节点间的任务分布和优化Lucene层的索引建立,目的降低COU和IO消耗
批量数据提交
批量提交的大小不能超过100MB,实际需要按照5MB到15MB逐渐调试优化
优化存储设备
ES密集使用磁盘,段合并会频繁操作磁盘
合理使用段合并
ES默认采用保守的策略,后台定期合并
减少Refresh的次数
如果对实时性要求不高 ,修改refresh_interval,默认是1s
减少Flush设置,增加缓存
Translog达到512MB或者30min,会触发一次Flush
减少副本的数量
临时关闭副本写配置
内存设置
.config/jvm.options中的-Xms -Xmx
不超过物理内存的百分之50,给lucene操作系统内存空间
堆内存不超过32G,跟指针有关
重要配置
cluster.name 集群名称
node.name
node.master 有资格成为
node.data
问题答疑
为什么要使用ES
ES的master的选举流程
ZenDiscovery:Ping 和Unicast
每个节点通过node.master:true控制是否参加master选举,节点排序
节点投票超过n/2+1,并且自己选择自己,这个节点就是master,否则重复上述操作
master节点责任包括 集群、节点、索引的管理,不负责文档级别的管理,data节点可以关闭http功能
ES的集群脑裂
原因:(找不到master了,就会再选举一个)
网络问题
节点负载
内存回收
解决方案
减少误判:修改节点状态的响应时间:discovery.zen.ping_timeout 默认值3s
选举触发:discovery.zen.minimum_master_nodes:1
角色分离
主节点配置 node.master:true node.data:false
从节点配置 node.master:false node.data:true
ES索引文档的流程
客户端先发送请求到任意节点
节点根据路由算法得出主分片的位置
在主分片上索引数据
先在内存中创建index,
分段对象segment,并同时写translog
每一秒将segment刷写到OS中,目的让用户快速查询,没落盘也查询
刷写到磁盘中
再同步副本数据
再进行查询数据
Es中更新和删除文件
删除和更新都是写操作,但是ES中的文档是不可变的,因此改动跟新其变更
磁盘上的每个索引段都有响应的.del文件,删除请求发送,文档没有删除,只是在.del文件中标记删除,查询能查到,但是会在结果中过滤掉,段合并的时候会清除删除的文档
使用版本号进行,将新文档索引到一个新的段
ES中的搜索流程
分为两个阶段Query Then Fetch 查询再拿出来
查询到索引,会先广播到每一个分片中,每个分片再本地执行搜索
每个分片查询各自的优先队列,合并再根据文档的ID和排序值进行协调,产生查询结果
接下来就是取回阶段
ES 部署优化
机器内存64G
选择多核心CPU
SSD
减少网络传输
减少JVM
不要随意使用垃圾回收
留系统内存给lucene
批量操作bulk 单次文件大小5到15MB
增加段合并内存
搜索不需要近实时,增加索引的刷新时间
大批量导入,可以临时关闭副本
GC
倒排索引常驻内存,无法GC
各类缓存沾满后,堆内存是否够用
并发情况下,如何保证ES读写一致
通过版本号使用乐观锁并发控制,确保新版本不会被旧版本覆盖,由此处理应用层的具体冲突;
对于分片的写操作,一致性配置支持三种情况:quorum/one/all,默认quorum,大于半数
对于读操作,设置replication:sync,主分片和副本分片全部返回后才返回结果
ES监控
es head
kibana
字典树
ES用来做文本词频的统计
核心名词
集群
节点
索引
文档
类型:索引里面的逻辑分区
倒排索引
就是基于lucene的倒排索引,区别正向索引,
倒排索引会在存储数据时将关键词和文档的关系存储在倒排表中。
0 条评论
下一页