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플래그로 비활성화할 수 있음.
추가 자료
- 분산 Erlang에 관한 문서로
Erlang -- Distributed Erlang및Distributed Erlang이 제시됨. - Joe Armstrong의 강의 영상 검색 링크: https://www.youtube.com/results?search_query=joe+armstrong+erlang
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요