每个节点只会监控它后面的2个节点是否发生错误

会 根据心跳的历史记录以及当前的心跳信息计算出某个节点可用的可能性。Akka 会依照这 些数据和配置的容错限制得到计算结果,然后将节点标记为可用或不可用。

gossip协议达到最终一致性:

集群中的每个节点和它的邻居节点交换已知的状态。接着,这些邻居节点再将已知状态传递给它们的“邻居”,以此往复,直到某个节点的状态传递给了集群中的所有成员

如果某个节点被另一个节点访问,那么集群中的所有节点都会认为这个节点不可用

这种最终把状态传递给整个集群的机制叫做 gossip 协议或是 epidemic 协议。

读数据时,数据会被写入到第一个节点,并被复制到其余两个节点,无论写入哪个节点,该节点都会负责把数据同步到其他节点,故读数据只需要访问一个节点就可以了。只要成功连接任一节点,那么任何节点加入或离开集群时便不需要改配置

Akka Cluster构建系统

新节点加入集群会尝试连接第一个种子节点,若连接成功,新节点会发布其地址(主机和端口)。种子节点会通过gossip协议将新节点的地址通知整个集群。第一个节点连接失败依次往下再寻找连接

部署到生产环境,至少要有两个固定IP的种子节点,并保证任何时候都至少有一个节点可用,若任何节点都无法访问,则无法加入集群

订阅集群事件:

首先定义一个Logger,然后获取指向 Cluster 对象的引用。使用Actor 的preStart 和postStop 方法来订阅感兴趣的事件,要记得在postStop 方法 中调用 unsubscribe ,防止泄露。

Actor订阅的事件:

UnreachableMember :该事件会在某个节点被标记为不可用时发出通知

优雅的退出集群:

通过杀死kill进程来关闭某个节点,Akka会把这个节点标记为不可达,并输出错误信息,关闭节点会导致改节点无法访问,所有移除节点前要通知集群。

集群成员状态:

排序列表第一个节点必须是Leader节点,且Leader节点对加入和离开集群的请求做出响应,并修改集群成员状态 MemberStatus

在加入集群时,将要加入的节点会将其状态设为 Joining 。Leader 节点会做出响应, 将其状态改为 Up 。同样地,如果一个节点将状态设置为 Leaving ,那么 leader 节点会 做出响应,先将其状态改为 Exiting ,然后再改成 Removed 。所有这些状态改变都是通 过 MemberEvent 在集群间发送的,我们订阅的就是 MemberEvent ,并在发生该事件时 输出日志。

失败检测:

节点被检测不可达时会被标记为MemberUnreachable, 在 ClusterController 中订阅这个事件,这样每次标记 MemberUnreachable 的时候就能收到通知。如果在合理的时间段内该节点又重新变得可 达,那么该节点就会重新运行。如果在配置的时间内始终不可到达,那么 leader 节点就 会将该节点标记为 Down ,该节点将无法重新加入集群。