文章目录
- ==本篇文章会将ElasticSearch简写为ES==
- 1、为什么要使用ElasticSearch
- 2、ElasticsSearch和MySQL的区别
- 3、ES的查询流程
- 4、ES的写入流程
- 5、ES目前的检索方式有哪些
- 6、写入调优
- 7、ES如何实现master选举
- 8、集群脑裂问题
本篇文章会将ElasticSearch简写为ES
1、为什么要使用ElasticSearch
系统中的数据随着业务的扩展,时间的推移会变得越来越多,如果对某个关键词进行模糊查询,传统的数据库就会放弃索引,进行全表查询,这样会导致效率特别低。ElasticSearch支持全文检索,对关键词和文档内容建立了倒排索引,可以快速查询到所需的内容。
2、ElasticsSearch和MySQL的区别
- 类型:ES属于非关系型数据库,擅长存储非结构化数据,而MySQL属于关系型数据库,只能存储结构化数据
- 存储过程/索引结构:MySQL需要先对表进行设计,提前定义好数据表的结构,建立正排索引;ES比较灵活,可以对Feild字段进行设计,也可以不设计,建立倒排索引
- 事务支持:Mysql支持事务,ES不支持事务,对修改和删除无法进行回滚
- 读写方式:Mysql使用聚簇索引和非聚簇索引相结合的方式,如果是聚簇索引找到索引也就找到了数据,如果是非聚簇索引,找到了索引后再根据聚簇索引二次查表,直到找到数据。ES的每个node节点都可以接受request,然后分发到含有该index的节点上,对应的节点经过查询、计算、排序等操作后汇总返回给分发request的节点,由该节点返回给client。每次请求都会轮询地发送到各个节点,防止请求全部打到一个节点。
- 数据量:对于大数据量简单计算,ES具有绝对的优势,Mysql主要是查询带索引的数据,数据量通常在百万级别以下。
3、ES的查询流程
分为两个阶段:Query then Fetch
第一个阶段是查询:客户端发送查询请求到任意一个节点,此时节点便是协调节点,将请求内容进行处理并计算分片位置后,分发给对应的分片,每个分片在本地进行查询,将结果保存在有序的优先队列中返回给协调节点。
第二个阶段是取数据:协调节点获取到返回的所有数据后,产生一个全局的排序队列,返回给客户端。
4、ES的写入流程
- 客户端将数据发送给任意一个节点,此节点作为协调节点,
- 通过路后计算得到对应主分片的位置,将数据转发给主分片,主分片将数据写入,然后发送给对应的副本
- 副本手段数据后,将数据写入自己的分片,并将响应结果返回给主分片
- 主分片收到所有副本的响应结果后,在向客户端返回响应
5、ES目前的检索方式有哪些
- 基于DSL检索(常用)
- 基于URL检索
- 基于SQL检索(不推荐)
6、写入调优
- 写入前将副本数设置为0
- 写入前禁用刷新
- 写入时使用bulk批处理
- 尽量使用自动生成的id
- 写入后恢复副本数量和刷新间隔
7、ES如何实现master选举
- Master节点的选举是由ZenDiscovery负责的,主要包括Ping(发现)和Unicast(记录)两个模块
- 对所有可以成为master的节点(node.master:true)按照nodeid的字典顺序排序,每次选举时每个节点将自己知道的节点进行一次排序,选出第一个节点,暂且认为它是master节点
- 如果对某个节点的投票树达到一定数量(所有可以成为master的节点数N/2+1),并且它自己也选自己,那么就将该节点设置为master节点,否则重新选举直到满足条件
- master节点的主要职责是对集群、节点和索引的管理,不负责文档级别的管理(由node节点管理),data节点可以关闭http功能
8、集群脑裂问题
- 同一个集群中的不同节点,对于集群的状态有了不一样的理解。
- 成因:网络延迟,节点负载,内存回收
- 解决方法:
- 减少误判:discovery.zen.ping_timeout默认为3s,可以适当调大
- 选举触发:控制选举行为发生的最小集群主节点数量
- 角色分离:master节点和data节点分离,限制角色:
- 主节点配置:node.master:true; node.data:false
- 数据节点配置:node.master:false; node.data:true