Akka не выбирает существующий рабочий узел в качестве начального узла, как только начальный узел убит

Я новичок в акке. Имея очень простую конфигурацию с одним начальным узлом и одним не начальным узлом.

Пожалуйста, найдите ниже, последовательность операций: -

  1. Начальный узел запущен: -
val pConfig = ConfigFactory.load("application.conf").getConfig("PrimaryNode")

val demoSystem = ActorSystem("DemoSystem", pConfig)

[INFO] [04/01/2017 23:42:48.438] [run-main-0] [akka.remote.Remoting] Starting remoting                                                                                                                                                          
[INFO] [04/01/2017 23:42:48.673] [run-main-0] [akka.remote.Remoting] Remoting started; listening on addresses :[akka.tcp://[email protected]:2551]                                                                                           
[INFO] [04/01/2017 23:42:48.688] [run-main-0] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:2551] - Starting up...                                                                                    
[INFO] [04/01/2017 23:42:48.759] [run-main-0] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:2551] - Registered cluster JMX MBean [akka:type=Cluster]                                                  
[INFO] [04/01/2017 23:42:48.759] [run-main-0] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:2551] - Started up successfully                                                                           
[INFO] [04/01/2017 23:42:48.776] [DemoSystem-akka.actor.default-dispatcher-3] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:2551] - Metrics will be retreived from MBeans, and may be incorrect on som
e platforms. To increase metric accuracy add the 'sigar.jar' to the classpath and the appropriate platform-specific native libary to 'java.library.path'. Reason: java.lang.ClassNotFoundException: org.hyperic.sigar.Sigar                     
[INFO] [04/01/2017 23:42:48.779] [DemoSystem-akka.actor.default-dispatcher-3] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:2551] - Metrics collection has started successfully                       
p: akka.actor.ActorSystem = akka://DemoSystem                                                                                                                                                                                                   

[INFO] [04/01/2017 23:42:48.795] [DemoSystem-akka.actor.default-dispatcher-2] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:2551] - Node [akka.tcp://[email protected]:2551] is JOINING, rol
es []                                                                                                                                                                                                                                           
[INFO] [04/01/2017 23:42:48.805] [DemoSystem-akka.actor.default-dispatcher-2] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:2551] - Leader is moving node [akka.tcp://[email protected]:2551] to [U
p]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  1. Запущен неначальный узел: -
val sConfig = ConfigFactory.load("application.conf").getConfig("SecondaryNode")
val secSystem = ActorSystem("DemoSystem", sConfig)

[INFO] [04/01/2017 23:44:15.530] [run-main-0] [akka.remote.Remoting] Starting remoting
[INFO] [04/01/2017 23:44:15.845] [run-main-0] [akka.remote.Remoting] Remoting started; listening on addresses :[akka.tcp://[email protected]:49169]
[INFO] [04/01/2017 23:44:15.847] [run-main-0] [akka.remote.Remoting] Remoting now listens on addresses: [akka.tcp://[email protected]:49169]
[INFO] [04/01/2017 23:44:15.854] [run-main-0] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:49169] - Starting up...
[INFO] [04/01/2017 23:44:15.929] [run-main-0] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:49169] - Registered cluster JMX MBean [akka:type=Cluster]
[INFO] [04/01/2017 23:44:15.929] [run-main-0] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:49169] - Started up successfully
[INFO] [04/01/2017 23:44:15.945] [DemoSystem-akka.actor.default-dispatcher-3] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:49169] - Metrics will be retreived from MBeans, and may be incorrect on some platforms. To increase metric accuracy add the 'sigar.jar' to the classpath and the appropriate platform-specific native libary to 'java.library.path'. Reason: java.lang.ClassNotFoundException: org.hyperic.sigar.Sigar
[INFO] [04/01/2017 23:44:15.951] [DemoSystem-akka.actor.default-dispatcher-3] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:49169] - Metrics collection has started successfully
s: akka.actor.ActorSystem = akka://DemoSystem

[INFO] [04/01/2017 23:44:16.265] [DemoSystem-akka.actor.default-dispatcher-14] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:49169] - Welcome from [akka.tcp://[email protected]:2551]

И начальный узел перемещает не-начальный узел вверх (журналы начального узла после запуска не-начального узла): -

[INFO] [04/01/2017 23:44:16.190] [DemoSystem-akka.actor.default-dispatcher-14] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:2551] - Node [akka.tcp://[email protected]:49169] is JOINING, roles []

[INFO] [04/01/2017 23:44:16.782] [DemoSystem-akka.actor.default-dispatcher-25] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:2551] - Leader is moving node [akka.tcp://[email protected]:49169] to [Up]

  1. Теперь начальный узел убит (журналы на не начальном узле говорят, что начальный узел помещен в карантин): -
............
............

[WARN] [04/01/2017 23:46:14.301] [DemoSystem-akka.remote.default-remote-dispatcher-6] [akka.tcp://[email protected]:49169/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FDemoSystem%40127.0.0.1%3A2551-2] Association with remote system [akka.tcp://[email protected]:2551] has failed, address is now gated for [5000] ms. Reason: [Association failed with [akka.tcp://[email protected]:2551]] Caused by: [Connection refused: no further information: /127.0.0.1:2551]
[INFO] [04/01/2017 23:46:14.959] [DemoSystem-akka.actor.default-dispatcher-21] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:49169] - Leader is auto-downing unreachable node [akka.tcp://[email protected]:2551]
[INFO] [04/01/2017 23:46:14.960] [DemoSystem-akka.actor.default-dispatcher-20] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:49169] - Marking unreachable node [akka.tcp://[email protected]:2551] as [Down]
[INFO] [04/01/2017 23:46:15.953] [DemoSystem-akka.actor.default-dispatcher-21] [akka.cluster.Cluster(akka://DemoSystem)] Cluster Node [akka.tcp://[email protected]:49169] - Leader is removing unreachable node [akka.tcp://[email protected]:2551]
[WARN] [04/01/2017 23:46:15.953] [DemoSystem-akka.remote.default-remote-dispatcher-5] [akka.remote.Remoting] Association to [akka.tcp://[email protected]:2551] having UID [-273153546] is irrecoverably failed. UID is now quarantined and all messages to this UID will be delivered to dead letters. Remote actorsystem must be restarted to recover from this situation.

Теперь, когда я проверяю следующие вещи на консоли неначального узла:-

  1. какой узел является лидером

Лидерство успешно перенесено на неначальный узел

scala> val cluster = Cluster(secSystem)

scala> cluster.state
res1: akka.cluster.ClusterEvent.CurrentClusterState = CurrentClusterState(TreeSet(Member(address = akka.tcp://[email protected]:49169, status = Up)),Set(),Set(akka.tcp://[email protected]:49169),Some(akka.tcp://[email protected]:49169),Map())

scala> cluster.state.leader
res2: Option[akka.actor.Address] = Some(akka.tcp://[email protected]:49169)
  1. какой узел является начальным узлом: -

Начальный узел по-прежнему указывает на мертвый узел

scala> cluster.settings.SeedNodes
res0: scala.collection.immutable.IndexedSeq[akka.actor.Address] = Vector(akka.tcp://[email protected]:2551)   

Я думал, что неисходный узел будет выбран в качестве нового исходного узла, но это не так.

Кроме того, ниже приведена конфигурация двух узлов: -

PrimaryNode {
  akka {
    actor {
      provider = "akka.cluster.ClusterActorRefProvider"
    }
    remote {
      log-remote-lifecycle-events = off
      enabled-transports = ["akka.remote.netty.tcp"]
      netty.tcp {
        hostname = "127.0.0.1"
        port = 2551
      }
    }
    cluster {
      seed-nodes = ["akka.tcp://[email protected]:2551"]
      auto-down-unreachable-after = 10s
    }
  }
}

SecondaryNode {
  akka {
    actor {
      provider = "akka.cluster.ClusterActorRefProvider"
    }
    remote {
      enabled-transports = ["akka.remote.netty.tcp"]
      netty.tcp {
        hostname = "127.0.0.1"
        port = 49169
      }
    }
    cluster {
        seed-nodes = ["akka.tcp://[email protected]:2551"]
        auto-down-unreachable-after = 10s
    }
  }
}

Пожалуйста, просветите меня. Почему неисходный узел не был выбран в качестве нового исходного узла после уничтожения предыдущего исходного узла.


person mogli    schedule 02.04.2017    source источник
comment
Откуда cluster.state и cluster.state.leader? Не могли бы вы добавить больше контекста вокруг них, чтобы убедиться, что результаты не устарели...   -  person Frederic A.    schedule 02.04.2017
comment
@ФредерикА. : обновленный вопрос для включения кластера и cluster.state.leader   -  person mogli    schedule 03.04.2017


Ответы (1)


Извините, что у меня сейчас очень мало времени, я постараюсь в нескольких словах.

Не существует такой вещи, как выбор начального узла.

После загрузки кластера akka каждый член кластера может выступать в качестве начального узла для присоединяющегося узла, т. е. использоваться в качестве начальной точки контакта любым присоединяющимся узлом. И это происходит без настройки, так как все узлы кластера прослушивают входящие соединения.

Однако перед загрузкой кластера очень важен (первый) начальный узел, поскольку он должен быть частью начальных узлов, доступных при запуске кластера. Без этого узла кластер не сможет загрузиться. Но после загрузки (как сказано выше) этот начальный узел может исчезнуть, и все будет по-прежнему хорошо.

Скорее всего, поэтому значение cluster.settings.SeedNodes не изменяется или не обновляется. Это не влияет на первоначальную настройку кластера.

использованная литература:

person Frederic A.    schedule 03.04.2017