文章目录
1、为什么要使用Elasticsearch?
系统中的数据,随着业务的发展,时间的推移,将会非常多,而业务中往往采用模糊查询进行数据的搜索,而模糊查询会导致查询引擎放弃索引,导致系统查询数据时都是全表扫描,在百万级别的数据库中,查询效率是非常低下的,而我们使用ES做一个全文索引,将经常查询的系统功能的某些字段,比如说电商系统的商品表中商品名,描述、价格还有id这些字段我们放入ES索引库里,可以提高查询速度。
2、 Elasticsearch的master选举流程?
-
Elasticsearch 的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping 通)这两部分
-
对所有可以成为master 的节点(node.master: true)根据nodeld,字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第О位〉节点,暂且认为它是master节点。
-
如果对某个节点的投票致达到一定的值(可以成为master节点数n2+1)并且该节点自己也选举自己,
那这个节点就是master。否则重新选举一直到满足上述条件。 -
master节点的职责主要包括集群、节点和索引的管理,不负责文档级别的管理; data节点可以关闭http.
功能。
3、 Elasticsearch集群脑裂问题?“脑裂”问题可能的成因?
- 网络问题:集群间的网络延迟导致一些节点访问不到master,认为master 挂掉了从而选举出新的master,并对master 上的分片和副本标红,分配新的主分片
- 节点负载:主节点的角色既为master 又为data,访问量较大时可能会导致ES停止响应造成大面积延迟,此时其他节点得不到主节点的响应认为主节点挂掉了,会重新选取主节点。
- 内存回收: data节点上的ES进程占用的内存较大,引发JVM的大规模内存回收,造成ES进程失去响应。
脑裂问题解决方案:
- 减少误判:discovery.zen.ping_timeout节点状态的响应时间,默认为3s,可以适当调大,如果 master
在该响应时间的范围内没有做出响应应答,判断该节点已经挂掉了。调大参数(如6s ,
discovery.zen.ping_timeout:6),可适当减少误判。 - 选举触发: discovery.zen.minimum_master_nodes:1
该参数是用于控制选举行为发生的最小集群主节点数量。当备选主节点的个数大于等于该参数的值,
且备选主节点中有该参数个节点认为主节点挂了,进行选举。官方建议为(n/2)+1,n为主节点个数(即有资格成为主节点的节点个数) - 角色分离:即master节点与data节点分离,限制角色
主节点配置为: node.master: true node.data: false
从节点配置为: node.master: false node.data: true
4、Elasticsearch在部署时,对Linux 的设置有哪些优化方法?
-
64 GB 内存的机器是非常理想的,但是32GB 和16 GB机器也是很常见的。少于8 GB会适得其反。
如果你要在更快的CPUs和更多的核心之间选择,选择更多的核心更好。多个内核提供的额外并发远胜过稍微快一点点的时钟频率。 -
如果你负担得起SSD,它将远远超出任何旋转介质。基于SSD的节点,
查询和索引性能都有提升。
如果你负担得起,SSD是一个好的选择。 -
即使数据中心们近在咫尺,也要避免集群跨越多个数据中心。绝对要避免集群跨越大的地理距离。
-
请确保运行你应用程序的JVM和服务器的JVM是完全一样的。在Elasticsearch 的几个地方,使用Java的本地序列化。
-
通过设置gateway.recover_after_nodes、gateway.expected_nodes、gateway.recover_after_time可以在集群重启的时候避免过多的分片交换,这可能会让数据恢复从数个小时缩短为几秒钟。
-
Elasticsearch 默认被配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的
节点才会自动组成集群。最好使用单播代替组播。
5、在并发情况下,Elasticsearch 如果保证读写一致?
- 可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;
- 另外对于写操作,一致性级别支持quorum/one/all,默认为quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。
- 对于读操作,可以设置replication 为 syne(默认),这使得操作在主分片和副本分片都完成后才会返回;
如果设置 replication为 async时,也可以通过设置搜索请求参数_preference为 primary来查询主分片,确保文档是最新版本。
6、如何监控Elasticsearch集群状态?
elasticsearch-head,插件
通过Kibana监控Elasticsearch。你可以实时查看你的集群健康状态和性能,也可以分析过去的集群、索引和节点指标
7、Elasticsearch中的倒排索引是什么?
倒排索引是搜索引擎的核心。搜索引擎的主要目标是在查找发生搜索条件的文档时提供快速搜索。ES中的倒排索引其实就是lucene.的倒排索引,区别于传统的正向索引,倒排索引会再存储数据时将关键词和数据进行关联,保存到倒排表中,然后查询时,将查询内容进行分词后在倒排表中进行查询,最后匹配数据即可。