elasticsearch虽然我们大家都在用。但是我们在面试的时候,还是会遇到很多同学只会简单的curd对es进行操作,其他的东西不了解,那么生产上出现问题,改如何解决呢?大家是不是就丈二和尚摸不着头脑了。所以这篇文章我们介绍下,生产上的es出现了问题,我们该如何查。
一、生产上索引数据的时候比较慢,怎么办?
先说下索引的过程:
1、client发起请求。
2、此请求随机分布到node2节点。
3、node2节点根据hash路由,找到数据应该被写入的shard分片主机 node1上。
4、node2将请求发送给node1
5、node1节点把数据写入成功,然后把写入副本的请求发送给node2节点
6、node2节点副本写成功,放ack消息给node1的主分片。
7、node1主分片节点返回ack信息给node2节点
8、node2节点将信息返回给client。
再说下写索引的时候elasticsearch的流程
1、写数据的客户端发起请求。
2、数据首先被写入memory buffer 和tanslog buffer
3、等待服务器进行refresh操作,此时数据会被存储到filsystem cache 即操作系统内存中。 这里的refresh可以进行配置,默认为1s刷新一次
4、filesystem cache里面的数据被flush到磁盘中。这里也是可以直接配置的。
生产上我们使用api进行索引的时候经常会遇到索引慢的问题,每一个同步的请求等了很久才返回,这个时候我们应该核查哪些指标呢?下面列举下:
索引指标 | 名称 | 衡量 |
索引的文件总数 | indices.indexing.index_total | 吞吐量 |
索引文档总时间 | indices.indexing.index_time_in_millis | 性能 |
目前索引的文件数量 | indices.indexing.index_current | 吞吐量 |
索引刷新总数 | indices.refresh.total | 吞吐量 |
刷新指数的总时间 | indices.refresh.total_time_in_millis | 性能 |
索引刷新总数到磁盘 | indices.flush.total | 吞吐量 |
将索引刷新到磁盘上的总时间 | indices.flush.total_time_in_millis | 性能 |
二、生产上查询数据的时候比较慢,怎么办?
先说下整个查询过程:
1、client发起请求
2、请求随机分布到node2节点。
3、node2节点根据路由信息,查询所有分片所在的服务器(主分片或者副本分片)信息。
4、node2节点把请求转发给路由的主分片或者副本分片所在的服务器
5、各服务器进行内部查询,把结果返回给node2节点。
6、node2节点根据规则进行过滤排序,取出size条信息。
7、node2根据取出的size条信息,把docid发给所有的分片服务器(主分片或者副本分片)。
8、各服务器把document返回给node2服务器。
9、node2服务器把数据返回给client
生产上我们使用api进行查询的时候经常会遇到查询慢的问题,查询一个结果,等了很久才返回,这个时候我们应该核查哪些指标呢?下面列举下:
查询指标 | 名称 | 衡量 |
查询总数 | indices.search.query_total | 吞吐量 |
查询总时间 | indices.search.query_time_in_millis | 性能 |
当前正在进行的查询数量 | indices.search.query_current | 吞吐量 |
提取总数 | indices.search.fetch_total | 吞吐量 |
花费在提取上的总时间 | indices.search.fetch_time_in_millis | 性能 |
当前正在进行的提取数 | indices.search.fetch_current | 吞吐量 |
上面主要介绍了一下索引和查询的时候,主要查看的一些指标,但是在分析线上的索引或者查询的问题的时候,我们还要从下面这些维度进行分析:
1)集群健康和节点可用性
需要时刻观察集群中的整个集群节点的健康性和可用性。这个我们从head插件就能看得出来,例如:集群节点状态(红色,绿色,黄色),节点的数量,分片数量,分片大小,副本分片的政策性。
2)内存刷新和flush磁盘的配置
需要检查下配置中内存刷新的机制和flush磁盘的配置间隔等,在频繁索引的时候,可以适当增大一下flush和刷内存的时间间隔。
3)查看内存使用和垃圾回收的情况
elasticsearch是java编写的,所以对于内存的使用还有垃圾回收需要敏感一点。时刻通过监控进行观察elasticsearch集群中内存的使用情况和垃圾回收情况。及时做相关的调整。
4)观察服务器的使用情况
elasticsearch的集群节点都是部署在服务器上的,对于内存的话,我们一般要求xms,xmx配置为服务器的内存一半,剩余一半留给lucene和服务器的其他程序。但是这个一半不是绝对的追求。我们线上的服务器是64G内存的,我们的xms和xmx配置的是26G。
同时在集群可用的情况下,我们还要观察磁盘空间的利用率,磁盘I/O利用率,服务器CPU使用率,服务器出入网带宽使用情况。文件打开数量等。
还没有评论,来说两句吧...