рдХреНрд▓реЛрд╕реНрдЯрд░ тЖТ рд╕рд╛рдзреЗ OTP рдХреНрд▓рд╕реНрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди

рдЬрд╡рд│рдЬрд╡рд│ рдкреНрд░рддреНрдпреЗрдХ рдпрд╢рд╕реНрд╡реА рд╡реНрдпрд╡рд╕рд╛рдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд╡рдХрд░ рдХрд┐рдВрд╡рд╛ рдирдВрддрд░ рдЕрд╢рд╛ рдЯрдкреНрдкреНрдпрд╛рдд рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЛ рдЬреЗрдереЗ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ. рдмрд░реНтАНрдпрд╛рдЪ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рддреБрдореНрд╣реА рдлрдХреНрдд рдПрдХ рдирд╡реАрди рдЙрджрд╛рд╣рд░рдг рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рд▓реЛрдб рд╕рд░рд╛рд╕рд░реА рдХрдореА рдХрд░реВ рд╢рдХрддрд╛. рдкрд░рдВрддреБ рдЕрд╢реА рдХрд╛рд╣реА рдХреНрд╖реБрд▓реНрд▓рдХ рдкреНрд░рдХрд░рдгреЗ рджреЗрдЦреАрд▓ рдЖрд╣реЗрдд рдЬрд┐рдереЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдХреА рднрд┐рдиреНрди рдиреЛрдбреНрд╕ рдПрдХрдореЗрдХрд╛рдВрдмрджреНрджрд▓ рдЬрд╛рдгреВрди рдШреЗрддрд╛рдд рдЖрдгрд┐ рдХрд╛рд░реНрдпрднрд╛рд░ рдХрд╛рд│рдЬреАрдкреВрд░реНрд╡рдХ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛рдд.

рдХреНрд▓реЛрд╕реНрдЯрд░ тЖТ рд╕рд╛рдзреЗ OTP рдХреНрд▓рд╕реНрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди

рддреЛ рдЗрддрдХрд╛ рднрд╛рдЧреНрдпрд╡рд╛рди рдирд┐рдШрд╛рд▓рд╛ рдХреА рдПрд░рд▓рд╛рдВрдЧ, рдЬреЗ рдЖрдореНрд╣реА рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдирдВрджрджрд╛рдпреА рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рднреЛрд╡рддрд╛рд▓рдЪреНрдпрд╛ рдкреНрд░рдЪрд╛рд░рд╛рд╕рд╛рдареА рдирд┐рд╡рдбрд▓реЗ рдЖрд╣реЗ, рддреНрдпрд╛рд▓рд╛ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдЖрд╣реЗ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдВрд╕рд╛рдареА рд╕рдорд░реНрдерди. рд╕рд┐рджреНрдзрд╛рдВрддрддрдГ, рд╣реЗ рдкреВрд░реНрдгрдкрдгреЗ рдХреНрд╖реБрд▓реНрд▓рдХ рд╡рд╛рдЯрддреЗ:

рдирд┐рд░рдирд┐рд░рд╛рд│реНрдпрд╛ рдиреЛрдбреНрд╕рд╡рд░реАрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрджрд░рдореНрдпрд╛рди рддрд╕реЗрдЪ рд▓рд┐рдВрдХреНрд╕ рдЖрдгрд┐ рдореЙрдирд┐рдЯрд░реНрд╕рдордзреАрд▓ рд╕рдВрджреЗрд╢ рдкрд╛рд░рджрд░реНрд╢рдХ рдЖрд╣реЗ [тАж]

рд╕рд░рд╛рд╡ рдордзреНрдпреЗ, рд╕рд░реНрд╡рдХрд╛рд╣реА рдереЛрдбреЗ рдЕрдзрд┐рдХ рдХреНрд▓рд┐рд╖реНрдЯ рдЖрд╣реЗ. рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓реЗ рдПрд░рд▓рд╛рдВрдЧ рдЬреЗрд╡реНрд╣рд╛ "рдХрдВрдЯреЗрдирд░" рдЪрд╛ рдЕрд░реНрде рд╢рд┐рдкрд┐рдВрдЧрд╕рд╛рдареА рдПрдХ рдореЛрдард╛ рд▓реЛрдЦрдВрдбреА рдмреЙрдХреНрд╕ рд╣реЛрддрд╛ рддреЗрд╡реНрд╣рд╛ рд╡рд┐рдХрд╕рд┐рдд рдЭрд╛рд▓рд╛ рдЖрдгрд┐ "рдбреЙрдХрд░" рд╣рд╛ рдлрдХреНрдд рд▓рд╛рдБрдЧрд╢реЛрд░рдордирд╕рд╛рдареА рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрдж рд╣реЛрддрд╛. IN IP4 рддреЗрдереЗ рдмрд░реЗрдЪ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдкрддреНрддреЗ рд╣реЛрддреЗ, рдиреЗрдЯрд╡рд░реНрдХ рдЦрдВрдбрд┐рдд рд╣реЛрдгреЗ рд╕рд╛рдорд╛рдиреНрдпрдд: рдЙрдВрджрд░рд╛рдВрдиреА рдХреЗрдмрд▓ рдЪрдШрд│рд▓реНрдпрд╛рдореБрд│реЗ рд╣реЛрддреЗ рдЖрдгрд┐ рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реАрдЪрд╛ рд╕рд░рд╛рд╕рд░реА рдЕрдкрдЯрд╛рдЗрдо рджрд╢рдХрд╛рдВрдордзреНрдпреЗ рдореЛрдЬрд▓рд╛ рдЧреЗрд▓рд╛.

рдЖрддрд╛ рдЖрдореНрд╣реА рд╕рд░реНрд╡ рдЖрд╢реНрдЪрд░реНрдпрдХрд╛рд░рдХрдкрдгреЗ рд╕реНрд╡рдпрдВрдкреВрд░реНрдг, рдкреЕрдХреЗрдЬ рдХреЗрд▓реЗрд▓реЗ рдЖрдгрд┐ рд╡рд┐рддрд░рд┐рдд рд╡рд┐рддрд░рд┐рдд рдЖрд╣реЛрдд рдПрд░рд▓рд╛рдВрдЧ рдЕрд╢рд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЬрд┐рдереЗ рдбрд╛рдпрдиреЕрдорд┐рдХ рдЖрдпрдкреА рдкрддреНрддреЗ рдЙрддреНрдХреГрд╖реНрдЯ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддреЗрдЪреНрдпрд╛ рддрддреНрддреНрд╡рд╛рд╡рд░ рджрд┐рд▓реЗ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рд╢реЗрдбреНрдпреБрд▓рд░рдЪреНрдпрд╛ рдбрд╛рд╡реНрдпрд╛ рдЯрд╛рдЪрд╛рдВрдЪреНрдпрд╛ рд▓рд╣рд░реАрдиреБрд╕рд╛рд░ рдиреЛрдб рджрд┐рд╕реВ рд╢рдХрддрд╛рдд рдЖрдгрд┐ рдЕрджреГрд╢реНрдп рд╣реЛрдК рд╢рдХрддрд╛рдд. рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд▓реНрдкрд╛рдд рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдбрдЪреЗ рдвреАрдЧ рдЯрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА рдПрд░рд▓рд╛рдВрдЧ, рдкреНрд░рддрд┐рдХреВрд▓ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдЪрд╛ рд╕рд╛рдордирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдорджрдд рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рд╢реЗрд░рд╛: рдЖрд╣реЗ рдпрд╛рдЪреА рдорд▓рд╛ рдЬрд╛рдгреАрд╡ рдЖрд╣реЗ libcluster. рд╣реЗ рдЦрд░реЛрдЦрд░ рдЫрд╛рди рдЖрд╣реЗ, рддреНрдпрд╛рдд рд╣рдЬрд╛рд░рд╛рд╣реВрди рдЕрдзрд┐рдХ рддрд╛рд░реЗ рдЖрд╣реЗрдд, рд▓реЗрдЦрдХ рд╕рдорд╛рдЬрд╛рдд рдкреНрд░рд╕рд┐рджреНрдз рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рд╕рд░реНрд╡. рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рджреЗрдЦрд░реЗрдЦ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдпрд╛ рдкреЕрдХреЗрдЬрджреНрд╡рд╛рд░реЗ рдСрдлрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкрджреНрдзрддреА рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдкреБрд░реЗрд╢рд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдореА рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдЖрдирдВрджреА рдЖрд╣реЗ. рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рдорд▓рд╛ рдЖрдгрдЦреА рдмрд░реЗрдЪ рдХрд╛рд╣реА рд╣рд╡реЗ рдЖрд╣реЗ. рдорд▓рд╛ рд╕реЗрдЯрдЕрдкрд╡рд░ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдареЗрд╡рд╛рдпрдЪреЗ рдЖрд╣реЗ рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдкреБрдирд░реНрд░рдЪрдиреЗрдЪреНрдпрд╛ рдерд┐рдПрдЯрд░рдордзреНрдпреЗ рдмрд╛рд╣реЗрд░рдЪрд╛ рдкреНрд░реЗрдХреНрд╖рдХ рд╣реЛрдК рдирдпреЗ.

рдЖрд╡рд╢реНрдпрдХрддрд╛

рдорд▓рд╛ рд╡реИрдпрдХреНрддрд┐рдХрд░рд┐рддреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдЪреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдШреЗрдгрд╛рд░реА рд▓рд╛рдпрдмреНрд░рд░реА рд╣реЛрддреА рдЖрдгрд┐ рддреНрдпрд╛рдд рдЦрд╛рд▓реАрд▓ рдЧреБрдгрдзрд░реНрдо рдЕрд╕рддреАрд▓:

  • рдиреЛрдбреНрд╕рдЪреА рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдпрд╛рджреА рдЖрдгрд┐ рд╕реЗрд╡рд╛рдВрджреНрд╡рд╛рд░реЗ рдбрд╛рдпрдиреЕрдорд┐рдХ рд╢реЛрдз рдпрд╛ рджреЛрдиреНрд╣реАрд╕рд╣ рдкрд╛рд░рджрд░реНрд╢рдХ рдХрд╛рд░реНрдп рдПрд░рд▓рд╛рдВрдЧ;
  • рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдкреЛрд▓реЙрдЬреА рдмрджрд▓рд╛рд╕рд╛рдареА рдкреВрд░реНрдгрдкрдгреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЙрд▓рдмреЕрдХ (рдиреЛрдб рддреЗрдереЗ, рдиреЛрдб рдпреЗрдереЗ, рдиреЗрдЯрд╡рд░реНрдХ рдЕрд╕реНрдерд┐рд░рддрд╛, рд╡рд┐рднрд╛рдЬрди);
  • рд▓рд╛рдВрдм рдЖрдгрд┐ рд▓рд╣рд╛рди рдирд╛рд╡рд╛рдВрд╕рд╣ рдХреНрд▓рд╕реНрдЯрд░ рд▓реЙрдиреНрдЪ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рд░рджрд░реНрд╢рдХ рдЗрдВрдЯрд░рдлреЗрд╕, рдЬрд╕реЗ рдХреА :nonode@nohost;
  • рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛ рдХреЛрдб рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдбреЙрдХрд░ рд╕рдкреЛрд░реНрдЯ рдСрдл рдж рдмреЙрдХреНрд╕.

рдирдВрддрд░рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рдореА рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА рдЪрд╛рдЪрдгреА рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ :nonode@nohost, рдХрд┐рдВрд╡рд╛ рд╡рд╛рдкрд░реВрди рдХреГрддреНрд░рд┐рдорд░рд┐рддреНрдпрд╛ рд╡рд┐рддрд░рд┐рдд рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд test_cluster_task, рдорд▓рд╛ рдлрдХреНрдд рдзрд╛рд╡рд╛рдпрдЪреЗ рдЖрд╣реЗ docker-compose up --scale my_app=3 рдЖрдгрд┐ рддреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рдХреЛрдб рдмрджрд▓рд╛рд╢рд┐рд╡рд╛рдп рдбреЙрдХрд░рдордзреНрдпреЗ рддреАрди рдШрдЯрдирд╛ рдХрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рддреЗ рдкрд╣рд╛. рдорд▓рд╛ рд╕рд╛рд░рдЦреЗ рдЖрд╢реНрд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреЗрдЦреАрд▓ рд╣рд╡реЗ рдЖрд╣реЗрдд 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, рд╡рд╛рдкрд░рддреЗ erlang рд╕реЗрд╡рд╛ рд╢реЛрдз рдиреЛрдбреНрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдХрд┐рдорд╛рди рддреАрди, рдЖрдгрд┐ 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, рдЬреЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢ рдЖрд╣реЗ, рдХрд┐рдВрд╡рд╛ рдЕрдЧрджреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрд╡рддрдГ рд╣рд╛рддрд╛рд│рд╛. рдпрд╛ рдХреЛрдб рд▓рд╛рдпрдмреНрд░рд░реАрдЪреЗ рдЙрджреНрджрд┐рд╖реНрдЯ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡реНрдп рдкрд░рд┐рд╕реНрдерд┐рддреАрд▓рд╛ рдХрд╡реНрд╣рд░ рдХрд░рдгреЗ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡реЗрджрдирд╛ рдЖрдгрд┐ рдЕрд╡рдЬрдб рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рди рдХрд░рддрд╛ рд╕рд░реНрд╡рд╛рдд рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддреА рд╡рд╛рдкрд░рдгреЗ рд╣реЗ рдЖрд╣реЗ.

рдЯреАрдк: рдореВрд│рдЪреНрдпрд╛ рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ "рд╣реЕрдкреА рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ!" рд╣рд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╣реЛрддрд╛ рдЖрдгрд┐ рдпрд╛рдВрдбреЗрдХреНрд╕, рдЬреНрдпрд╛рдЪрд╛ рдореА рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЛ (рдорд▓рд╛ рд╕реНрд╡рдд: рд╢рдмреНрджрдХреЛрд╖рд╛рдВрдордзреВрди рдЬрд╛рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА), рдорд▓рд╛ "рд╣реЕрдкреА рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ!" рд╣рд╛ рдкрд░реНрдпрд╛рдп рдСрдлрд░ рдХреЗрд▓рд╛. рд╡рд┐рд╢реЗрд╖рдд: рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рднреВ-рд░рд╛рдЬрдХреАрдп рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреНрдпрд╛ рдкреНрд░рдХрд╛рд╢рд╛рдд, рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдЕрдиреБрд╡рд╛рджрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░рдгреЗ рдХрджрд╛рдЪрд┐рдд рдЕрд╢рдХреНрдп рдЖрд╣реЗ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛