一.ES的了解
ElasticSearch:分布式搜索引擎 这里我们简称做ES
ES是一个基于Lucene框架的搜索引擎产品,you know search。
Lucene是一个非常高效的全文检索引擎框架。
ES的一些核心概念:
1.索引 index:相当于是关系型数据库的table
2.文档document: row 行
3.字段 field text\keyword\byte:列
4.映射mapping:相当于建表语句
5.查询方式 DSL语句 新版本也支持SQL
6.分片sharding和副本repelicas
ES的使用场景。ES可以用在大数据量的搜索场景,另外ES有很强大的计算能力。
二.ES如何进行分词,有哪些分词器
IK分词器,ES是不支持中文分词的 默认设定为每一个中文为一个词
HanLP :多语言分词
三.ES写入数据的工作流程
① 客户端发写数据的请求时,可以发往任意节点,这个节点就会成为协调节点
②协调节点会计算要写入文件的分片:计算时就取用Hash取模的方式来计算
③协调节点就会进行路由,将请求发给对应的primary sharding 所在的的datanode
④datanode节点上的primary sharding 处理请求,写入数据到索引库,
并且将数据同步到对应的replica sharding
⑤等primary sharding 和 replica sharding 都保存好文件后,返回客户端响应
四.ES查询数据的工作流程
①客户端发请求可发给任意节点,这个节点就成为协调节点
②协调节点将查询请求广播到每一个数据节点,这些数据节点的分片就会处理改变查询请求
③每个分片进行数据查询,将符合条件的数据放在一个队列当中,并将这些
数据的文档ID、节点信息、分片信息都返回给协调节点
④由协调节点将所有的结果进行汇总,并排序
⑤协调节点向包含这些文档ID的分片发送Get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据整合返回给客户端
五.倒排索引
倒排索引(Inverted Index):倒排索引是实现“单词-文档 矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
六.ES 生产集群的部署架构是什么?
ES生产集群我们部署了 5 台机器,每台机器是 6 核 64G 的,集群总内存是 320G。
我们 es 集群的日增量数据大概是 2000 万条,每天日增量数据大概是 500MB,每月增量数据大概是 6 亿,15G。目前系统已经运行了几个月,现在 es 集群里数据总量大概是 100G 左右。
七.有多少个索引?每个索引有多大数据量?每个索引给了多少个分片?
线上有 5 个索引,每个索引的数据量大概是 20G,所以这个数据量之内,我们每个索引分配的是 8 个 shard,比默认的 5 个 shard 多了 3 个 shard。
八.ElasticSearch中的集群、节点、索引、文档、类型是什么?
集群是一个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。群集由唯一名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分。
节点是属于集群一部分的单个服务器。它存储数据并参与群集索引和搜索功能。
索引就像关系数据库中的“数据库”。它有一个定义多种类型的映射。索引是逻辑名称空间,映射到一个或多个主分片,并且可以有零个或多个副本分片。 MySQL =>数据库 ElasticSearch =>索引
文档类似于关系数据库中的一行。不同之处在于索引中的每个文档可以具有不同的结构(字段),但是对于通用字段应该具有相同的数据类型。MySQL => Databases => Tables => Columns / Rows ElasticSearch => Indices => Types =>具有属性的文档
类型是索引的逻辑类别/分区,其语义完全取决于用户。
九.ElasticSearch中的分片是什么?
在大多数环境中,每个节点都在单独的盒子或虚拟机上运行。
索引 – 在Elasticsearch中,索引是文档的集合。
分片 -因为Elasticsearch是一个分布式搜索引擎,所以索引通常被分割成分布在多个节点上的被称为分片的元素。
十.如何解决ES集群的脑裂问题
所谓集群脑裂,是指 Elasticsearch 集群中的节点(比如共 20 个),其中的 10 个选了一个 master,另外 10 个选了另一个 master 的情况。
当集群 master 候选数量不小于 3 个时,可以通过设置最少投票通过数量(discovery.zen.minimum_master_nodes)超过所有候选节点一半以上来解决脑裂问题;
当候选数量为两个时,只能修改为唯一的一个 master 候选,其他作为 data 节点,避免脑裂问题。
十一.ES部署可以进行哪些优化
1.集群部署的优化
- 可以设置ES的yml配置文件,path.data目录尽量设置在硬盘上,因为会频繁进行IO,需要提高性能;还可以设置JVM的配置文件,根据实际情况设置服务器的内存大小
2.更合理的shard布局
根据实际情况而定
- 让主分片和副本分片处在同一机房同一服务器,可以更好的进行数据传输,同步之类的操作
- 让主分片和副本分片分别处于不同机房,提高可用性
3.linux服务器的优化
- 不要使用root用户启动,处于安全考虑
十二.ES是怎么进行master选举的
1.master节点的作用
ES集群会选择一个master节点,也可以在yml文件中设置多个,尽量挑选性能好的节点,作用是为了将主分片和副本分片身份进行转换,假如当一个节点宕机了,那么它所在节点的主分片也就消失了,这时候master节点就会将其对应的副本分片转换为主分片,让用户可以正常查询,保证查询的速度,当宕机的节点恢复正常后,那么就变为副本分片,并会同步之前被操作过的数据,这样来维持ES集群的正常架构
2.选举的流程
- 确认候选主节点(master)数达标,在yml配置文件中discovery.zen.minimum_master_nodes
先判定是否符合具备master的资格,master:true,具备这个条件的节点返回,如果节点都符合,则节点ID小的返回作为master
十三.ES在数据量很大情况下,如何提高查询效率
1.性能优化————filesystem cache
- 当用户写入数据时,这些数据会存放到磁盘文件中,查询时,操作系统会将磁盘文件中的数据自动缓存到filesystem cache中,内存IO相比磁盘IO效率是非常高的,所以我们就需要尽可能给filesystem cache更多的内存。比如文件系统缓存的内存大小为100G,而索引库中的数据也是100G,那么进行查询时,都是走内存的,几乎在1秒内
2.数据预热
- 如果实际情况还是导致大部分索引数据存在磁盘中,那么可以采用数据预热的方式
- 比如微博、头条、淘宝一些热点数据,我们可以写个用来预热程序,每隔一段时间就去访问查询一次热点数据,这样这些数据也就存在了文件系统缓存中,后面用户再进行查看,则效率性能得到了很大的提高
3.冷热分离
- 相似与mysql中的水平拆分,将热点数据存放到一个索引中,冷门数据存放到另外一个索引中,比如ES集群中有6台机器,3台机器分别三个shard存放热数据,其他3台则存放冷数据,那么当热数据被访问,就直接进入内存中,冷数据我们也可以定期的force_merge 加 shrink 压缩操作,减少存储空间和检索效率,这也是提高查询性能的一种方式
[…] 包含三大基础组件,分别是ElasticSearch、Logstash、Kibana。 […]