一次关于etcd故障处理

现象

  • 任务下发配置不成功

链路整理

  • web -> 服务端放参数至 -> etcdserver -> 远程机接收参数信息 -> 远程机执行命令

问题解决

  • 第一波观察日志未果

  • 怀疑证书问题,因为项目已经5年过去了,当时生成etcd证书确实使用了默认5年的配置,先把etcd证书更新了一版本,生成方法

https://github.com/coreos/docs/blob/master/os/generate-self-signed-certificates.md
  • 生成证书各端更新完后,etcd本身检查没有问题,发现服务端日志里面存在异常
2021-12-15T21:51:06.710+0800    ERROR   node/server.go:57       context deadline exceeded
vendor/go.uber.org/zap.Stack
        /var/lib/workspace/cronsun/qstack/cronsun/src/vendor/go.uber.org/zap/field.go:191
vendor/go.uber.org/zap.(*Logger).check
        /var/lib/workspace/cronsun/qstack/cronsun/src/vendor/go.uber.org/zap/logger.go:301
vendor/go.uber.org/zap.(*Logger).Check
        /var/lib/workspace/cronsun/qstack/cronsun/src/vendor/go.uber.org/zap/logger.go:172
vendor/go.uber.org/zap.(*SugaredLogger).log
        /var/lib/workspace/cronsun/qstack/cronsun/src/vendor/go.uber.org/zap/sugar.go:233
vendor/go.uber.org/zap.(*SugaredLogger).Errorf
        /var/lib/workspace/cronsun/qstack/cronsun/src/vendor/go.uber.org/zap/sugar.go:148
github.com/shunfei/cronsun/log.Errorf
        /var/lib/workspace/cronsun/qstack/cronsun/src/github.com/shunfei/cronsun/log/log.go:39
main.main	

查询发现,etcd 3.3版本升级完证书存在问题,需要升级etcd到3.4版本,想想算了,证书过期了,还可以使用,将就一下

https://github.com/sensu/sensu-go/issues/3792

观察日志发现存在如下异常

2021-12-15T22:01:39.392+0800    WARN    cronsun/job.go:460      GetJobs get etcd error rpc error: code = ResourceExhausted desc = grpc: received message larger than max (4206331 vs. 4194304)
2021-12-15T22:01:39.392+0800    WARN    node/node.go:131        load jobs get jobs err rpc error: code = ResourceExhausted desc = grpc: received message larger than max (4206331 vs. 4194304)

etcd server当中存在起过4M的消息,而client无法消费,可以通过设置:MaxCallRecvMsgSize来实现;查看client.Config发现由于项目太老,文件缺少这两个参数,项目本身还使用govendor维护,而前人已经离职不知去向。

将代码下载下来,使用govendor fetch github.com/coreos/etcd/clientv3无效

于是粗暴一点,直接下载etcd源码,切换至git checkout v3.3.0-rc.4版本(由于etcd server使用的也是3.3.0,所以不敢升级太高版本),将源码copyvendor/github.com/coreos/目录下,重新编译,失败;

异常如下:

/private/tmp/qstack/cronsun/src/vendor/golang.org/x/net/http2/frame.go use of vendored package not allowed

查看官网源码,得知,x/net包已经使用了gomod,https://cs.opensource.google/go/x/net/+/master:go.mod,当前编译环境go version1.16`

重新下载golang 1.11配置GOPATH编译通过,发版重启后服务正常运行;

总结

  • etcd本身代码存在许多的问题,包括证书、包管理等,使用时需要情重,最好使用新版本来解决;
  • govendor的项目最好能升级至gomod,否则会给别人留下许多的坑
  • 业务有时也需要备用方案