TL;DR

  • Erlang에서 분산 노드 두 개를 연결하려면 각 노드에 긴 이름을 지정하고 net_adm:ping/1에 노드 이름을 원자로 전달하면 됨.
  • /etc/hosts에 a.com, b.com, c.com을 모두 127.0.0.1에 연결하고 각 노드를 erl -name으로 실행하는 구성임.
  • 긴 노드 이름과 짧은 노드 이름은 서로 통신할 수 없으며, 노드 이름은 이름@호스트 형식임.
  • net_adm:ping/1의 인수에는 문자열이 아닌 원자를 사용해야 하며, 연결에 성공하면 pong, 실패하면 pang이 반환됨.
  • Erlang은 기본적으로 전이적 전체 메시(full mesh) 연결을 사용하므로, 한 노드에 핑을 보내면 그 노드와 연결된 다른 노드도 nodes()에 나타날 수 있음.

두 노드 시작하기

  • Erlang을 분산 동시성 시스템으로 사용하는 기본 방법은 노드를 빠르게 실행하고 서로 핑을 보내 연결을 확인하는 것임. 예제는 두 노드를 사용함.
  • /etc/hosts에 127.0.0.1 a.com, 127.0.0.1 b.com, 127.0.0.1 c.com을 설정해 세 호스트 이름을 모두 로컬 주소에 연결함.
  • erl 명령의 -name 인수는 긴 노드 이름을 지정하며, 노드 이름 형식은 이름@호스트임. 긴 이름에서는 전체 호스트 이름을 사용하고, 짧은 이름에서는 호스트 이름의 첫 부분을 사용함.
  • 긴 노드 이름을 사용하는 노드는 짧은 노드 이름을 사용하는 노드와 통신할 수 없음. 따라서 예제에서는 두 노드 모두 -name으로 긴 이름을 지정함.
  • 두 터미널 또는 tmux 세션에서 각각 erl -name 'a@a.com'과 erl -name 'b@b.com'을 실행함.
  • 노드 a에서 net_adm:ping('b@b.com')을 호출하면 pong이 반환되며, 노드 b에서 net_adm:ping('a@a.com')을 호출해도 pong이 반환됨.
  • nodes()는 현재 노드가 연결된 다른 노드의 목록을 반환함. 노드 b에서 호출하면 연결된 노드인 a@a.com이 표시됨.

노드 이름에 원자 사용하기

  • net_adm:ping("b@b.com")처럼 큰따옴표로 감싼 문자열을 전달하면 함수 절과 일치하지 않아 오류가 발생함.
  • Erlang에서 작은따옴표로 감싼 'thing'은 원자이며, 큰따옴표로 감싼 "thing"은 문자열임. thing과 'thing'은 같은 원자지만, 둘 다 문자열인 "thing"과는 같지 않음.
  • Erlang 표현식은 마침표(.)로 끝남.

세 번째 노드 추가하기

  • erl -name 'c@c.com'으로 세 번째 노드를 시작한 직후 nodes()를 호출하면 연결된 노드가 없으므로 빈 목록 []이 반환됨.
  • 노드 c에서 net_adm:ping('a@a.com')을 호출하면 연결이 성공할 때 pong이 반환되고, 실패하면 pang이 반환됨.
  • 핑 이후 nodes()는 ['a@a.com','b@b.com']을 반환함. 노드 c는 a에만 핑을 보냈지만 b도 목록에 포함됨.
  • 이 동작은 Erlang의 기본 연결이 전이적이기 때문임. 노드 A가 노드 B와 연결되고 노드 B가 노드 C와 연결되면, 노드 A도 노드 C에 연결을 시도함.
  • 전이적 연결은 erl 명령의 -connect_all false 플래그로 비활성화할 수 있음.

추가 자료