您的位置:首页 > 产品设计 > UI/UE

The event in requested index is outdated and cleared (the requested history has been cleared ) 问题和修复

2017-06-02 11:21 2496 查看
现象

etcd高负载时客户端 watch etcd 返回401

报错如下:ERROR: watch error 401: The event in requested index is outdated and cleared (the requested history has been cleared [15047837/15040498]) [15048836]

此时etcd 会断开客户端 的watcher,index 从上次断开前的modifyIndex到重新watch起来的latestIndex之间的事件会丢失掉,造成线上变更丢失现象。

原因分析

原理层面

etcd只保留所有etcd键中最近的1000个事件的响应,当watch的起始index值不在最近的这1000个就会报上述index过期错误

代码层面:

go-etcd client中的watchOnce每获得一个事件就会从当前事件的modifyIndex + 1 重新watch

在处理watch事件时没有采用异步的方式,这样watch会阻塞住直到响应处理结束,当集群负载较大或者相应处理时间较长时modifyIndex + 1可能会不在最新的1000个index中,出现上述index过期的现象

优化方案

两点思路:

处理事件的函数改成异步方式,这样就不会block etcd watch,预期可以显著减小变更丢失现象

感知到事件后,采用get方式获取事件,不完全依赖于watch的结果,这样虽然不主观上避免index过期的现象,但是可以完全补偿变更丢失掉的事件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐