Akka Cluster简介与基本环境搭建

??akka集群是高容错、去中心化、不存在单点故障以及不存在单点瓶颈的集群。它使用gossip协议通信以及具备故障自动检测功能。

Gossip收敛

??集群中每一个节点被其他节点监督(默认的最大数量为5)。集群中的节点互相监督着,某节点所监督的状态也正在被其他监督着。通过gossip协议,节点向其他节点传递自己所见节点的最新状态(Up、Joining等等),同时节点也在接收来自其他节点的信息,这些信息包括哪些节点以及这些节点对应的状态,并这些节点加入到自己的seen表里去,表示自己已经看见了这些节点的最新状态了,当所有的节点都把其他节点“看见”了后,我们可以说"Gossip收敛"完成了。

??根据以上陈述,当集群中某节点不可达(unreachable)时,gossip收敛不能完成。那些不可达的节点需要变成可达状态(reachable)或者down状态,收敛才能进行。

??akka集群不存在leader选举,但是存在leader节点,但是leader节点可以转移,leader负责执行leader action,当每次收敛完成后,leader需要做三件事:

  • 将处于joining状态节点变更为Up状态, 即joining->up
  • leaving->exiting
  • exiting->removed

failure Detector

??集群中,一个节点被其他节点监督(默认最大数量为5),任何一个节点被探测到不可达时,那么这个消息将被通过gossip协议传播到其他节点去,其他节点也将此节点标为不可达。同时故障检测机制也会将节点从不可达标记为可达,同时扩散给其他节点。

关于评判一个节点是否可达的方式是利用历史数据中每次心跳时间间隔的平均值与心跳次数为均方差去构建一个正太分布,F是这个分布的密度分布函数,利用以下公式:

phi = -log10(1 - F(timeSinceLastHeartbeat))

??phi反应了当前网络的好坏情况,当akka.cluster.failure-detector.threshold阈值配置不当时,并不是等待某个心跳检测超时时,才会把节点标记为不可达。其值默认为18,想要得到更高的灵敏度,需要把阈值设置降低。

实践

??编程方式构建集群

??akka.tcp://[email protected]:2551节点:

application.conf:

akka {
  actor {
    provider = cluster
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2551
    }
  }
  cluster {
    seed-nodes = []
  }
}
package nathan

import akka.actor.{Actor, ActorSystem, Address}
import akka.cluster.Cluster
import com.typesafe.config.ConfigFactory

object Main extends App {
  val actorSystem = ActorSystem("myCluster", ConfigFactory.load())
  Cluster(actorSystem).join(Address(protocol = "akka.tcp",system = "myCluster",host = "127.0.0.1",port = 2551))
}

??上述代码Cluster(actorSystem).join(address)是以address为基础创建集群,集群的名称为"myCluster",其中包含"akka.tcp://[email protected]:2551"的节点。集群的名称为其第一个加入的节点的名字决定,其他后加入的节点的名称应当与其保持一致。当这个单节点集群创建完毕后,这个单节点就成为seedNode,也就是说,其他节点通过向种子节点发出Join指令,就可以加入集群。

??akka.tcp://[email protected]:2552节点

application.conf

akka {
  actor {
    provider = cluster
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2552
    }
  }
}
package nathan

import akka.actor.{ActorSystem, Address}
import akka.cluster.Cluster
import com.typesafe.config.ConfigFactory

object Main extends App {
  val actorSystem = ActorSystem("myCluster", ConfigFactory.load())
  Cluster(actorSystem).joinSeedNodes(List(Address(protocol = "akka.tcp",system = "myCluster1",host = "127.0.0.1",port = 2551)))
}

??Cluster(actorSystem).joinSeedNodes(List(address))代码作用向某个种子节点发出Join命令以加入集群。这里填写的种子节点越多越好,这样消息在集群中扩散可以更快。

监听集群节点状态

??集群时间有如下几种有如下几种:MemberJoinedMemberWeaklyUpMemberUpMemberLeftMemberExitedMemberRemovedLeaderChangedRoleLeaderChangedUnreachableMemberReachableMember等等。

class ListenClusterActor extends Actor {
  val cluster = Cluster(context.system)
  override def preStart(): Unit = {
    cluster.subscribe(self, InitialStateAsEvents, classOf[MemberEvent], classOf[UnreachableMember])
  }
  override def postStop(): Unit = cluster.unsubscribe(self)
  override def receive: Receive = {
    case MemberJoined(member) =>
      println("join:" + member)
    case MemberUp(member) =>
      println("up:" + member)
    case MemberExited(member) =>
      println("exited:" + member)
    case MemberRemoved(member,previousStatus) =>
      println("removed:" + member+" before status:"+previousStatus)
    case UnreachableMember(member) =>
      println("unreachable:" + member)
  }
}

当其他节点加入集群时和离开时,打印如下:

join:Member(address = akka.tcp://[email protected]:2552, status = Joining)
up:Member(address = akka.tcp://[email protected]:2552, status = Up)
exited:Member(address = akka.tcp://[email protected]:2552, status = Exiting)
removed:Member(address = akka.tcp://[email protected]:2552, status = Removed) before status:Exiting

原文地址:https://www.cnblogs.com/hangscer/p/8111294.html

时间: 2024-10-06 00:54:05

Akka Cluster简介与基本环境搭建的相关文章

java简介和开发环境搭建

因为本人的Java一直以来水平都不怎么样,大一的时候只考了60分.所以在临近毕业的时候,我选择了重修Java,这些天正在慢慢的回顾Java,会到博客里面记录一些Java的知识,不为有多少人来看,只希望自己有所收获. 一.Java简介: 1995年,Sun公司推出. 2009年,Oracle公司收购Sun公司. Java SE,标准版本. Java EE,企业版,应用于大型企业级应用的开发. Java ME,嵌入式开发,例如基于Android的手机游戏. Java相关概念介绍: 1.JVM(Jav

python3.0语言简介及开发环境搭建

 Python(英国发音:/?pa?θ?n/ 美国发音:/?pa?θɑ?n/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议 .Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进. Python具有丰富和强大的库.它常被昵称为胶水语言,能

小朋友学Python(1):Python简介与编程环境搭建

一.Python简介 不死Java,不朽C/C++,新贵Python. Python(英国发音:/?pa?θ?n/ 美国发音:/?pa?θɑ?n/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, Python 源代码同样遵循 GPL(GNU General Public License)协议. Python语法简洁清晰,特色之一是强制用空白符(white space)作为语

第 1 课 Go 简介和开发环境搭建

(课程地址: http://study.163.com/course/courseLearn.htm?courseId=306002&from=study#/learn/video?lessonId=421012&courseId=306002) 1: GO语言的特点: 类型安全和内存安全: 以非常直观和极地代价的方式实现高并发: 高效的垃圾回收机制: 快速编译(解决C语言中头文件太多的问题):如果引用没有用的包,会报错. 为多核计算机提供性能提升的方案: UTF-8编码的支持: 2:常用

【Data Cluster】真机环境下MySQL数据库集群搭建

阅读目录 MySQL Cluster简介 mysql-cluster构造 虚拟机安装centos6.6 mysql-cluster下载 centos6.6搭建环境配置 mysql-cluster安装包导入cent中 集群配置 运行mysql-cluster 常见问题 测试 真机环境下MySQL-Cluster搭建文档  摘要:本年伊始阶段,由于实验室对不同数据库性能测试需求,才出现MySQL集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔者对此不甚了解,查阅很多资

客户端高性能组件化框架React简介、特点、环境搭建及常用语法

明天就是春节了 预祝大家新春快乐 [ ]~( ̄▽ ̄)~* 天天饭局搞得我是身心疲惫= = 所以更新比较慢 今天想跟大家分享的就是这个大名鼎鼎的React框架 简介 React是这两年非常流行的框架 并不难,还是挺容易上手的 起源于Facebook内部项目(一个广告系统) 传统页面从服务器获取数据,显示到浏览器上,用户输入数据传入服务器 但随着数据量增大,越来越难以维护了 Facebook觉得MVC不能满足他们的扩展需求了(巨大的代码库和庞大的组织) 每当需要添加一项新的功能或特性时,系统复杂度就

【读书笔记-《Android游戏编程之从零开始》】1.Android 平台简介与环境搭建

简单的记录下笔记,具体可百度! Android SDK (Software Development Kit)- Android 软件开发工具包,用于辅助Android 操作系统软件开发,是开发Android 软件.文档.范例.工具的一个集合.Android NDK (Native Development Kit) - 类似 Android SDK,可用C/C++语言编写Android程序. developer.android.com - 可查阅到 Android SDK. 开发指南.API说明等

1.SpringMVC的简介和环境搭建

SpringMVC的简介: SpringMVC 和 Struts一样是一个MVC框架,和Spring无缝连接,和struts2类似, Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块. 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,St

AngularJS之基础-1 简介(基本概念、环境搭建)

一.基本概念 软件设计原则 - 不论是桌面应用还是Web应用,在进行设计编码时应该遵守一定的设计原则 软件设计模式 - 设计模式 Design Pattern,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式用于已于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样 - 23+1中设计模式 工厂模式.抽象工厂模式.建造者模式.原型模式.单例