ETCD Cluster getting rpc error: code = DeadlineExceeded desc = context deadline exceeded

ETCD Cluster getting rpc error: code = DeadlineExceeded desc = context deadline exceeded

只是在这里寻找一些说明 我有一个 2 节点 etcd 集群:

master01=http://10.1.1.21:2379,master02=http://10.1.1.22:2379

全部 运行 很好。 如果我登录到 master01 并执行以下操作:

etcdctl --cluster=true endpoint health

我得到了很好的回应:

http://10.1.1.21:2379 is healthy: successfully committed proposal: took = 25.628392ms
http://10.1.1.22:2379 is healthy: successfully committed proposal: took = 42.98645ms

所有操作 get、put 都是 运行 预期的。

ETCDCTL_API=3 etcdctl --endpoints=http://10.1.1.21:2379,http://10.1.1.22:2379 get date

当我删除其中一个节点时,问题就开始了,所以如果我杀死一个节点,我现在会得到错误而不是结果,例如:

ETCDCTL_API=3 etcdctl --endpoints=http://10.1.1.21:2379,http://10.1.1.22:2379 get date
{"level":"warn","ts":"2021-09-09T08:58:22.175Z","logger":"etcd-client","caller":"v3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0000e0a80/#initially=[http://10.1.1.21:2379;http://10.1.1.22:2379]","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = context deadline exceeded"}
Error: context deadline exceeded

在这种情况下我杀死了master01,我做错了什么吗?

一个 etcd 集群需要大多数节点,一个法定人数,来就集群状态的更新达成一致。对于有 n 个成员的集群,法定人数为 (n/2)+1。对于任何奇数大小的集群,添加一个节点总是会增加仲裁所需的节点数。虽然将节点添加到奇数大小的集群看起来更好,因为有更多的机器,但容错性更差,因为完全相同数量的节点可能会失败而不会丢失仲裁,但有更多的节点可能会失败。如果集群处于无法容忍更多故障的状态,则在删除节点之前添加节点是危险的,因为如果新节点无法在集群中注册(例如,地址配置错误),仲裁将永久丢失.

因此,在您的情况下,两个 etcd 节点提供与一个相同的冗余,因此始终建议使用奇数个 etcd 节点。 code = DeadlineExceeded desc = context deadline exceeded 表示客户端无法访问 etcd 服务器并且超时。因此,您可能会尝试连接到已关闭的 etcd 服务器,结果您会看到错误。请参考以下文档了解更多

ETDC FALUT TOLERANCE TABLE