1、节点失去领导者
{"level":"info","ts":"2024-05-07T01:54:04.948Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"raft.node: 9afce9447872453 lost leader 5ee9c643fc08f96b at term 52"}
这条日志表明节点 9afce9447872453 丢失了它的leader 5ee9c643fc08f96b,这通常发生在领导者无法响应其他节点的心跳或请求时。
etcd可能在以下情况下失去leader:
-
网络分区:当etcd集群中的节点因为网络问题被分割成两个或多个分区,且其中一个分区没有包含多数节点时,这个分区中的leader会失去其领导地位,因为无法获得足够多的节点来达成共识。
-
磁盘性能问题:如果etcd节点的磁盘性能不足,导致
fdatasync
操作缓慢,超过etcd follower的选举超时时间(election timeout,默认1000ms),则其他节点会开始新一轮的leader选举。 -
节点故障:etcd集群中的leader节点如果发生故障,比如服务器崩溃或软件故障,那么集群会检测到该故障并开始新的leader选举。
-
心跳机制失效:Raft通过心跳机制来维持leader的地位。如果leader节点无法定期发送心跳给follower节点,follower节点在选举超时后会发起新的leader选举。
-
集群配置错误:集群配置错误,如节点间无法相互通信,也可能导致leader选举失败或leader丢失。
-
集群成员变更:在添加或移除集群成员时,如果操作不当,可能会导致leader失去其地位。
-
数据损坏:如果etcd的数据损坏,可能会导致集群无法正常工作,执行etcdctl命令失败,需要进行集群恢复操作。
-
大于n/2个节点故障:如果集群中超过一半的节点发生故障,那么集群将无法正常工作,leader也会失去其地位。
2、开始新的选举
{"level":"info","ts":"2024-05-07T01:54:04.948Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"9afce9447872453 is starting a new election at term 52"}
由于丢失了领导者,节点 9afce9447872453 开始了一个新的选举过程。在 Raft 协议中,选举过程包括预投票(PreVote)和投票(Vote)阶段。
3、节点成为候选者
{"level":"info","ts":"2024-05-07T01:54:04.948Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"9afce9447872453 became pre-candidate at term 52"}
节点 9afce9447872453 成为了一个预候选者(pre-candidate),这是选举过程的第一步,节点会请求其他节点的预投票。
4、发送预投票请求
{"level":"info","ts":"2024-05-07T01:54:04.948Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"9afce9447872453 [logterm: 52, index: 456617084] sent MsgPreVote request to 2fa50bf947c1df3a at term 52"}
节点 9afce9447872453 向另一个节点 2fa50bf947c1df3a 发送了一个预投票请求。这是为了确认是否有其他节点已经在一个更高的任期(term)上。
5、接收预投票响应
{"level":"info","ts":"2024-05-07T01:54:04.948Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"9afce9447872453 received MsgPreVoteResp from 9afce9447872453 at term 52"}
节点 9afce9447872453 接收到了它自己的预投票响应,这是预投票过程的一部分。
6.选举超时
{"level":"warn","ts":"2024-05-07T01:54:17.333Z","caller":"etcdserver/v3_server.go:852","msg":"timed out waiting for read index response (local node might have slow network)","timeout":"7s"}
这个警告表明在尝试进行线性化读取时,节点在等待 ReadIndex 响应时超时了。这可能是由于网络问题导致的通信延迟,也可能是由于节点性能问题。
7.健康检查失败
{"level":"warn","ts":"2024-05-07T01:54:17.332Z","caller":"etcdhttp/metrics.go:173","msg":"serving /health false; no leader"}
这条日志表明 etcd 集群的健康状况检查失败,原因是没有领导者。这通常意味着集群无法处理请求,直到新的领导者被选举出来。
8、快照丢失,数据损坏
recovering backend from snapshot error:database snapshot file path error:snap:snatshot file doesn't exists
从日志可以看出是etcd数据丢失导致节点etcd无法正常启动,基本就可以确定是snap文件损坏,或者遗失了,需要针对报错节点做数据恢复,参考:etcd常见运维事件-CSDN博客