๊ฑฐ์ ๋ชจ๋ ์ฑ๊ณต์ ์ธ ๋น์ฆ๋์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์กฐ๋ง๊ฐ ์ํ์ ํ์ฅ์ด ํ์ํ ๋จ๊ณ์ ๋ค์ด๊ฐ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฐ๋จํ ์ ์ธ์คํด์ค๋ฅผ ์์ํ๊ณ ๋ก๋ ํ๊ท ์ ์ค์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ก ๋ค๋ฅธ ๋ ธ๋๊ฐ ์๋ก์ ๋ํด ์๊ณ ์๋์ง ํ์ธํ๊ณ ์์ ๋ถํ๋ฅผ ์ ์คํ๊ฒ ๋ถ์ฐํด์ผ ํ๋ ๋ ์ฌ์ํ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
๋๋ฌด ์ด์ด ์ข์์ ๊ทธ๋ฌ๋ค. ์ผ๋ญ์ฐ๋ฆฌ๊ฐ ์ ์พํ ๊ตฌ๋ฌธ๊ณผ ๊ทธ์ ๋ํ ๊ณผ๋ ๊ด๊ณ ๋ก ์ ํํ ๋ ์ผ๋ฅ์
์๋ก ๋ค๋ฅธ ๋ ธ๋์ ํ๋ก์ธ์ค ๊ฐ์ ๋ฌผ๋ก ๋งํฌ์ ๋ชจ๋ํฐ ๊ฐ ๋ฉ์์ง ์ ๋ฌ์ ํฌ๋ช ํฉ๋๋ค. [โฆ
์ค์ ๋ก ๋ชจ๋ ๊ฒ์ด ์กฐ๊ธ ๋ ๋ณต์กํฉ๋๋ค. ๋ถ์ฐ ์ผ๋ญ "์ปจํ ์ด๋"๊ฐ ๋ฐฐ์ก์ ์ํ ํฐ ์ฒ ์์๋ฅผ ์๋ฏธํ๊ณ "๋์ปค"๊ฐ ๋จ์ํ ํญ๋ง์ ์์ ๋์์ด์ผ ๋ ๊ฐ๋ฐ๋์์ต๋๋ค. ์์ IP4 ๋น์ด ์๋ ์ฃผ์๊ฐ ๋ง์๊ณ , ์ผ์ด๋ธ์ ์น๋ ์ฅ ๋๋ฌธ์ ๋คํธ์ํฌ๊ฐ ์ค๋จ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ผ๋ฉฐ, ์์ฐ ์์คํ ์ ํ๊ท ๊ฐ๋ ์๊ฐ์ ์์ญ ๋ ์ ๊ฑธ์ณ ์ธก์ ๋์์ต๋๋ค.
์ด์ ์ฐ๋ฆฌ ๋ชจ๋๋ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ์๊ธ์์กฑํ๊ณ , ํจํค์งํ๋์ด ๋ถ์ฐ ์คํ๋๊ณ ์์ต๋๋ค. ์ผ๋ญ ๋์ IP ์ฃผ์๊ฐ ๋ฌด์์์ฑ์ ์์น์ ๋ฐ๋ผ ์ ๋ฌ๋๊ณ ๋ ธ๋๊ฐ ์ค์ผ์ค๋ฌ์ ์ผ์ชฝ ๋ณ๋์ ๋ฐ๋ผ ๋ํ๋๊ณ ์ฌ๋ผ์ง ์ ์๋ ํ๊ฒฝ์์. ๋ถ์ฐ์ ์คํํ๋ ๋ชจ๋ ํ๋ก์ ํธ์์ ์์ฉ๊ตฌ ์ฝ๋ ๋๋ฏธ๋ฅผ ํผํ๊ธฐ ์ํด ์ผ๋ญ, ์ ๋์ ์ธ ํ๊ฒฝ์ ๋ง์๊ธฐ ์ํด์๋ ๋์์ด ํ์ํฉ๋๋ค.
์ฃผ์: ๋๋ ๊ทธ๋ฐ ๊ฒ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์๋ค. libcluster
์๊ตฌ ์ฌํญ
๊ฐ์ธ์ ์ผ๋ก ํ์ํ ๊ฒ์ ํด๋ฌ์คํฐ ๊ด๋ฆฌ๋ฅผ ๋์ ํ๊ณ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ต๋๋ค.
- ํ๋ ์ฝ๋ฉ๋ ๋ ธ๋ ๋ชฉ๋ก๊ณผ ์๋น์ค๋ฅผ ํตํ ๋์ ๊ฒ์์ ํตํ ํฌ๋ช ํ ์์ ์ผ๋ญ;
- ๋ชจ๋ ํ ํด๋ก์ง ๋ณ๊ฒฝ(๊ฑฐ๊ธฐ ๋ ธ๋, ์ฌ๊ธฐ ๋ ธ๋, ๋คํธ์ํฌ ๋ถ์์ , ๋ถํ )์ ๋ํ ์์ ํ ๊ธฐ๋ฅ์ ์ฝ๋ฐฑ;
- ๋ค์๊ณผ ๊ฐ์ด ๊ธด ์ด๋ฆ๊ณผ ์งง์ ์ด๋ฆ์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ์์ํ๊ธฐ ์ํ ํฌ๋ช
ํ ์ธํฐํ์ด์ค
:nonode@nohost
; - ์ธํ๋ผ ์ฝ๋๋ฅผ ์์ฑํ ํ์ ์์ด ์ฆ์ Docker๋ฅผ ์ง์ํฉ๋๋ค.
ํ์๋ ๋ก์ปฌ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ํ
์คํธํ ํ๋ฅผ ์๋ฏธํฉ๋๋ค. :nonode@nohost
, ๋๋ ๋ค์์ ์ฌ์ฉํ์ฌ ์ธ์์ ์ผ๋ก ๋ถ์ฐ๋ ํ๊ฒฝ์์ test_cluster_task
docker-compose up --scale my_app=3
์ฝ๋ ๋ณ๊ฒฝ ์์ด docker์์ ์ธ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ด๋ป๊ฒ ์คํํ๋์ง ์ดํด๋ณด์ธ์. ๋๋ ๋ํ ๋ค์๊ณผ ๊ฐ์ ์ข
์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํฉ๋๋ค. mnesia
- ํ ํด๋ก์ง๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์์ ์ถ๊ฐ ์์
์์ด ํด๋ฌ์คํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฌ๊ตฌ์ถํฉ๋๋ค.
ํ๋ ํด๋ฌ์คํฐ๋ฅผ ์ง์ํ๋ ๊ฒ๋ถํฐ ์ปคํผ๋ฅผ ๋ง๋๋ ๊ฒ๊น์ง ๋ชจ๋ ๊ฒ์ ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ์๋๋ ์๋์์ต๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ์ฌ๋ก๋ฅผ ํฌ๊ดํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ๋ง๋ฅ์ฑ ๋ ์๋๊ณ , ์ถ์ ์ด๋ก ๊ฐ๋ค์ด ๋งํ๋ ํ๋ฌธ์ ์ผ๋ก ์์ ํ ํด๊ฒฐ์ฑ ์ด ๋๋ ๊ฒ๋ ์๋๋๋ค. CS ์ด ์ฉ์ด์ ๋ฃ์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งค์ฐ ๋ช ํํ ๋ชฉ์ ์ ์ ๊ณตํ๋๋ก ์ค๊ณ๋์์ง๋ง ๋๋ฌด ํฌ์ง ์์ ์์ ์ ์๋ฒฝํ๊ฒ ์ํํฉ๋๋ค. ์ด ๋ชฉํ๋ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ์ ๋์ ์ธ ์ปจํ ์ด๋๋ก ๊ฐ๋ ์ฐฌ ๋ถ์ฐ๋ ํ๋ ฅ์ ํ๊ฒฝ ์ฌ์ด์ ์์ ํ ํฌ๋ช ์ฑ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
์ ํ๋ ์ ๊ทผ๋ฒ
ํ๋ ๊ณ ๊ธ ์ฌ์ฉ์๋ ์ง์ ์คํํ์ฌ ์๋์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ์กฐ๋ฆฝํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์์ง๋ง ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ์คํ๋๋๋ก ๊ณ ์๋์์ต๋๋ค. Cloister.Manager
๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋
์ ํธ๋ฆฌ์์.
์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์คํ๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์์ ์ฌ์ฉํฉ๋๋ค. 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
, ์ฉ๋ ์ผ๋ญ ์๋น์ค ๋ฐ๊ฒฌ ์ต์ XNUMX๊ฐ ์ด์์ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ๊ณ MyApp.Listener
๋ชจ๋(๊ตฌํ @behaviour Cloister.Listener
์ด ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ด ํ๋ ์์ง MyApp.Listener.on_state_change/2
%Cloister.Monitor{status: :up}
, ์ด๋ "์๋
ํ์ธ์, ํด๋ฌ์คํฐ๊ฐ ์กฐ๋ฆฝ๋์์ต๋๋ค."๋ฅผ ์๋ฏธํฉ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ค์น consensus: 3
๋ ๋ง์ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ๊ฒ์ผ๋ก ์์ํ๋๋ผ๋ ์ฝ๋ฐฑ์ ๊ณ์ ์งํ๋๋ฏ๋ก ์ต์ ์
๋๋ค. status: :rehashing
โ status: :up
์๋ก ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ๋
ธ๋์์.
๊ฐ๋ฐ ๋ชจ๋์์ ์์ํ ๋ ์ค์ ๋ง ํ๋ฉด ๋ฉ๋๋ค. consensus: 1
ะธ ํ๋ ๊ทธ๊ฐ ๋ณผ ๋ ํด๋ฌ์คํฐ ์กฐ๋ฆฝ์ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ ๊ธฐ๊บผ์ด ๊ฑด๋๋ธ ๊ฒ์
๋๋ค. :nonode@nohost
๋๋ :node@host
๋๋ :[email protected]
- ๋
ธ๋๊ฐ ๊ตฌ์ฑ๋ ๋ฐฉ์์ ๋ฐ๋ผ(:none | :shortnames | :longnames
).
๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌ
์ง๊ณต ์ํ๊ฐ ์๋ ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ถ์ฐ ์ข
์์ฑ์ด ํฌํจ๋ฉ๋๋ค. mnesia
. ๋์ผํ ์ฝ๋ฐฑ์์ ์ฌ๊ตฌ์ฑ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ฝ์ต๋๋ค. on_state_change/2
. ์๋ฅผ ๋ค์ด ๋ค์์ ์ฌ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์ค๋ช
์
๋๋ค. mnesia
์ฆ์์์
์ฌ์ฉ์ ์ฃผ์ ์ด์ ํ๋ ํ ํด๋ก์ง ๋ณ๊ฒฝ ํ ํด๋ฌ์คํฐ๋ฅผ ์ฌ๊ตฌ์ถํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์์
์ ์ํํ๋ค๋ ๊ฒ์
๋๋ค. ํ๋. ์ ํ๋ฆฌ์ผ์ด์
์ IP ์ฃผ์์ ๋
ธ๋ ์ด๋ฆ์ ๋ฏธ๋ฆฌ ์๊ณ ์๋์ง ๋๋ ๋์ ์ผ๋ก ํ ๋น/๋ณ๊ฒฝ๋์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ด๋ฏธ ์ค๋น๋ ๋ถ์ฐ ํ๊ฒฝ์์ ์คํ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ํน๋ณํ ๋์ปค ๊ตฌ์ฑ ์ค์ ์ด ์ ํ ํ์ํ์ง ์์ผ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์์ ๊ด์ ์์ ๋ถ์ฐ ํ๊ฒฝ์์ ์คํํ๊ฑฐ๋ ๋ก์ปฌ ํ๊ฒฝ์์ ์คํํ๋ ๊ฒ ์ฌ์ด์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. :nonode@nohost
. ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์์์ ์ฝ์ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ๊ตฌํ์ ํตํด ํ ํด๋ก์ง ๋ณ๊ฒฝ์ ๋ณต์กํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ง๋ง MyApp.Listener
, ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ ๋ฐ ๊ตฌ์ฑ ํธํฅ์ด ๊ตฌํ์ ์ด์์ด ๋๋ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๊ฐ ํญ์ ์์ ์ ์์ต๋๋ค. ๊ด์ฐฎ์ต๋๋ค. ์์ ๋ด์ฉ์ ๋ฐ๋ฅด์ธ์. libcluster
, ๋ณด๋ค ์ผ๋ฐ์ ์ธ ์ฉ๋๋ก ์ฌ์ฉํ๊ฑฐ๋ ํ์ ์์ค ํด๋ฌ์คํฐ๋ฅผ ์ง์ ์ฒ๋ฆฌํ ์๋ ์์ต๋๋ค. ์ด ์ฝ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชฉํ๋ ๊ฐ๋ฅํ ๋ชจ๋ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ด ์๋๋ผ, ๋ถํ์ํ ๊ณ ํต๊ณผ ๋ฒ๊ฑฐ๋ก์ด ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ ์์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์ฐธ๊ณ : ์ด ์์ ์์ ์๋ณธ์๋ "ํ๋ณตํ ํด๋ฌ์คํฐ๋ง!"์ด๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์์๊ณ ์ ๊ฐ ๋ฒ์ญํ Yandex์์๋(์ง์ ์ฌ์ ์ ๋ณผ ํ์๊ฐ ์์) "ํ๋ณตํ ํด๋ฌ์คํฐ๋ง!" ์ต์ ์ ์ ๊ณตํ์ต๋๋ค. ํนํ ํ์ฌ์ ์ง์ ํ์ ์ํฉ์ ๊ณ ๋ คํ ๋ ๋ ๋์ ๋ฒ์ญ์ ์์ํ๋ ๊ฒ์ ์๋ง๋ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
์ถ์ฒ : habr.com