7、Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法
面试官:想了解对 ES 集群的运维能力。
解答:
1、关闭缓存 swap;
2、堆内存设置为:Min(节点内存/2, 32GB);
3、设置最大文件句柄数;
4、线程池+队列大小根据业务需要做调整;
5、磁盘存储 raid 方式——存储有条件使用 RAID10,增加单节点性能以及避免单
节点存储故障。
8、lucence 内部结构是什么?
面试官:想了解你的知识面的广度和深度。
解答:
第 88 页 共 485 页Lucene 是有索引和搜索的两个过程,包含索引创建,索引,搜索三个要点。可以
基于这个脉络展开一些。
最近面试一些公司,被问到的关于 Elasticsearch 和搜索引擎相关的问题,以及自
己总结的回答。
9、Elasticsearch 是如何实现 Master 选举的?
1、Elasticsearch 的选主是 ZenDiscovery 模块负责的,主要包含 Ping(节点之
间通过这个 RPC 来发现彼此)和 Unicast(单播模块包含一个主机列表以控制哪
些节点需要 ping 通)这两部分;
第 89 页 共 485 页2、对所有可以成为 master 的节点(node.master: true)根据 nodeId 字典排
序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第 0 位)
节点,暂且认为它是 master 节点。
3、如果对某个节点的投票数达到一定的值(可以成为 master 节点数 n/2+1)并
且该节点自己也选举自己,那这个节点就是 master。否则重新选举一直到满足上
述条件。
4、补充:master 节点的职责主要包括集群、节点和索引的管理,不负责文档级
别的管理;data 节点可以关闭 http 功能*。
10、Elasticsearch 中的节点(比如共 20 个),其中的 10 个
选了一个 master,另外 10 个选了另一个 master,怎么办?
1、当集群 master 候选数量不小于 3 个时,可以通过设置最少投票通过数量
(discovery.zen.minimum_master_nodes)超过所有候选节点一半以上来解
决脑裂问题;
2、当候选数量为两个时,只能修改为唯一的一个 master 候选,其他作为 data
节点,避免脑裂问题。
11、客户端在和集群连接时,如何选择特定的节点执行请求的?
1、TransportClient 利用 transport 模块远程连接一个 elasticsearch 集群。它并
不加入到集群中,只是简单的获得一个或者多个初始化的 transport 地址,并以 轮
询 的方式与这些地址进行通信。
12、详细描述一下 Elasticsearch 索引文档的过程。
第 90 页 共 485 页协调节点默认使用文档 ID 参与计算(也支持通过 routing),以便为路由提供合
适的分片。
shard = hash(document_id) % (num_of_primary_shards)
1、当分片所在的节点接收到来自协调节点的请求后,会将请求写入到 Memory
Buffer,然后定时(默认是每隔 1 秒)写入到 Filesystem Cache,这个从 Momery
Buffer 到 Filesystem Cache 的过程就叫做 refresh;
2、当然在某些情况下,存在 Momery Buffer 和 Filesystem Cache 的数据可能会
丢失,ES 是通过 translog 的机制来保证数据的可靠性的。其实现机制是接收到请
求后,同时也会写入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中
时,才会清除掉,这个过程叫做 flush;
3、在 flush 过程中,内存中的缓冲将被清除,内容被写入一个新段,段的 fsync
将创建一个新的提交点,并将内容刷新到磁盘,旧的 translog 将被删除并开始一
个新的 translog。
4、flush 触发的时机是定时触发(默认 30 分钟)或者 translog 变得太大(默认
为 512M)时;
第 91 页 共 485 页补充:关于 Lucene 的 Segement:
1、Lucene 索引是由多个段组成,段本身是一个功能齐全的倒排索引。
2、段是不可变的,允许 Lucene 将新的文档增量地添加到索引中,而不用从头重
建索引。
3、对于每一个搜索请求而言,索引中的所有段都会被搜索,并且每个段会消耗
CPU 的时钟周、文件句柄和内存。这意味着段的数量越多,搜索性能会越低。
4、为了解决这个问题,Elasticsearch 会合并小段到一个较大的段,提交新的合并
段到磁盘,并删除那些旧的小段。