[Akka] Akka Clustering

smlee·2023년 11월 24일
0

Akka

목록 보기
50/50
post-thumbnail

이번 포스트에서는 Akka Clustering에 대한 간단한 이론을 정리하려고 한다.


Akka Clustering

  • Akka Clustering은 분산 애플리케이션을 만들 때 매우 효과적이다.

    • decentrailzed, peer to peer에 기반한다.
    • Automatic Node membership과 Gossip Convergent Protocol을 사용한다.
    • Failure Detector가 존재한다.
  • Akka Clustering은 Remoting에 기반을 두고 있다. 하지만, 대부분의 경우 Akka Clustering을 사용한다.

Akka Clusters

  1. 멤버 노드들로 구성되어 있다.
    • node : host + port + UID
    • 노드들은 같은 JVM에 속하거나, 같은 기기 내 다른 JVM, 혹은 아무 스케일의 같은 세트 내의 기기들에 속한다.
  2. Cluster Membership
    • Gossip Convergence Protocol을 사용한다.
    • 리더 노드 selection이 존재하지 않는다. convergent gossip protocol이 수렴할 때 한 번 자동으로 리더 노드를 선택한다.

Cluster에 Join하기

만약 새로운 노드가 클러스터에 Join하기 위해서는 다음과 같은 과정을 거쳐 Join된다.

  1. 클러스터에 join하려는 노드가 seed node들에게 순서대로 컨택한다.
    • seed node : 아무런 역할이나 의무는 없지만 initical contact point가 되는 노드들
    • seed node들에게 컨택을 하고 가장 먼저 응답이 온 seed node에게 Join Command를 보낸다.
  2. Join Command를 받은 seed node가 클러스터에 있는 모든 노드들에게 새 노드가 join한다고 전파한다. 따라서 state가 Joining으로 변경된다.
  3. 리더 노드가 새 노드의 상태를 Up으로 바꾼다. 그리고 이러한 상태 변화 역시 클러스터 내부 모든 노드들에게 전파한다.

Cluster에서 떠나기

Cluster에서 노드가 떠나는 방법에는 2가지가 있다. safe and quiet 방법과 직접 다운시키는 방법이 있다.


(1) safe and quit

  1. 클러스터를 떠나려는 노드는 상태를 "leaving"으로 바꾼다.
  2. 클러스터 내의 모든 노드들에게 이러한 상태 변화를 알린다.
  3. 리더 노드가 해당 클러스터의 상태를 "exiting"으로 바꾼다.
  4. 클러스터 내의 모든 노드들에게 이러한 상태 변화를 알린다.
  5. 리더 노드가 해당 클러스터의 상태를 "removed"로 바꾼다.

(2) harder way

  • JVM이 크래시난 경우나, 네트워크가 partition된 경우, 그리고 커넥션이 shutdown된 경우 등 갑자기 node에 Unreachable된 경우 사용한다.
  • removed(downed) node manually
val cluster = Cluster.get(system)
cluster.down(cluster.selfAddress())

위와 같이 down을 통해 노드를 제거할 수 있으나, 프로덕션 환경에서는 automatic downing을 사용하면 안 된다. Persistent Actor 등이 있는 경우 journal에서 문제가 생길 수 있기 때문이다.

Cluster를 언제 사용해야할까

Clustering을 사용해야하는 경우

  1. 같은 artifact를 가지고 있으며, fault tolerance나 availability와 같은 이점을 가지면서 같은 애플리케이션 내에서 깊이 연관된 경우
  2. within microservice

Clustering을 사용하면 안 되는 경우

  1. 애플리케이션이 분리되어 있으며, 다른 artifact를 가지고 있지만 매우 깊게 연관된 경우
  2. inter-microservice communication

0개의 댓글