1.为什么要使用Elasticsearch?
当我们在商城中使用搜索功能时,随着后期项目数据量的不断增大,如果我们继续使用以前数据库模糊查询的方式去查询数据,在百万数据量的情况下,效率非常低下;而Es是一种支持全文检索的框架,特点是可以实时存储和实时分析搜索引擎,并且当我们数据量很大的时候可以集群,所以我们使用搜索功能时,可以把商品常用的名称,价格,描述,id等信息存储到索引库中,查询的时候可以提高查询速度。
2.elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段
es 生产集群我们部署了 2台机器,每台机器是 6 核 64G 的,集群总内存是 128G。
我们 es 集群的日增量数据大概是 1000 万条,每天日增量数据大概是 200MB,每月增量数据大概是 3 亿,8G。
目前线上有 5个索引,每个索引的数据量大概是 10G,所以这个数据量之内,我们每个索引使用的是默认的5个shard(分片)。
调优手段一般是从三个方面去考虑的:
1.在设计阶段的时候 使用别名进行索引管理,每天凌晨定时对索引进行force_merge操作,针对合理的字段设置分词器
2.在写入的前,副本数设置为0并且禁用刷新机制,写入过程中,采用bulk批量写入;写入后恢复副本数和刷新间隔。
3,在查询的时候利用倒排索引机制,尽量使用keyword类型。
3、elasticsearch 的倒排索引是什么
我们传统的检索方式是通过遍历整篇文章,逐个比对找到对应的关键词位置,而倒排索引是通过分词策略,形成词和文章的关系映射表,这种词典+映射表的方式就是倒排索引,有点类似于我们以前使用的新华字典。倒排索引可极大的提高查询效率。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
4.elasticsearch 索引数据多了怎么办,如何调优,部署
1.在设计的时候可以基于模板+时间滚动方式创建索引,每天递增数据,避免单个索引很大的情况出现。
2.在存储的时候,冷热数据分开存储,比如最近3天的数据作为热数据,其他的作为冷数据,冷数据的话,由于不会再写入新数据了,可以考虑定期force_merge(强制合并)和shrink(压缩)的方式进行处理,节约空间和检索效率
3.由于es支持动态扩展,所有可以多加几台机器来缓解集群压力。
5.elasticsearch 是如何实现 master 选举的
前置条件:
(1)只有候选主节点(master:true)的节点才能成为主节点。
(2)最小主节点数(min_master_nodes)的目的是防止脑裂。
实现步骤
第一步:确认候选主节点数达标,就是我们在Es.yml 设置的值
第二步:比较:先判定是否具备 master 资格,具备候选主节点资格的优先返回;
若两节点都为候选主节点,则 id 小的值会主节点。注意这里的 id 为 string 类型。
补充:master 节点的职责主要包括集群、节点和索引的管理,不负责文档级
别的管理;data 节点可以关闭 http 功能。
6.详细描述一下 Elasticsearch 索引文档的过程
这里的索引文档应该理解为文档写入 ES,创建索引的过程
第一步:客户从集群某节点写入数据,发送请求。(如果没有指定路由/协调节点,
请求的节点扮演路由节点的角色。)
第二步:节点 1 接受到请求后,使用文档_id 来确定文档属于分片 0。而分片0属于节点3,请求会被转到节点 3。分片 0 的主分片也分配到节点 3 上;
第三步:节点 3 在主分片上执行写操作,成功后将请求并行转发到节点1和节点 2 的副本分片上。所有的副本分片都报告成功,节点3将向协调节点(节点 1)报告成功,节点 1 向请求客户端报告写入成功。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
如果面试官再问:第二步中的文档获取分片的过程?
回答:借助路由算法获取,路由算法就是根据路由和文档 id 计算目标的分片id
7、Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法
1、关闭缓存 swap;
2、堆内存设置为:Min(节.点内存/2, 32GB);
3、设置最大文件句柄数;
8、lucence 内部结构是什么(待补充)
lucence 的核心分为:索引创建,索引搜索;
9、Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个 master,另外 10 个选了另一个 master,怎么办?
这个主要是会涉及到脑裂的问题。
1、当集群 master 候选数量大于等于 3 个时,可以通过设置最少投票通过数量
(discovery.zen.minimum_master_nodes)超过所有候选节点一半以上来解
决脑裂问题;
2、当候选数量为两个时,只能修改其中一个为master 候选,其他作为 data
节点,避免脑裂问题
10、客户端在和ES集群连接时,如何选择特定的节点执行请求的?
客户端是通过transport 模块远程连接一个 elasticsearch 集群。它并不加入到集群中,只是简单的获得一个或者多个初始化的 transport 地址,并以 轮询 的方式与这些地址进行通信。
11.详细描述一下 Elasticsearch 更新和删除文档的过程
删除和更新也都是写操作,但是 Elasticsearch 中的文档是不可变的,因此不能被删除或者改动。我们在执行删除的时候,其实不是真正的删除了这个文档,因为磁盘上每一个段都有一个.del文件,删除的时候会把文档 在.del文件标记为已删除,但是在匹配查询的时候依旧能匹配到,只是会在结果中把它过滤掉。更新也是一样的,也会把旧的文档在.del文件中标记为已删除,但是查询结果中也是能查到,只是在结果中会把标记了已删除的文件过滤掉。
12.详细描述一下 Elasticsearch 搜索的过程
在搜索的时候,因为我们不知道对应的查询会在哪些文档里命中,所以我们查询索引中所有的分片。由于数据在每个分片中的排列并不等于在整个索引中的排列,因此有了如下两个阶段:查询阶段和取回阶段(query then fetch),客户端发送请求到某一个节点,这个节点会根据文档id去匹配所有相应的分片并给每一个分片发送请求,接着会进行取回操作,所有分片查询完后把结果返回到这个节点进行整理,最后返回给客户端查询结果。
13.在 Elasticsearch 中,是怎么根据一个词找到对应的倒排索引的?
首先我们应该了解一下什么是倒排索引,倒排索引就是通过分词策略把分词和文章形成一个关系映射表,这种词典和映射表的方式就是我们的倒排索引,所以当我们去检索一个词语的时候,会根据文档id去整个索引库中去查询到匹配的索引,然后返回给客户端。
14、对于 GC 方面,在使用 Elasticsearch 时要注意什么?
了解了JVM后再来~
15.Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?
Elasticsearch 提供的首个近似聚合是 cardinality 度量。它提供一个字段的基数,即该字段的 distinct 或者 unique 值的数目。它是基于HLL算法的。HLL 会先对我们的输入作哈希运算,然后根据哈希运算的结果中的bits做概率估算从而得到基数。
16、在并发情况下,Elasticsearch 如果保证读写一致?
1、可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;
2、另外对于写操作,一致性级别 默认是只有当大多数分片可用时才允许写操作。如果因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。
3、对于读操作,可以通过设置 replication 保证操作在主分片和副本分片都完成后才会返回;也可以通过设置搜索请求参数来查询主分片,确保文档是最新版本。
网友评论