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

  1. 现象
    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之间的事件会丢失掉,造成线上变更丢失现象。
  2. 原因分析

    • 原理层面
      etcd只保留所有etcd键中最近的1000个事件的响应,当watch的起始index值不在最近的这1000个就会报上述index过期错误
    • 代码层面:
      go-etcd client中的watchOnce每获得一个事件就会从当前事件的modifyIndex + 1 重新watch
      在处理watch事件时没有采用异步的方式,这样watch会阻塞住直到响应处理结束,当集群负载较大或者相应处理时间较长时modifyIndex + 1可能会不在最新的1000个index中,出现上述index过期的现象
  3. 优化方案

    两点思路:

    • 处理事件的函数改成异步方式,这样就不会block etcd watch,预期可以显著减小变更丢失现象
    • 感知到事件后,采用get方式获取事件,不完全依赖于watch的结果,这样虽然不主观上避免index过期的现象,但是可以完全补偿变更丢失掉的事件
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值