á¡á±á¬ááºááŒááºáá±á¬ áá¯ááºáááºážáá»áŸá±á¬ááºááœáŸá¬ááá¯ááºážáá®ážáá«ážááẠáááŒá¬áá® ááá¯á·ááá¯áẠáá±á¬ááºááá¯ááºážááœáẠá¡áá»á¬ážááá¯áẠá¡ááá¯ááºážá¡áá¬ááá¯á¡ááºááá·áº á¡ááá·áºááá¯á· áá±á¬ááºááŸááá¬áááºá áá»á¬ážá áœá¬áá±á¬á¡ááŒá±á¡áá±áá»á¬ážááœááºá áááºááẠáá¬ááá¡áá áºáá áºáá¯ááᯠááá¯ážááá¯ážááŸááºážááŸááºážá áááºááá¯ááºááŒá®áž áááºáá»ááºážáá»áŸááᯠáá»áŸá±á¬á·áá»ááá¯ááºáááºá áá«áá±ááá·áº ááá°áá®áá²á· node ááœá±á áá áºáá¯áá²á·áá áºáᯠááááŒá®áž á¡áá¯ááºáá¬áááºááœá±ááᯠááá¯áá áá¯ááºááŒáá·áºáá±ááá¯á· áá±áá»á¬ááá¯á· ááá¯á¡ááºáá²á·á¡áá±ážá¡ááœá²ááá á¹á ááœá±áááºáž ááŸááá«áááºá
á¡á²áá« áá¶áá±á¬ááºážááá¯ááºáᬠáááŸá¬áááºážááá¬áá¬áá±á¬ syntax ááŸáá·áº hype á¡ááœááºáá»áœááºá¯ááºááá¯á·ááœá±ážáá»ááºáá²á·áá±á¬á áááºážááœááºááááááºážá
á¬ážááŸááááºá
ááá°áá®áá±á¬ node áá»á¬ážááŸá áá¯ááºáááºážá ááºáá»á¬ážá¡ááŒá¬ážá ááá·áºááºáá»á¬ážááŸáá·áº áá±á¬áºáá®áá¬áá»á¬ážááŒá¬ážááœáẠáááºáá±á·áá»áºáá±ážááá¯á·ááŒááºážááẠááœáá·áºáááºážááŒááºáá¬ááŸá¯ [âŠ]
áááºááœá±á·ááŸá¬áá±á¬á· á¡áá¬á¡á¬ážáá¯á¶ážá áááºážáááºážááá¯ááŸá¯ááºááœá±ážáá«áááºá ááŒáá·áºáá±áá²á·áááºá áááŸá¬ "ááœááºááááºáá¬" ááẠáááºá¹áá±á¬áááºáááºá¡ááœáẠáá¶áá±áá¹áá¬ááŒá®ážáá áºáá¯áᯠá¡áááá¹áá«ááºáááŒá®áž "docker" ááẠlongshoreman á á¡áááá¹áá«ááºáá°ááŒá áºáááºá IN IP4 áá±áá¬áááŸááá±á¬ ááááºá á¬áá»á¬ážá áœá¬ ááŸááá²á·áááºá á¡áá»á¬ážá¡á¬ážááŒáá·áº áá±áááºááᯠááŒáœááºáá»á¬áž áá«ážá á¬ážááŒááºážááŒá±á¬áá·áº ááœááºááẠááŒááºáá±á¬ááºááŸá¯áá»á¬áž ááŒá áºááŒááŒá®áž áá¯ááºáá¯ááºááŸá¯ á áá áºá áá»ááºážáá»áŸ á¡áá¯ááºáá»áááºááᯠáááºá á¯ááŸá áºáá»á¬ážá¡ááœááºáž ááá¯ááºážáá¬áá²á·áááºá
ááᯠáá»áœááºá¯ááºááá¯á·á¡á¬ážáá¯á¶ážááẠááá¯á¶ááá¯ááºáá±á¬ááºá¡á±á¬áẠáá°áá¯á¶á¡á±á¬ááºá áá¯ááºááá¯ážááŒá®áž ááŒáá·áºáá±áá±ááŒáá«ááŒá®á áááŸá¬ ááŒá®ážá áœá¬áá±á¬áá»áááºážááŸá¯ááááá¬áá¡á dynamic IP ááááºá á¬áá»á¬ážááᯠáá¯ááºáá±ážááá·áºáááºáááºážáá»ááºááœááºá ááŸáá·áº node áá»á¬ážááẠscheduler ááááºáááºááá±á¬áá·áºááœáẠáá±á«áºáá¬ááŒá®áž áá»á±á¬ááºááœááºááœá¬ážááá¯ááºáááºá ááŒáá·áºáá±áá¬ážáá±á¬ ááá±á¬áá»ááºááá¯ááºážááœáẠboilerplate code á¡á á¯á¡áá¯á¶áá»á¬ážááᯠááŸá±á¬ááºááŸá¬ážááẠáááŸá¬áááºááá¯áá±á¬áááºáááºážáá»ááºááᯠááá¯ááºáá»ááºáááºá á¡áá°á¡áá®ááá¯á¡ááºáááºá
ááœá±á¬ááá¯ááŸááááºááá¯áᬠáááááŒá¯áááá«áááºá libcluster
ááá¯á¡ááºáá»ááº
áá»áœááºá¯ááºááá¯ááºááá¯áẠááá¯á¡ááºáá±á¬á¡áá¬ááŸá¬ á¡á á¯á¡áá±ážá á á®áá¶ááá·áºááœá²ááŸá¯ááᯠááœáŸá²ááŒá±á¬ááºážááá°ááá·áº á á¬ááŒáá·áºááá¯ááºáá áºáá¯ááŒá áºááŒá®áž á¡á±á¬ááºáá«áá¯ááºááá¹áááá»á¬áž ááŸááááá·áºáááº-
- áááºáá²áá±á¬áá¯ááºáá¯ááºáá¬ážáá±á¬ node á á¬áááºážááŸáá·áº áááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá áºááá·áº áááºááŒáœáá±á¬ááŸá¬ááœá±ááœá±á·ááŸáááŸá¯ááŸá áºáá¯áá¯á¶ážááŒáá·áº ááœáá·áºáááºážááŒááºáá¬áá±á¬á¡áá¯áẠáááŸá¬;
- topology ááŒá±á¬ááºážáá²ááŸá¯ááá¯ááºážá¡ááœáẠá¡ááŒáá·áºá¡á functional callback (á¡á²áá®ááŸá¬ node âânode á node á network instability á splits );
- ááá¯áá±á¬ááºážáá±á¬ á¡áááºáá»á¬ážááŒáá·áº á¡á
á¯á¡áá±ážáá
áºáá¯ááᯠá
áááºáááºá¡ááœáẠááœáá·áºáááºážáá±á¬ áá»ááºááŸá¬ááŒááº
:nonode@nohost
; - á¡ááŒá±áá¶áá¯ááºáá±ážá áá¬áááá¯áá² Docker áá¶á·ááá¯ážááŸá¯á
áá±á¬ááºááá¯ááá¯áááºááŸá¬ áá»áœááºá¯ááºááẠááŒááºááœááºážá áá»áŸá±á¬ááºááœáŸá¬ááᯠá
ááºážáááºááŒá®ážáá±á¬ááºá :nonode@nohost
ááá¯á·ááá¯áẠá¡áá¯á¡áá±á¬áẠááŒáá·áºáá±ááá·áº áááºáááºážáá»ááºááœáẠá¡áá¯á¶ážááŒá¯ááŒááºážá test_cluster_task
docker-compose up --scale my_app=3
áá¯ááºááŒá±á¬ááºážáá²ááŸá¯áááŸááá² docker ááœáẠááŒá
áºáááºáá¯á¶ážáá¯ááᯠáááºááá¯á·áá¯ááºáá±á¬ááºáááºááᯠááŒáá·áºáá«á ááŒáá¯ááºáá²á· App ááœá±ááᯠáááºáž ááŸá®ááá¯áá»ááºáá«áááºá mnesia
- topology ááŒá±á¬ááºážáá²áá±á¬á¡áá«á áá±á¬ááºááœááºááœáẠáááºážááá¯á·ááẠá¡ááá®áá±ážááŸááºážá០áááºáá¶áááºááœááºážááŒááºážáááŸááá² á¡á
á¯á¡áá±ážááᯠááŒááºáááºáááºáá±á¬ááºááŒáááºá
áá®áááŸáẠá¡á á¯á¡ááœá²á·áá áºáá¯á¡á¬áž áá¶á·ááá¯ážáá°áá®ááŒááºážá០áá±á¬áºáá®áá¯ááºáá¯ááºááŒááºážá¡áá á¡áá¬á¡á¬ážáá¯á¶ážááᯠááŒáá·áºáááºážáá±ážááá¯ááºáá±á¬ á á¬ááŒáá·áºááá¯ááºáá áºáᯠááŒá áºáá¬á á±ááẠáááºááœááºááŒááºážááá¯ááºáá«á ááŒá áºááá¯ááºááŒá±ááá á¹á á¡á¬ážáá¯á¶ážááᯠáá¯á¶ážááœááºááẠáááºááœááºáá±á¬ ááœá±áá»ááºáááºááá¯ááºáá«á ááá¯á·ááá¯áẠáá®á¡áá¯áá®ááá¬ááŸááºáá»á¬ážá á¡áááá¹áá¬ááºá¡á ááá¬áááºááá¯ááºáᬠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ ááŒá±ááŸááºážáá»ááºáá áºáá¯ááŒá áºáááºá CS á€áá±á«áá¬áááᯠááá·áºááœááºážáá«á á€á á¬ááŒáá·áºááá¯ááºááẠá¡ááœááºááŸááºážáááºážáá±á¬ áááºááœááºáá»ááºááᯠáááºážáá±á¬ááºááẠáá®ááá¯ááºážáá¯ááºáá¬ážáá±á¬áºáááºáž áááºážá ááŒá®ážáá¬ážááœááºážáá±á¬ á¡áá¯ááºááᯠááŒá®ážááŒáá·áºá á¯á¶á áœá¬ áá¯ááºáá±á¬ááºáá«á á€áááºááŸááºážáá»ááºááẠáá±áááœá¶á·ááŒáá¯ážáá±ážáááºáááºážáá»ááºááŸáá·áº áááºááá¯áá±á¬áá¯á¶ážáá»á¬ážá¡ááŒáá·áº ááŒáá·áºáá»ááºáá¬ážáá±á¬ áá»á±á¬á·áá»á±á¬ááºážáá±á¬áááºáááºážáá»ááºááŒá¬ážááœáẠááœáá·áºáááºážááŒááºáá¬ááŸá¯ááŸáá á±áááºááŒá áºáááºá
áá»ááºážáááºááœá±ážáá»ááºáá²á·áááºá
áá®áááŸáẠá¡ááºááá®áá±ážááŸááºážáá
áºáá¯á¡áá±ááŒáá·áº áá¯ááºáá±á¬ááºááẠáááºááœááºáá¬ážáá±á¬áºáááºážá á¡ááá·áºááŒáá·áºá¡áá¯á¶ážááŒá¯áá°áá»á¬ážááẠááá¯ááºááá¯ááºáááºáááºááŒááºážááŒáá·áº á¡á
á¯á¡áá±ážá áááºáááºááŒááºážááŸáá·áº ááááºážááááºážááŒááºážááá¯á·ááᯠááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááá¯ááºáá±á¬áºáááºážá Cloister.Manager
áá
áºááŸááºá¡ááá®áá±ážááŸááºážáááŒá®ážááŒááºáá±ážáá
áºáááºáá
á¡ááºááá®áá±ážááŸááºážáá
áºáá¯á¡ááŒá
Ạrun áá±á¬á¡áá«á á
á¬ááŒáá·áºááá¯ááºááá¯ááŸá®ááá¯áááºá config
á¡á±á¬ááºáá«á¡ááŒá±áá¶áááºááá¯ážáá»á¬ážááᯠáááºááŸá¯ááŒááºážááŒáá·áºá
config :cloister,
otp_app: :my_app,
sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
consensus: 3, # number of nodes to consider
# the cluster is up
listener: MyApp.Listener # listener to be called when
# the ring has changed
á¡áááºáá±á¬áºááŒáá« ááá·áºáááºáá»ááºáá»á¬ážááẠá¡á±á¬ááºáá«ááá¯á·ááᯠá
á¬áá¬ážá¡á ááá¯ááá¯áá«áááºá áá®áááŸáẠOTP á¡ááá®áá±ážááŸááºážá¡ááœáẠá¡áá¯á¶ážááŒá¯áááºá :my_app
, á¡áá¯á¶ážááŒá¯áááºá erlang áááºáá±á¬ááºááŸá¯ááŸá¬ááœá±ááœá±á·ááŸáááŸá¯ node áá»á¬ážááᯠáá»áááºáááºááẠá¡áááºážáá¯á¶áž áá¯á¶ážáá¯á MyApp.Listener
module (á¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá @behaviour Cloister.Listener
á€ááœá²á·á
ááºážáá¯á¶ááŸáá·áºá¡áá°, áá»áŸá±á¬ááºááœáŸá¬ áá®áááŸáẠááœá
á»áááá»á·ááá» MyApp.Listener.on_state_change/2
%Cloister.Monitor{status: :up}
ááá¯ááá¯áááºááŸá¬- "áááºá¹ááá¬áá«á á¡á
á¯á¡áá±ážááᯠá
á¯á
ááºážáá¬ážáááºá"
ááá
á¹á
á¡áá»á¬ážá
á¯ááœááºáááºááẠconsensus: 3
áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºááẠnode áá»á¬ážááᯠáá»áááºáááºááẠáá»áŸá±á¬áºááá·áºáá¬ážáá±á¬áºáááºáž áá¯ááºážááŒááºáá±á«áºááŒááºážááŸá¬ ááŒááºáááºážááœá¬ážáááá·áºáááºááŒá
áºáá±á¬ááŒá±á¬áá·áº á¡áá±á¬ááºážáá¯á¶ážááŒá
áºáááºá status: :rehashing
â status: :up
á¡áá
áºááá·áºáá¬ážáá±á¬ ááá¯á·ááá¯áẠáááºááŸá¬ážááá¯ááºáá±á¬ node áá
áºáá¯áá¯ááœááºá
ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áá¯ááºááœáẠá
áááºáá±á¬á¡áá«á áááºááẠáááºááŸááºáááºáᬠááá¯á¡ááºáááºá consensus: 1
О áá®áááŸáẠáá°ááŒááºáá±á¬á¡áá«ááœáẠá¡á
á¯á¡ááœá²á· á
á¯áá±ážááŸá¯á
á±á¬áá·áºááá¯ááºážááŒááºážááᯠáá»á±á¬áºááœáŸááºá
áœá¬ áá»á±á¬áºááœá¬ážáááá·áºáááºá :nonode@nohost
ááá¯á·ááá¯áẠ:node@host
ááá¯á·ááá¯áẠ:[email protected]
- node ááá¯áááºáá²á·ááá¯á· configure áá¯ááºáá²á·áááºáá±á«áºáá°áááºááẠ(:none | :shortnames | :longnames
).
ááŒáá·áºáá±áá¬ážáá±á¬ áá»áŸá±á¬ááºááœáŸá¬á á®áá¶ááá·áºááœá²ááŸá¯
áá±áá¬áááºááœááºááá¯ááºáá±á¬ ááŒáá·áºáá±áá¬ážáá±á¬ á¡ááá®áá±ážááŸááºážáá»á¬ážáá²á·ááá¯á·áá±á¬ ááŒáá·áºáá±ááŸá¯á¡áá±á«áº áá°áááºááŒááºážáá»á¬áž áá«áááºáááºá mnesia
. áá°áá®áá±á¬áá±á«áºááá¯ááŸá¯á០áááºážááá¯á·á ááŒááºáááºááœá²á·á
ááºážááŸá¯ááᯠááá¯ááºááœááºááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠááœááºáá°áá«áááºá on_state_change/2
. á€ááœááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºááá¯á·ááŒááºáááºááŒááºáááºááááºááᯠá¡áá±ážá
áááºáá±á¬áºááŒáá»ááºááŒá
áºáááºá mnesia
on the fly in
á¡áá¯á¶ážááŒá¯ááŒááºážáá¡áááá¡á¬ážáá¬áá»áẠáá®áááŸáẠtopology ááŒá±á¬ááºážáá²ááŸá¯ááŒá®ážáá±á¬áẠá¡á
á¯á¡áá±ážááᯠááŒááºáááºáááºáá±á¬ááºááẠááá¯á¡ááºáá±á¬áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºáááŒááºážááŒá
áºáá«áááºá á¡ááá¯áá«áá«ážáá»ááºážá¡á±á¬ááºááŸá¬. á¡ááá®áá±ážááŸááºážááẠIP ááááºá
á¬áá»á¬ážááá¯ááááŒá®áž node á¡áááºáá»á¬ážááá¯ááŒáá¯áááºááááŸáááŒááºážááŸááááŸáá ááá¯á·ááá¯áẠáááºážááá¯á·á¡á¬áž ááá¯ááºážááá
áºáááºááŸááºáá±ážáá¬ážááŒááºáž/ááŒá±á¬ááºážáá²ááŒááºážáá¶ááááºááŒá
áºá
á± node áá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá»áááºáááºáá¬ážááŒááºážááŒáá·áº á¡ááá®áá±ážááŸááºážááẠááŒááºáááºáá¬ážááŒá®ážááŒá
áºáá±á¬ááŒáá·áºáá±ááá·áºáááºáááºážáá»ááºááœáẠááá¯ážááá¯ážááŸááºážááŸááºážáá¯ááºáá±á¬ááºáááºá áááºážááẠá¡áá°áž docker configuration áááºáááºáá»á¬áž áá¯á¶ážááááá¯á¡ááºáá² á¡ááºááá®áá±ážááŸááºážáá±á¬á·ááºáá²áá±ážáá¬ážáá°áá¡ááŒááºá¡áá ááŒáá·áºáá±áá¬ážáá±á¬áááºáááºážáá»ááºááœáẠáá¯ááºáá±á¬ááºááŒááºáž ááá¯á·ááá¯áẠáá±áááœááºážáá
áºáá¯ááœáẠáá¯ááºáá±á¬ááºááŒááºážááŒá¬ážááœáẠááœá¬ááŒá¬ážáá»ááºáááŸááá«á :nonode@nohost
. áá®á¡ááŒá±á¬ááºážááᯠá¡ááŒáá·áºá¡á
á¯á¶áááºááá¯ááºáá«áááºá
ááŸá¯ááºááœá±ážáá±á¬ topology á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠá
áááºááŒáá¯áẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážááŒáá·áº ááŒá
áºááá¯ááºáá±á¬áºáááºážá MyApp.Listener
á€á
á¬ááŒáá·áºááá¯áẠááá·áºáááºáá»ááºáá»á¬ážááŸáá·áº ááœá²á·á
ááºážááŸá¯ááá¯ááºáᬠáááºááá¯ááºááŸá¯áá»á¬ážááẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á á¡ááŒá±áá¶á¡á¯ááºááŒá
áºáá»á¬ážááŒá
áºááŒá±á¬ááºáž áááºáá±ááŒááá¯ááºááá·áº á¡áá¬ážáááºááá
á¹á
áá»á¬áž á¡ááŒá²ááŸáááá¯ááºáááºá áá±á¬ááºážááŒá®á á¡áá±á«áºáá¡ááá¯ááºážáá°áá«á libcluster
ááá¯á áá±áá°áá»áááºááœááºáá»ááºááŒá
áºááá·áº ááá¯á·ááá¯áẠá¡ááá·áºáááá·áºá¡á
á¯á¡ááœá²á·ááᯠáááºááá¯ááºááá¯áẠááá¯ááºááœááºáá«á á€áá¯ááºáá
áºáá»á
áºááá¯ááºá áááºááœááºáá»ááºááŸá¬ ááŒá
áºááá¯ááºááŒá±ááŸááá±á¬ á¡ááŒá±á¡áá±ááá¯ááºážááᯠááœáŸááºážááŒá¯á¶áááºááá¯ááºáá² áááá¯á¡ááºáá² áá¬áá»ááºááŸá¯ááŸáá·áº áááºáá²ááŒááºážáááºážáá±á¬ áá±á¬áºáá®áá°ážááá·áºááŒááºážáááŸááá² á¡áá¯á¶ážá¡áá»á¬ážáá¯á¶áž ááŒááºááœááºážááᯠá¡áá¯á¶ážááŒá¯áááºááŒá
áºáááºá
ááŸááºáá»ááº: áá°áááºážááœáẠá€á¡áá»ááºááœáẠâHappy clustering!â áá°áá±á¬ á áá¬ážá á¯ááŸááá²á·ááŒá®ážá áá»áœááºá¯ááºáá¬áá¬ááŒááºááá¯áá¬ážáá±á¬ Yandex (á¡áááá¬ááºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯ááºááá¯áẠááŒááºáááºážááẠáááá¯á¡ááºáá«) "Happy clustering!" ááᯠááœá±ážáá»ááºááœáá·áº áá±ážáá«áááºá á¡áá°ážáááŒáá·áº áááºááŸááááá®ááá¯ááºáá¶áá±ážá¡ááŒá±á¡áá±á¡á ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬áá¬áá¬ááŒááºááᯠá áááºáá°ážááŒáá·áºááẠáááŒá áºááá¯ááºáá±á
source: www.habr.com