ES知识点
2022-01-26 15:58:12 2 举报
登录查看完整内容
ElasticSearch知识点概要
作者其他创作
大纲/内容
开源的、高扩展的、分布式的、全文搜索引擎
Restful风格的搜索和分析
定义
结构化数据 mysql postgresql 数据库等
半结构化数据 MongoDB redis等
非结构化数据 html和xml 也是存储MongoDB
数据格式
都是基于Lucene开发,功能侧重点不一样
ES和Solr
概述
GET、PUT、DELETE、HEAD
POST
返回值 JSON
Restful
创建索引 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 {\"_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
文档
链接客户端 RestHighLevelClient
创建索引 CreatIndexRequest
查询索引 GetIndexRequest
删除索引 DeleteIndexRequest
索引
新增 IndexRequest
查询 GetRequest
修改 UpdateRequest
删除 DeleteRequest
批量插入 BulkRequest 包装多个IndexRequest一起发送
批量删除 BulkRequest 包装多个DeleteRequest一起发送
全量查询 new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
分页查询 SearchSourceBuilder.from(0) SearchSourceBuilder.size(2)
组合查询 new SearchSourceBuilder().query(QueryBuilders.boolQuery())
范围查询 QueryBuilders.rangeQuery(field);
高亮查询 HighlightBuilder
最大值查询 SearchSourceBuilder.aggregation(AggregationBuilders.max(name).field();
分组聚合查询 SearchSourceBuilder.aggregation(AggregationBuilders.term());
文档
JavaAPI
基础操作
单机 (单点故障,容量不行,并发能力有限)
集群 Cluster
准备一份ES得解压缩环境;
集群名称: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
配置其他节点 需要修改节点名称,还要配置发现其他节点得配置
集群全部配置完毕,挨个启动节点,
修改配置文件 config/elasticsearch.yml
三节点部署
解压缩 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用户下启动
linux 集群版
部署环境
索引 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-boot-data-elasticsearch
Spring Data
Scala文件
SparkStreaming
Flink
使用集成
使用固态优盘SSD 电子存储芯片阵列 闪存
RAID 0,分散存储,分散读取,提高性能,故障安全性差
使用多块硬盘,配置多个path.data
不能使用远程挂载的,NFS或者SMB/CIFS,存在网络延时
索引和文档全是存储在本地磁盘中,具体路径在config/elasticsearch.yml中配置path.data,需要优化磁盘I/O
硬件选择
分片需要合理配置,一个节点上的分片过多会竞争资源,导致性能变差。
每个分片占用磁盘大小不超过ES的最大JVM的堆空间设置。一般32G
一般分片数不超过节点数的3倍
节点数<= 主分片数*(副本数+1)
计算相关度的词项统计信息是基于分片的,分片很多会使得相关度变得很低。
分片和副本是为了 支持分布式和故障转移的特性,分片在索引见好之后不可修改,副本可以,是因为索引的路由机制
修改参数delayed_timeout
单独对索引设置
推迟分片分配(给问题节点留有恢复余地)
分片策略
查询不带路由参数 查所有节点再汇总
带路由查询,速度快
路由计算值=hash%分片数 到具体分片
路由选择
加大Tanslog Flush,目的是降低磁盘写频率,和写锁频率
增加Index Refresh 间隔, 目的减少Segment merge的次数
调整Bluk线程池和队列,多用批量处理
优化节点间的任务分布和优化Lucene层的索引建立,目的降低COU和IO消耗
写入速度优化
批量提交的大小不能超过100MB,实际需要按照5MB到15MB逐渐调试优化
批量数据提交
ES密集使用磁盘,段合并会频繁操作磁盘
优化存储设备
ES默认采用保守的策略,后台定期合并
合理使用段合并
如果对实时性要求不高 ,修改refresh_interval,默认是1s
减少Refresh的次数
Translog达到512MB或者30min,会触发一次Flush
减少Flush设置,增加缓存
临时关闭副本写配置
减少副本的数量
优化
不超过物理内存的百分之50,给lucene操作系统内存空间
堆内存不超过32G,跟指针有关
.config/jvm.options中的-Xms -Xmx
内存设置
cluster.name 集群名称
node.name
node.master 有资格成为
node.data
重要配置
为什么要使用ES
ZenDiscovery:Ping 和Unicast
每个节点通过node.master:true控制是否参加master选举,节点排序
节点投票超过n/2+1,并且自己选择自己,这个节点就是master,否则重复上述操作
master节点责任包括 集群、节点、索引的管理,不负责文档级别的管理,data节点可以关闭http功能
ES的master的选举流程
网络问题
节点负载
内存回收
原因:(找不到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中更新和删除文件
查询到索引,会先广播到每一个分片中,每个分片再本地执行搜索
每个分片查询各自的优先队列,合并再根据文档的ID和排序值进行协调,产生查询结果
接下来就是取回阶段
分为两个阶段Query Then Fetch 查询再拿出来
ES中的搜索流程
机器内存64G
选择多核心CPU
SSD
减少网络传输
减少JVM
不要随意使用垃圾回收
留系统内存给lucene
批量操作bulk 单次文件大小5到15MB
增加段合并内存
搜索不需要近实时,增加索引的刷新时间
大批量导入,可以临时关闭副本
ES 部署优化
倒排索引常驻内存,无法GC
各类缓存沾满后,堆内存是否够用
GC
通过版本号使用乐观锁并发控制,确保新版本不会被旧版本覆盖,由此处理应用层的具体冲突;
对于分片的写操作,一致性配置支持三种情况:quorum/one/all,默认quorum,大于半数
对于读操作,设置replication:sync,主分片和副本分片全部返回后才返回结果
并发情况下,如何保证ES读写一致
es head
kibana
ES监控
ES用来做文本词频的统计
字典树
集群
节点
类型:索引里面的逻辑分区
核心名词
就是基于lucene的倒排索引,区别正向索引,
倒排索引会在存储数据时将关键词和文档的关系存储在倒排表中。
倒排索引
问题答疑
ES
0 条评论
回复 删除
下一页