notes

Personal notes

Distribuovaný Erlang v Oracle Cloud

Zadání

Realizace

Příprava instancí

V Oracle Cloud konzoli se proklikáme až do Compute > Instances a vytvoříme si 2 instance. Důležité je, aby obě instance byly ve stejném subnetu.

Dále si pro danný subnet v Networking > Virtual Cloud Networks > náš subnet > “Security Lists” > “Default Security List for náš subnet” vytvoříme Ingress pravidlo.

Stateless Source Type Source CIDR IP Protocol Source Port Range Destination Port Range Description
No CIDR 10.0.0.0/16 TCP ALL 4369 EPMD
No CIDR 10.0.0.0/16 TCP ALL 9100-9155 EPMD - komunikace

Tím jsme si vytvořili firewall pravidlo, které se bude aplikovat na naše instance zvenčí.

Abychom povolili komunikaci i zevnitř instance, musíme přidat pravidla pro iptables. V instanci přidáme záznamy do /etc/iptables/rules.v4

-A INPUT -p tcp -s 10.0.0.0/16 --dport 4369 -j ACCEPT
-A INPUT -p tcp -s 10.0.0.0/16 --dport 9100:9155 -j ACCEPT

Následně pravidla aplikujeme iptables-restore < /etc/iptables/rules.v4 a ověříme iptables -L.

Spuštění Erlang nodů

(Dokumentace k Distributed Erlang)

Na každé instanci spustíme node s odpovídajícím jménem a stejným cookie.

# instance 1
erl -name node1@interní-IP-instance-1 -setcookie susenka -kernel inet_dist_listen_min 9100 inet_dist_listen_max 9155
# instance 2
erl -name node2@interní-IP-instance-2 -setcookie susenka -kernel inet_dist_listen_min 9100 inet_dist_listen_max 9155

Nyní již stačí na jednom z nodů pingnout druhý node a nody na sebe vidí.

(node1@10.0.0.79)1> net_adm:ping('node2@10.0.0.136').
pong
(node1@10.0.0.79)2> nodes().
['node2@10.0.0.136']
(node2@10.0.0.136)1> nodes().
['node1@10.0.0.79']

Komunikace nodů

Pro otestování si vytvoříme na každé z instancí soubor say.erl

-module(say).
-export([hello/0]).

hello() ->
    io:format("Hello from node ~p!~n", [node()]).

Na každém z nodů si jej zkompilujeme a můžeme zavolat na druhém z nodů.

(node1@10.0.0.79)3> c(say).
{ok,say}
(node1@10.0.0.79)4> rpc:call('node2@10.0.0.136', say, hello, []).
Hello from node 'node2@10.0.0.136'!
ok