Cloister → простоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ кластСром OTP

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ бизнСс-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ вступаСт Π² Ρ„Π°Π·Ρƒ, ΠΊΠΎΠ³Π΄Π° трСбуСтся Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΌΠΎΠΆΠ½ΠΎ просто Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΡΡ€Π΅Π΄Π½ΡŽΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ. Но Π±Ρ‹Π²Π°ΡŽΡ‚ ΠΈ ΠΌΠ΅Π½Π΅Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ случаи, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π½Ρ‹Π΅ Π½ΠΎΠ΄Ρ‹ Π·Π½Π°Π»ΠΈ Π΄Ρ€ΡƒΠ³ ΠΎ Π΄Ρ€ΡƒΠ³Π΅ ΠΈ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ распрСдСляли Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ.

Cloister → ΠΏΡ€ΠΎΡΡ‚ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ кластСром OTP

Π’Π°ΠΊ ΡƒΠ΄Π°Ρ‡Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ erlang, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ Π·Π° приятный синтаксис ΠΈ Ρ…Π°ΠΉΠΏ Π²ΠΎΠΊΡ€ΡƒΠ³, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠΊΠ»Π°ΡΡΠ½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ для распрСдСлСнных систСм. Π’ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ это Π·Π²ΡƒΡ‡ΠΈΡ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ:

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сообщСний ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΡƒΠ·Π»Π°Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ссылками ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Π° […]

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ всС Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС. РаспрСдСлСнный erlang Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½, ΠΊΠΎΠ³Π΄Π° Β«ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Β» ΠΎΠ·Π½Π°Ρ‡Π°Π» Ρ‚Π°ΠΊΠΎΠΉ большой ΠΆΠ΅Π»Π΅Π·Π½Ρ‹ΠΉ ящик для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ·ΠΊΠΈ, Π° Β«Π΄ΠΎΠΊΠ΅Ρ€Β» Π±Ρ‹Π» просто синонимом ΠΏΠΎΡ€Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°. Π’ IP4 Π±Ρ‹Π»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ нСзанятых адрСсов, Π² сСтСвых Ρ€Π°Π·Ρ€Ρ‹Π²Π°Ρ…Β β€” Π±Ρ‹Π»ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π³Ρ€Ρ‹Π·ΡˆΠΈΠ΅ кабСль крысы, Π° срСднСС врСмя Π±Π΅Π·ΠΎΡ‚ΠΊΠ°Π·Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ производствСнной систСмы ΠΈΠ·ΠΌΠ΅Ρ€ΡΠ»ΠΎΡΡŒ дСсятилСтиями.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ всС Π½Π΅Π²ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠΌΠΎ самодостаточны, ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Ρ‹, ΠΈ запускаСм распрСдСлСнный erlang Π² срСдС, Π³Π΄Π΅ динамичСскиС IP-адрСса Ρ€Π°Π·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ Π²Π΅Π»ΠΈΠΊΠΎΠΉ случайности, Π° ΡƒΠ·Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΈ ΠΈΡΡ‡Π΅Π·Π°Ρ‚ΡŒ ΠΏΠΎ ТСланию Π»Π΅Π²ΠΎΠΉ пятки ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²ΠΎΡ€ΠΎΡ…Π° шаблонного ΠΊΠΎΠ΄Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅ΠΌ распрСдСлСнный erlang, для Π±ΠΎΡ€ΡŒΠ±Ρ‹ с Π²Ρ€Π°ΠΆΠ΄Π΅Π±Π½ΠΎΠΉ срСдой, трСбуСтся ΠΏΠΎΠΌΠΎΡ‰ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: я Π² курсС Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ libcluster. Он Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΡ€ΡƒΡ‚ΠΎΠΉ, Ρƒ Π½Π΅Π³ΠΎ большС тысячи Π·Π²Π΅Π·Π΄, Π°Π²Ρ‚ΠΎΡ€Β β€” извСстСн Π² сообщСствС, ΠΈ всС Ρ‚Π°ΠΊΠΎΠ΅. Если Π²Π°ΠΌ достаточно ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Ρ… этим ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ способов создания ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ кластСра — я Ρ€Π°Π΄ Π·Π° вас. МнС, ΠΊ соТалСнию, Π½ΡƒΠΆΠ½ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС. Π― Ρ…ΠΎΡ‡Ρƒ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ настройкой Π² дСталях ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ сторонним Π·Ρ€ΠΈΡ‚Π΅Π»Π΅ΠΌ Π² Ρ‚Π΅Π°Ρ‚Ρ€Π΅ пСрСформирования кластСра.

ВрСбования

Π§Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈΡ‡Π½ΠΎ ΠΌΠ½Π΅, Ρ‚Π°ΠΊ это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая Π²ΠΎΠ·ΡŒΠΌΠ΅Ρ‚ Π½Π° сСбя ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ кластСром ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ свойствами:

  • прозрачная Ρ€Π°Π±ΠΎΡ‚Π° ΠΊΠ°ΠΊ с ТСстко Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ списком ΡƒΠ·Π»ΠΎΠ², Ρ‚Π°ΠΊ ΠΈ с динамичСским ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· сСрвисы erlang;
  • ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ колбэк ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ (ΡƒΠ·Π΅Π» Ρ‚ΡƒΠ΄Π°, ΡƒΠ·Π΅Π» сюда, Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ сСти, сплиты);
  • ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ интСрфСйс для запуска кластСра с Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΈ с :nonode@nohost;
  • ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π΄ΠΎΠΊΠ΅Ρ€Π° ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ, Π±Π΅Π· нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ инфраструктурный ΠΊΠΎΠ΄.

ПослСднСС ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ я протСстировал ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ локально Π² :nonode@nohost, ΠΈΠ»ΠΈ Π² искуствСнно-распрСдСлСнной срСдС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ test_cluster_task, я Ρ…ΠΎΡ‡Ρƒ просто Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ docker-compose up --scale my_app=3 ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ выполняСт Ρ‚Ρ€ΠΈ экзСмпляра Π² Π΄ΠΎΠΊΠ΅Ρ€Π΅ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΊΠΎΠ΄Π°. Π― Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ зависимыС прилоТСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ mnesiaΒ β€” ΠΊΠΎΠ³Π΄Π° топология измСняСтся, Π·Π° кулисами пСрСстраивали кластСр Π½Π°ΠΆΠΈΠ²ΡƒΡŽ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΈΠ½ΠΊΠ° со стороны прилоТСния.

Cloister Π½Π΅ задумывался ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, способная Π½Π° всС: ΠΎΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ кластСра Π΄ΠΎ приготовлСния ΠΊΠΎΡ„Π΅. Π­Ρ‚ΠΎ Π½Π΅ сСрСбряная пуля, стрСмящаяся ΠΎΡ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ случаи, ΠΈΠ»ΠΈ Π±Ρ‹Ρ‚ΡŒ акадСмичСски ΠΏΠΎΠ»Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π² Ρ‚ΠΎΠΌ смыслС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π΅ΠΎΡ€Π΅Ρ‚ΠΈΠΊΠΈ ΠΎΡ‚ CS Π²ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ Π² этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΡ€ΠΈΠ·Π²Π°Π½Π° ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎΠΉ Ρ†Π΅Π»ΠΈ, Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ свой Π½Π΅ слишком большой объСм Ρ€Π°Π±ΠΎΡ‚ идСально. Π­Ρ‚Π° Ρ†Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² обСспСчСнии ΠΏΠΎΠ»Π½ΠΎΠΉ прозрачности ΠΌΠ΅ΠΆΠ΄Ρƒ локальной срСдой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ распрСдСлСнной эластичной срСдой, ΠΏΠΎΠ»Π½ΠΎΠΉ Π²Ρ€Π°ΠΆΠ΄Π΅Π±Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ².

Π’Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

Cloister прСдполагаСтся Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, хотя ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со сборкой ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ (assembly and maintainance) кластСра Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, нСпосрСдствСнно запустив 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

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‹ΡˆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ дословно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: Cloister ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для OTP прилоТСния :my_app, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ erlang service discovery для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΡƒΠ·Π»ΠΎΠ², Ρ‚Ρ€Π΅Ρ… ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅, ΠΈ MyApp.Listener ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ @behaviour Cloister.Listener) настроСн ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ увСдомлСния ΠΎΠ± измСнСниях Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Cloister Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ поэтапно, откладывая процСсс старта Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ прилоТСния Π΄ΠΎ достиТСния консСнсуса (Ρ‚Ρ€ΠΈ ΡƒΠ·Π»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈ соСдинСны, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.) Π­Ρ‚ΠΎ прСдосталяСт Π³Π»Π°Π²Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»ΠΎΡΡŒ, кластСр ΡƒΠΆΠ΅ доступСн. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ (ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡƒΠ·Π»Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ синхронно), Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ MyApp.Listener.on_state_change/2. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΌΡ‹ выполняСм дСйствиС, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСниС с состояниСм %Cloister.Monitor{status: :up}, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: Β«Π°Π»Ρ‘, кластСр собран».

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв установка consensus: 3 являСтся ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ большС ΡƒΠ·Π»ΠΎΠ², ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· status: :rehashing β†’ status: :up Π½Π° любом Π½ΠΎΠ²ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠΌ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ ΡƒΠ·Π»Π΅.

ΠŸΡ€ΠΈ запускС Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, достаточно просто Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ consensus: 1 ΠΈ Cloister радостно проскочит ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ сборки кластСра, ΡƒΠ²ΠΈΠ΄Π΅Π² :nonode@nohost, ΠΈΠ»ΠΈ :node@host, ΠΈΠ»ΠΈ :[email protected]Β β€” Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π» настроСн ΡƒΠ·Π΅Π» (:none | :shortnames | :longnames).

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ распрСдСлСнными прилоТСниями

РаспрСдСлСнныС прилоТСния Π½Π΅ Π² Π²Π°ΠΊΡƒΡƒΠΌΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ распрСдСлСнныС ΠΆΠ΅ зависимости, Ρ‚ΠΈΠΏΠ° mnesia. Нам Π»Π΅Π³ΠΊΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° on_state_change/2. Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ mnesia Π½Π° Π»Π΅Ρ‚Ρƒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Cloister.

Π“Π»Π°Π²Π½Ρ‹ΠΌ прСимущСством использования Cloister являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ выполняСт всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ пСрСстройкС кластСра послС измСнСния Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ просто запускаСтся Π² ΡƒΠΆΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ распрСдСлСнной срСдС, со всСми ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ ΡƒΠ·Π»Π°ΠΌΠΈ, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π·Π½Π°Π΅ΠΌ Π»ΠΈ ΠΌΡ‹ IP-адрСса ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΠΌΠ΅Π½Π° ΡƒΠ·Π»ΠΎΠ² Π·Π°Ρ€Π°Π½Π΅Π΅, ΠΈΠ»ΠΈ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ динамичСски Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹/ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹. Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… настроСк ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠΊΠ΅Ρ€Π° ΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ запуском Π² распрСдСлСнной срСдС ΠΈΠ»ΠΈ Π² локальной Π½Π° :nonode@nohost. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ слоТная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Ρ‡Π΅Ρ€Π΅Π· ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ MyApp.Listener, всСгда ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅ случаи, ΠΊΠΎΠ³Π΄Π° эти ограничСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ прСдвзятый ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ окаТутся ΠΊΡ€Π°Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ°ΠΌΠ½Π΅ΠΌ Π½Π° ΠΏΡƒΡ‚ΠΈ внСдрСния. Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, просто Π²ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹ΠΉ libcluster, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π±ΠΎΠ»Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ, ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ кластСр Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. ЦСль этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΊΠΎΠ΄Π° состоит Π½Π΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ сцСнарии, Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнный сцСнарий Π±Π΅Π· Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΉ Π±ΠΎΠ»ΠΈ ΠΈ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΡ… ΠΊΠΎΠΏΠΈ-пастов.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π½Π° этом мСстС Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅ Π±Ρ‹Π»Π° Ρ„Ρ€Π°Π·Π° Β«Happy clustering!Β», ΠΈ ЯндСкс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ я ΠΏΠ΅Ρ€Π΅Π²ΠΎΠΆΡƒ (Π½Π΅ самому ΠΆΠ΅ ΠΏΠΎ словарям Π»Π°Π·ΠΈΡ‚ΡŒ), ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΌΠ½Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ «Бчастливого скоплСния!Β». Π›ΡƒΡ‡ΡˆΠ΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, особСнно Π² свСтС Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ гСополитичСской ситуации — ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ