横向扩展——集群化

1.集群的定义
集群就是一组可以互相通信的服务器。集群中的每台服务器成为一个节点或成员。 集群可以动态修改大小,并且在发生错误情况时继续运行,把影响降到最低。所以集群 需要具备两个功能:失败发现以及使得集群中的所有成员最终能够提供一致的视图。

2.在 Akka Cluster 中,每个节点监控的最大节点数默认是 5 个节点。
Akka 中,失败检测是通过在节点间发送心跳消息并接收响应来完成的。
这种最终把状态传递给整个集群的机制叫做 gossip 协议或是 epidemic 协议(因为信 息在集群中的传播就像病毒一样!)

3.CAP理论
C-一致性、A-可用性、P-分区容错性
CAP理论中的妥协:在一致性、可用性和分区容错性这三个特性中,一个 分布式系统只能够选择满足其中两个。
一致性优先:例子也许有一个 master 节点和任意数量包含冗余备份的附属节点。数据永远会在 master 节点写入,而如果要确保读取最新的数据,那么页必须要从 master 节点读取。
AP系统-可用性优先:写入数据时,数据会被写入到一个节点中,然后会被复制到其余几个节点,所有我们读数据的时候只要访问一个节点就够了。
灵活的一致性程度:我们可以根据具体的用例,“调整”CAP 各特性的强度,使之最适合用例的需要。 甚至可以对同一个应用程序、同一个数据库中不同类型的数据混合使用这些策略。

4.集群
(1)项目配置
首先把 Cluster 加入项目依赖;接着在 application.conf 中加入合适的配置项
(2)节点加入集群的方式
当一个新节点加 入集群时,该节点会尝试连接第一个种子节点。如果成功连接种子节点,新节点就会发布其地址(主机和端口)。种子节点会负责通过 gossip 协议将新节点的地址最终通知整个集群。如果连接第一个种子节点失败,新节点就会尝试连接第二个种子节点。只要成功连接任何一个种子节点,那么任何节点加入或离开集群时,我们都不需要对配置进行任 何修改。
部署到生产环境时,至少要定义两个固定的种子节点,如果种子节点都不可用,则新节点将无法加入集群
(3)Actor 将订阅下面两个事件:
MemberEvent :该事件会在集群状态发生变化时发出通知;
UnreachableMember:该事件会在某个节点被标记为不可用时发出通知。
(4)优雅地退出集群
如果杀死进程来关闭节点的话,Akka会将该节点标记为不可到达,输出错误信息。所有正确的方法是将节点从集群删除前,先通知集群。我们可以调用cluster.leave,传入要删除的节点的地址:
cluster.leave(self().path().address());
(5)Leader 节点会对加入和离开集群的请求做出响应,并修改集群成员的状态。
在加入集群时,将要加入的节点会将其状态设为 Joining Leader 节点会做出响应, 将其状态改为 Up 。同样地,如果一个节点将状态设置为 Leaving ,那么 leader 节点会 做出响应,先将其状态改为 Exiting ,然后再改成 Removed 。所有这些状态改变都是通 过MemberEvent 在集群间发送的,我们订阅的就是 MemberEvent ,并在发生该事件时 输出日志
(6)失败检测
若某个节点被检测到出现问题,该节点状态不会发生改变,但是会被标记为MemberUnreachable,若某个时间段内节点重新可达,则节点重新运行,配置时间内始终不可达,该节点将会被标记为 Down,并无法重新加入集群。
5. 客户端与其通信的必需条件:
(1)在服务器项目中启用集群客户端。
(2)客户端中必须包含要发送给服务的消息。
(3 ) 客户端本身不是集群成员,但是必需知道集群的拓扑结构。所以我们将使用 contrib
库中的 Akka Cluster Client
(4 )客户端必须知道要将消息发送到哪些 Actor Router ,以及由哪些 Actor Router
来响应集群事件。
6.远程 Actor 系统中的 Receptionist 可以接收一些不同的消息:
ClusterClient.Send :将消息发送至任意一个节点。
ClusterClient.SendToAll:将消息发送至集群中的所有节点。
ClusterClient.Publish:将消息发送给订阅了某个主题的所有 Actor。

你可能感兴趣的:(Akka)