当前位置: 首页 > 科技观察

程序猿面试,Elasticsearch被虐……

时间:2023-03-18 19:38:58 科技观察

本文转载自微信公众号《小明菜市场》,作者小明菜市场。转载本文请联系小明菜市场公众号。Java相关问题:Elasticsearch使用ES_JAVA_OPTS环境变量配置JVM。比较常用的配置有Xms、最小堆内存、Xmx、最大堆内存。设置的建议是什么?答:这两个值最好的做法是把2g换成使用物理机或者虚拟机的一半内存分布式相关问题:分布式一般用多少个节点:答:一半分布式使用奇数节点数,因为如果我们的集群中有三个节点,ABC,如果A和B,C断开了,那么B和C会发现无法连接到A,就会把A标记为断开,并且他们可以选出新的master节点,所以分布式系统一般采用2n+1wheren>0节点,在生产系统中,最少3个节点。集群健康集群健康分为分片健康、索引健康和集群健康。指标分为三个级别:绿色、黄色和红色。Shardhealthred:至少有一个主分片没有分配。黄色:至少有一个副本分配尚未分配。绿色:主分片和次分片都正常分配。索引运行状况索引运行状况是该分片中最差的运行状况。集群健康集群健康是该集群上索引的最差健康状况。健康相关APIGET/_cluster/health获取集群的健康状态GET/_cluster/health?level=indices获取所有索引的健康状态GET/_cluster/health/获取单个索引的健康状态GET/_cluster/allocation/explain返回第一个未分配分片的原因集群不健康排查流程节点下线后,可能会因为节点数不足导致分片分配不上。在这种情况下,需要添加新的分片进行重新分配。索引配置错误,分片规则配置错误,导致分配失败。这时候需要重新配置索引,重新配置分片。磁盘空间不足:当磁盘空间不足时,也可能分配失败。这时候需要重新分配新的磁盘空间。出现的错误是DANGLING_INDEX_IMPORTE,当出现EXISTING_INDEX_RESTORED错误时,索引被关闭,需要删除和恢复索引。节点诊断节点诊断APIGET/_cat/nodes?v查看节点基本信息,即负载状态GET/_nodes/stats/indices查看节点索引详情POST/_cache/clear清除节点缓存节点内存问题Elasticserach集群可能导致长期GC集群变慢,产生OOM,甚至离线。这个时候就需要诊断了。一般有以下几种情况会导致节点内存OOM缓存占用过多内存。大量复杂的嵌套聚合可能导致频繁的GC有时需要配置一个断路器来限制请求的查询,以避免大量OOMShardElasticsearch将一个索引划分到多个分片存储。一般建议单个shard的大小为20G到50G。一般搜索数据控制在20G,日志数据50G,每个节点数据2T。相关APIGET/_cat/shards/查看Shard信息POST//_rollover/当索引满足一定条件(如数据量过大)时,会自动切换到一个新索引,非常适合不可用时序索引预估大小POST//_forcemerge强制合并索引数据POST//_shrink/创建新索引,减少主分片数POST//_split/创建新索引,增加primaryshards个数POST/_reindex重建索引深度分页分页有3种方式from+sizefrom定义数据偏移量,size定义获取的数据量,类似于sql的offset和limit。滚动APIscroll类似于SQL游标。查询时指定使用scroll=time参数,返回结果带scroll_id。您只需要在下一个查询中指定scroll_id即可。POST//_search?scroll=1m{"size":100,"query":{"match":{"title":"elasticsearch"}}}POST/_search/scroll{"scroll":"1m","scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="}SearchAfterAPISearchAfterAPI作为上一个结果作为下一个查询条件,在查询权重中使用search_after参数。示例如下:GET/_search{"size":10,"query":{"match":{"title":"elasticsearch"}},"search_after":[1463538857,"654323"],"sort":[{"date":"asc"},{"_id":"asc"}]}