3节点Elasticsearch集群偶发READTIMEOUT异常原因咨询
问题原因分析
首先明确Elasticsearch集群的高可用是集群侧的容灾能力,保障单节点故障时集群整体可正常服务、数据不丢失,但该能力需要客户端配合正确的故障转移配置才能生效,该问题的具体产生原因如下:
- 重试机制被强制关闭:配置中
max_retries被设为0,elasticsearch-dsl底层依赖的elasticsearch-py客户端,默认只有max_retries大于0时,才会在遇到连接超时、读超时这类可重试异常时,自动切换其他可用节点重试请求。设置为0时,只要当前请求选中的节点响应失败,会直接抛出异常,不会触发任何故障转移逻辑,哪怕集群其余节点完全正常。 - 客户端节点健康探测存在滞后性:默认Elasticsearch Python客户端不会实时检测节点可用性,采用失败计数的方式标记节点下线,如果某节点仅出现偶发超时(比如单次网络抖动、临时GC停顿),客户端不会立刻将其标记为不可用,轮询时仍会将请求分配到该节点,无重试配置的情况下就会直接报错。
- 请求本身性能瓶颈触发超时:配置的读超时为10秒,如果触发超时的请求本身是大体积批量写入、大范围聚合查询、未加合适索引的慢查询,本身处理耗时就接近或超过10秒,刚好该请求被分配到hostname2节点时就会触发超时,这类场景和集群高可用无关,属于请求本身的性能问题。
- 单节点偶发性能异常:即便集群整体状态正常,也可能出现单节点临时性能抖动,比如hostname2节点出现JVM Full GC、CPU被其他进程占满、磁盘IO飙升、网络临时丢包,都会导致该节点无法及时响应请求,此时如果请求刚好发到该节点且无重试配置,就会抛出超时异常。
内容的提问来源于stack exchange,提问作者MaZaN
相关产品推荐
相关产品推荐

