рддреЗрд░реНрд╕реЛ memcached рдорд╛рдкрди рдЧрд░реНрди mcrouter рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

рддреЗрд░реНрд╕реЛ memcached рдорд╛рдкрди рдЧрд░реНрди mcrouter рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

рдХреБрдиреИ рдкрдирд┐ рднрд╛рд╖рд╛рдорд╛ рдЙрдЪреНрдЪ-рд▓реЛрдб рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрди рд╡рд┐рд╢реЗрд╖ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдХрд░рдгрд╣рд░реВрдХреЛ рдкреНрд░рдпреЛрдЧ рдЪрд╛рд╣рд┐рдиреНрдЫ, рддрд░ рдЬрдм рдпреЛ PHP рдорд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдЖрдЙрдБрдЫ, рд╕реНрдерд┐рддрд┐ рдпрддрд┐ рдмрд┐рдЧреНрд░рди рд╕рдХреНрдЫ рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреБрдкрд░реНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЖрдлреНрдиреИ рдЖрд╡реЗрджрди рд╕рд░реНрднрд░ред рдпрд╕ рдиреЛрдЯрдорд╛ рд╣рд╛рдореА рдореЗрдордХреНрдпрд╛рдЪрдорд╛ рд╡рд┐рддрд░рд┐рдд рд╕рддреНрд░ рднрдгреНрдбрд╛рд░рдг рд░ рдбрд╛рдЯрд╛ рдХреНрдпрд╛рд╕рд┐рдЩрд╕рдБрдЧ рдкрд░рд┐рдЪрд┐рдд рдкреАрдбрд╛ рд░ рд╣рд╛рдореАрд▓реЗ рдПрдЙрдЯрд╛ "рд╡рд╛рд░реНрдб" рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдХрд╕рд░реА рдпреА рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдпреМрдВ рднрдиреНрдиреЗ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВред

рдЕрд╡рд╕рд░рдХреЛ рдирд╛рдпрдХ рд╕рд┐рдореНрдлрдиреА 2.3 рдлреНрд░реЗрдорд╡рд░реНрдХрдорд╛ рдЖрдзрд╛рд░рд┐рдд PHP рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЛ, рдЬреБрди рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрдиреЗ рд╡реНрдпрд╛рдкрд╛рд░ рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЫреИрдиред рдзреЗрд░реИ рдорд╛рдирдХ рд╕рддреНрд░ рднрдгреНрдбрд╛рд░рдг рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдкреВрд░рд╛ рдЙрдкрдпреЛрдЧ рдЧрд░реНрдпреЛ "рд╕рдмреИ рдХреБрд░рд╛ рдХреНрдпрд╛рд╕" рдиреАрддрд┐ memcached рдорд╛: рдбрд╛рдЯрд╛рдмреЗрд╕ рд░ API рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╣рд░реВ, рд╡рд┐рднрд┐рдиреНрди рдЭрдгреНрдбрд╛рд╣рд░реВ, рдХреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд▓рдХрд╣рд░реВ рд░ рдЕрдзрд┐рдХред рдпрд╕реНрддреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, memcached рдХреЛ рдПрдХ рдмреНрд░реЗрдХрдбрд╛рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд▓рд╛рдЧрд┐ рдШрд╛рддрдХ рд╣реБрдиреНрдЫред рдердк рд░реВрдкрдорд╛, рдХреНрдпрд╛рд╕ рд╣рд╛рдирд┐рд▓реЗ рдЧрдореНрднреАрд░ рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рдирд┐рдореНрддреНрдпрд╛рдЙрдБрдЫ: DBMS рд╕рд┐рдорд╣рд░реВрдорд╛ рдлреБрдЯреНрди рдерд╛рд▓реНрдЫ, API рд╕реЗрд╡рд╛рд╣рд░реВрд▓реЗ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкреНрд░рддрд┐рдмрдиреНрдз рдЧрд░реНрди рдерд╛рд▓реНрдЫ, рдЖрджрд┐ред рд╕реНрдерд┐рддрд┐ рд╕реНрдерд┐рд░ рдЧрд░реНрди рджрд╕реМрдВ рдорд┐рдиреЗрдЯ рд▓рд╛рдЧреНрди рд╕рдХреНрдЫ, рд░ рдпрд╕ рд╕рдордпрдорд╛ рд╕реЗрд╡рд╛ рднрдпрд╛рдирдХ рдврд┐рд▓реЛ рд╡рд╛ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реБрдиреЗрдЫред

рд╣рд╛рдореАрд▓реЗ рдЙрдкрд▓рдмреНрдз рдЧрд░рд╛рдЙрдиреБ рдкрд░реНрдпреЛ рдереЛрд░реИ рдкреНрд░рдпрд╛рд╕рдХреЛ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд▓рд╛рдИ рддреЗрд░реНрд╕реЛ рдорд╛рдкрди рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛, рдЕрд░реНрдерд╛рддреН рд╕реНрд░реЛрдд рдХреЛрдбрдорд╛ рдиреНрдпреВрдирддрдо рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд░ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реБрд░рдХреНрд╖рд┐рддред рдХреНрдпрд╛рд╕рд▓рд╛рдИ рд╡рд┐рдлрд▓рддрд╛рдХреЛ рдкреНрд░рддрд┐рд░реЛрдзреА рдорд╛рддреНрд░ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН, рддрд░ рдпрд╕рдмрд╛рдЯ рдбреЗрдЯрд╛ рд╣рд╛рдирд┐ рдХрдо рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

memcached рдЖрдлреИрдорд╛ рдХреЗ рдЧрд▓рдд рдЫ?

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, PHP рдХреЛ рд▓рд╛рдЧрд┐ memcached рд╡рд┐рд╕реНрддрд╛рд░рд▓реЗ рдмрд╛рдХрд╕ рдмрд╛рд╣рд┐рд░ рд╡рд┐рддрд░рд┐рдд рдбрд╛рдЯрд╛ рд░ рд╕рддреНрд░ рднрдгреНрдбрд╛рд░рдг рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рд╕реБрд╕рдВрдЧрдд рдХреБрдЮреНрдЬреА рд╣реНрдпрд╛рд╕рд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдВрдпрдиреНрддреНрд░рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдзреЗрд░реИ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рд╕рдорд╛рди рд░реВрдкрдорд╛ рдбреЗрдЯрд╛ рд░рд╛рдЦреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рд╕рдореВрд╣рдмрд╛рдЯ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд░реНрднрд░рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреБрдЮреНрдЬреАрд▓рд╛рдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдкрдорд╛ рд╕рдореНрдмреЛрдзрди рдЧрд░реНрджреИ, рд░ рдмрд┐рд▓реНрдЯ-рдЗрди рдлреЗрд▓рдУрднрд░ рдЙрдкрдХрд░рдгрд╣рд░реВрд▓реЗ рдХреНрдпрд╛рд╕рд┐рдЩ рд╕реЗрд╡рд╛рдХреЛ рдЙрдЪреНрдЪ рдЙрдкрд▓рдмреНрдзрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрджрдЫ (рддрд░, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдбрд╛рдЯрд╛ рдЫреИрди).

рд╕рддреНрд░ рднрдгреНрдбрд╛рд░рдгрдХреЛ рд╕рд╛рде рдЪреАрдЬрд╣рд░реВ рдереЛрд░реИ рд░рд╛рдореНрд░реЛ рдЫрдиреН: рддрдкрд╛рдЗрдБ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ memcached.sess_number_of_replicas, рдЬрд╕рдХреЛ рдлрд▓рд╕реНрд╡рд░реВрдк рдбрд╛рдЯрд╛ рдПрдХреИ рдкрдЯрдХ рдзреЗрд░реИ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдиреЗрдЫ, рд░ рдПрдЙрдЯрд╛ рдореЗрдордХреНрдпрд╛рдЪ рдЧрд░рд┐рдПрдХреЛ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╡рд┐рдлрд▓рддрд╛рдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдбрд╛рдЯрд╛ рдЕрд░реВрдмрд╛рдЯ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рд╣реБрдиреЗрдЫред рдпрджреНрдпрдкрд┐, рдпрджрд┐ рд╕рд░реНрднрд░ рдбрд╛рдЯрд╛ рдмрд┐рдирд╛ рдиреИ рдЕрдирд▓рд╛рдЗрди рдлрд░реНрдХрдиреНрдЫ (рдЬрд╕реНрддреИ рдкреБрди: рд╕реБрд░реБ рднрдПрдкрдЫрд┐ рд╣реБрдиреНрдЫ), рдХреЗрд╣реА рдХреБрдЮреНрдЬреАрд╣рд░реВ рдпрд╕рдХреЛ рдкрдХреНрд╖рдорд╛ рдкреБрди: рд╡рд┐рддрд░рдг рдЧрд░рд┐рдиреЗрдЫред рд╡рд╛рд╕реНрддрд╡рдорд╛ рдпреЛ рдорддрд▓рдм рд╣реБрдиреЗрдЫ рд╕рддреНрд░ рдбрд╛рдЯрд╛ рдХреЛ рд╣рд╛рдирд┐рдЫреБрдЯреЗрдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдЕрд░реНрдХреЛ рдкреНрд░рддрд┐рдХреГрддрд┐рдорд╛ "рдЬрд╛рдиреБрд╣реЛрд╕реН" рдХреЛ рдХреБрдиреИ рддрд░рд┐рдХрд╛ рдЫреИрдиред

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

рдЖрджрд░реНрд╢ рд░реВрдкрдорд╛ рдпреЛ рдЖрд╡рд╢реНрдпрдХ рдерд┐рдпреЛ memcached рд░ рдмрд╛рдЗрдкрд╛рд╕ рдкреНрд░рддрд┐рдХреГрддрд┐рд╣рд░реВрдорд╛ рд░реЗрдХрд░реНрдбрд╣рд░реВрдХреЛ рдкреНрд░рддрд┐рдХреГрддрд┐ рдЧрд▓реНрддреА рд╡рд╛ рдЧрд▓реНрддреА рдХреЛ рдорд╛рдорд▓рд╛ рдорд╛ред рд╣рд╛рдореАрд▓рд╛рдИ рдпреЛ рд░рдгрдиреАрддрд┐ рд▓рд╛рдЧреВ рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдпреЛ mcrouter.

mcrouter

рдпреЛ рдлреЗрд╕рдмреБрдХ рджреНрд╡рд╛рд░рд╛ рдпрд╕рдХреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рд╡рд┐рдХрд╕рд┐рдд рдПрдХ memcached рд░рд╛рдЙрдЯрд░ рд╣реЛред рдпрд╕рд▓реЗ memcached рдкрд╛рда рдкреНрд░реЛрдЯреЛрдХрд▓ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ, рдЬрд╕рд▓реЗ рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ рд╕реНрдХреЗрд▓ memcached рд╕реНрдерд╛рдкрдирд╛рд╣рд░реВ рдкрд╛рдЧрд▓ рдЕрдиреБрдкрд╛рддрдорд╛ред mcrouter рдХреЛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдорд╛ рдкрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ рдпреЛ рдШреЛрд╖рдгрд╛ред рдЕрдиреНрдп рдЪреАрдЬрд╣рд░реВ рдмреАрдЪ рд╡реНрдпрд╛рдкрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдпрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреЗ рдХреБрд░рд╛ рдЧрд░реНрди рд╕рдХреНрдЫ:

  • рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд░реЗрдХрд░реНрдб;
  • рдпрджрд┐ рддреНрд░реБрдЯрд┐ рднрдпреЛ рднрдиреЗ рд╕рдореВрд╣рдорд╛ рдЕрдиреНрдп рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рдлрд▓рдмреНрдпрд╛рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рдХрд╛рдордорд╛ рд▓рд╛рдЧреНрдиреБрд╣реЛрд╕реН!

mcrouter рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

рдо рд╕рд┐рдзреИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдЬрд╛рдиреНрдЫреБ:

{
 "pools": {
   "pool00": {
     "servers": [
       "mc-0.mc:11211",
       "mc-1.mc:11211",
       "mc-2.mc:11211"
   },
   "pool01": {
     "servers": [
       "mc-1.mc:11211",
       "mc-2.mc:11211",
       "mc-0.mc:11211"
   },
   "pool02": {
     "servers": [
       "mc-2.mc:11211",
       "mc-0.mc:11211",
       "mc-1.mc:11211"
 },
 "route": {
   "type": "OperationSelectorRoute",
   "default_policy": "AllMajorityRoute|Pool|pool00",
   "operation_policies": {
     "get": {
       "type": "RandomRoute",
       "children": [
         "MissFailoverRoute|Pool|pool02",
         "MissFailoverRoute|Pool|pool00",
         "MissFailoverRoute|Pool|pool01"
       ]
     }
   }
 }
}

рдХрд┐рди рддреАрди рдкреЛрдЦрд░реА? рд╕рд░реНрднрд░рд╣рд░реВ рдХрд┐рди рджреЛрд╣реЛрд░реНрдпрд╛рдЗрдиреНрдЫ? рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреБрд╣реЛрд╕реНред

  • рдпрд╕ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛, mcrouter рд▓реЗ рдЕрдиреБрд░реЛрдз рдЖрджреЗрд╢рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдЕрдиреБрд░реЛрдз рдкрдард╛рдЗрдиреЗ рдорд╛рд░реНрдЧ рдЪрдпрди рдЧрд░реНрджрдЫред рдХреЗрдЯрд╛рд▓реЗ рдЙрд╕рд▓рд╛рдИ рдпреЛ рднрдиреНрдЫ OperationSelectorRoute.
  • GET рдЕрдиреБрд░реЛрдзрд╣рд░реВ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рдорд╛ рдЬрд╛рдиреНрдЫрдиреН RandomRouteрдЬреЛ рдЕрдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдПрд░реЗ рд╡рд╕реНрддреБрд╣рд░реВ рдмреАрдЪ рдкреВрд▓ рд╡рд╛ рдорд╛рд░реНрдЧ рдЪрдпрди рдЧрд░реНрджрдЫ childrenред рдпрд╕ рдПрд░реЗрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдПрдХ рд╣реНрдпрд╛рдиреНрдбрд▓рд░ рд╣реЛ MissFailoverRoute, рдЬреБрди рдкреЛрдЦрд░реАрдорд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрднрд░ рдорд╛рд░реНрдлрдд рдЬрд╛рдиреНрдЫ рдЬрдмрд╕рдореНрдо рдпрд╕рд▓реЗ рдбреЗрдЯрд╛рдХреЛ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджреИрди, рдЬреБрди рдЧреНрд░рд╛рд╣рдХрд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдЧрд░рд┐рдиреЗрдЫред
  • рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдпреМрдВ рднрдиреЗ MissFailoverRoute рддреАрди рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рдкреВрд▓рдХреЛ рд╕рд╛рде, рддреНрдпрд╕рдкрдЫрд┐ рд╕рдмреИ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкрд╣рд┐рд▓реЛ рдореЗрдордХреНрдпрд╛рдЪ рдЧрд░рд┐рдПрдХреЛ рдЙрджрд╛рд╣рд░рдгрдорд╛ рдЖрдЙрдБрдЫрдиреН, рд░ рдмрд╛рдБрдХреАрд▓реЗ рдбреЗрдЯрд╛ рдирднрдПрдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдЕрд╡рд╢рд┐рд╖реНрдЯ рдЖрдзрд╛рд░рдорд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫрдиреНред рдпрд╕реНрддреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрд▓реЗ рдиреЗрддреГрддреНрд╡ рдЧрд░реНрдиреЗрдЫ рд╕реВрдЪреАрдорд╛ рдкрд╣рд┐рд▓реЛ рд╕рд░реНрднрд░рдорд╛ рдЕрддреНрдпрдзрд┐рдХ рд▓реЛрдб, рддреНрдпрд╕реИрд▓реЗ рдпреЛ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреНрд░рдо рдорд╛ рдареЗрдЧрд╛рдирд╛ рд╕рдВрдЧ рддреАрди рдкреВрд▓ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд░ рдЕрдирд┐рдпрдорд┐рдд рдЪрдпрди рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░рд┐рдпреЛред
  • рдЕрдиреНрдп рд╕рдмреИ рдЕрдиреБрд░реЛрдзрд╣рд░реВ (рд░ рдпреЛ рд░реЗрдХрд░реНрдб рд╣реЛ) рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдкреНрд░рд╢реЛрдзрди рдЧрд░рд┐рдиреНрдЫ AllMajorityRouteред рдпреЛ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд▓реЗ рдкреВрд▓рдорд╛ рднрдПрдХрд╛ рд╕рдмреИ рд╕рд░реНрднрд░рд╣рд░реВрд▓рд╛рдИ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкрдард╛рдЙрдБрдЫ рд░ рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдХрдореНрддрд┐рдорд╛ N/2 + 1 рдмрд╛рдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреНрдЫред рдкреНрд░рдпреЛрдЧрдмрд╛рдЯ AllSyncRoute рдпрд╕ рд╡рд┐рдзрд┐рдмрд╛рдЯ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд╣рд┐рдиреЗ рд╣реБрдирд╛рд▓реЗ рд▓реЗрдЦрди рдХрд╛рд░реНрдпрд╣рд░реВ рддреНрдпрд╛рдЧреНрдиреБрдкрд░реНрдиреЗ рдерд┐рдпреЛ ╨▓╤Б╨╡╤Е рд╕рдореВрд╣рдорд╛ рд╕рд░реНрднрд░рд╣рд░реВ - рдЕрдиреНрдпрдерд╛ рдпреЛ рдлрд┐рд░реНрддрд╛ рд╣реБрдиреЗрдЫ SERVER_ERRORред рдпрджреНрдпрдкрд┐ mcrouter рд▓реЗ рдбрд╛рдЯрд╛ рдЙрдкрд▓рдмреНрдз рдХреНрдпрд╛рд╕рд╣рд░реВрдорд╛ рдердкреНрдиреЗрдЫ, рдХрд▓рд┐рдЩ PHP рдкреНрд░рдХрд╛рд░реНрдп рддреНрд░реБрдЯрд┐ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗрдЫ рд░ рд╕реВрдЪрдирд╛ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреЗрдЫред AllMajorityRoute рдпрддрд┐ рдХрдбрд╛ рдЫреИрди рд░ рдорд╛рдерд┐ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХрд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдмрд┐рдирд╛ рдиреИ рдЖрдзрд╛ рдПрдХрд╛рдЗрд╣рд░реВрд▓рд╛рдИ рд╕реЗрд╡рд╛рдмрд╛рдЯ рдмрд╛рд╣рд┐рд░ рдирд┐рдХрд╛рд▓реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рдореБрдЦреНрдп рд╣рд╛рдирд┐ рдпреЛ рдпреЛрдЬрдирд╛ рдпреЛ рд╣реЛ рдХрд┐ рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреНрдпрд╛рд╕рдорд╛ рд╕рд╛рдБрдЪреНрдЪреИ рдХреБрдиреИ рдбрд╛рдЯрд╛ рдЫреИрди рднрдиреЗ, рдЧреНрд░рд╛рд╣рдХ N рдмрд╛рдЯ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдзрдХреЛ рд▓рд╛рдЧрд┐ memcached рд▓рд╛рдИ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗрдЫ - рдХреЛ рд╕рдмреИрд▓рд╛рдИ рдкреЛрдЦрд░реАрдорд╛ рд╕рд░реНрднрд░рд╣рд░реВред рд╣рд╛рдореА рдкреВрд▓рд╣рд░реВрдорд╛ рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдШрдЯрд╛рдЙрди рд╕рдХреНрдЫреМрдВ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рджреБрдИрдорд╛: рднрдгреНрдбрд╛рд░рдг рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛рдХреЛ рдмрд▓рд┐рджрд╛рди, рд╣рд╛рдореА рдкрд╛рдЙрдБрдЫреМрдВ╨╛рдЕрдиреБрд░реЛрдзрдмрд╛рдЯ рд╣рд░рд╛рдЗрд░рд╣реЗрдХреЛ рдХреБрдЮреНрдЬреАрд╣рд░реВрдорд╛ рдЙрдЪреНрдЪ рдЧрддрд┐ рд░ рдХрдо рд▓реЛрдбред

NB: рддрдкрд╛рдИрд▓реЗ mcrouter рд╕рд┐рдХреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдЩреНрдХрд╣рд░реВ рдкрдирд┐ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд╡рд┐рдХрд┐рдорд╛ рдХрд╛рдЧрдЬрд╛рдд ╨╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореБрджреНрджрд╛рд╣рд░реВ (рдмрдиреНрдж рднрдПрдХрд╛рд╣рд░реВ рд╕рд╣рд┐рдд), рд╡рд┐рднрд┐рдиреНрди рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВрдХреЛ рд╕рдореНрдкреВрд░реНрдг рднрдгреНрдбрд╛рд░рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджреИред

рдирд┐рд░реНрдорд╛рдг рд░ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ mcrouter

рд╣рд╛рдореНрд░реЛ рдПрдкреНрд▓рд┐рдХреЗрд╕рди (рд░ memcached рдЖрдлреИрдВ) Kubernetes рдорд╛ рдЪрд▓реНрдЫ - рддрджрдиреБрд╕рд╛рд░, mcrouter рдкрдирд┐ рддреНрдпрд╣рд╛рдБ рдЕрд╡рд╕реНрдерд┐рдд рдЫред рдХреЛ рд▓рд╛рдЧреА рдХрдиреНрдЯреЗрдирд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМ рд╡рд╛рдл, рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

NB: рд▓реЗрдЦрдорд╛ рджрд┐рдЗрдПрдХрд╛ рд╕реВрдЪреАрд╣рд░реВ рднрдгреНрдбрд╛рд░рдорд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЫрдиреН flant/mcrouter.

configVersion: 1
project: mcrouter
deploy:
 namespace: '[[ env ]]'
 helmRelease: '[[ project ]]-[[ env ]]'
---
image: mcrouter
from: ubuntu:16.04
mount:
- from: tmp_dir
 to: /var/lib/apt/lists
- from: build_dir
 to: /var/cache/apt
ansible:
 beforeInstall:
 - name: Install prerequisites
   apt:
     name: [ 'apt-transport-https', 'tzdata', 'locales' ]
     update_cache: yes
 - name: Add mcrouter APT key
   apt_key:
     url: https://facebook.github.io/mcrouter/debrepo/xenial/PUBLIC.KEY
 - name: Add mcrouter Repo
   apt_repository:
     repo: deb https://facebook.github.io/mcrouter/debrepo/xenial xenial contrib
     filename: mcrouter
     update_cache: yes
 - name: Set timezone
   timezone:
     name: "Europe/Moscow"
 - name: Ensure a locale exists
   locale_gen:
     name: en_US.UTF-8
     state: present
 install:
 - name: Install mcrouter
   apt:
     name: [ 'mcrouter' ]

(werf.yaml)

... рд░ рдпрд╕рд▓рд╛рдИ рдмрд╛рд╣рд┐рд░ рд╕реНрдХреЗрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯред рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рдХреБрд░рд╛ рдпреЛ рд╣реЛ рдХрд┐ рддреНрдпрд╣рд╛рдБ рдкреНрд░рддрд┐рдХреГрддрд┐рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдЬрдирд░реЗрдЯрд░ рдорд╛рддреНрд░ рдЫ (рдпрджрд┐ рдХрд╕реИрд╕рдБрдЧ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╡рд┐рдХрд▓реНрдк рдЫ рднрдиреЗ, рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдорд╛ рд╕рд╛рдЭрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН):

{{- $count := (pluck .Values.global.env .Values.memcached.replicas | first | default .Values.memcached.replicas._default | int) -}}
{{- $pools := dict -}}
{{- $servers := list -}}
{{- /* ╨Ч╨░╨┐╨╛╨╗╨╜╤П╨╡╨╝  ╨╝╨░╤Б╤Б╨╕╨▓ ╨┤╨▓╤Г╨╝╤П ╨║╨╛╨┐╨╕╤П╨╝╨╕ ╤Б╨╡╤А╨▓╨╡╤А╨╛╨▓: "0 1 2 0 1 2" */ -}}
{{- range until 2 -}}
 {{- range $i, $_ := until $count -}}
   {{- $servers = append $servers (printf "mc-%d.mc:11211" $i) -}}
 {{- end -}}
{{- end -}}
{{- /* ╨б╨╝╨╡╤Й╨░╤П╤Б╤М ╨┐╨╛ ╨╝╨░╤Б╤Б╨╕╨▓╤Г, ╨┐╨╛╨╗╤Г╤З╨░╨╡╨╝ N ╤Б╤А╨╡╨╖╨╛╨▓: "[0 1 2] [1 2 0] [2 0 1]" */ -}}
{{- range $i, $_ := until $count -}}
 {{- $pool := dict "servers" (slice $servers $i (add $i $count)) -}}
 {{- $_ := set $pools (printf "MissFailoverRoute|Pool|pool%02d" $i) $pool -}}
{{- end -}}
---
apiVersion: v1
kind: ConfigMap
metadata:
 name: mcrouter
data:
 config.json: |
   {
     "pools": {{- $pools | toJson | replace "MissFailoverRoute|Pool|" "" -}},
     "route": {
       "type": "OperationSelectorRoute",
       "default_policy": "AllMajorityRoute|Pool|pool00",
       "operation_policies": {
         "get": {
           "type": "RandomRoute",
           "children": {{- keys $pools | toJson }}
         }
       }
     }
   }

(10-mcrouter.yaml)

рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рд░реЛрд▓ рдЖрдЙрдЯ рдЧрд░реНрдЫреМрдВ рд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдЫреМрдВ:

# php -a
Interactive mode enabled

php > # ╨Я╤А╨╛╨▓╨╡╤А╤П╨╡╨╝ ╨╖╨░╨┐╨╕╤Б╤М ╨╕ ╤З╤В╨╡╨╜╨╕╨╡
php > $m = new Memcached();
php > $m->addServer('mcrouter', 11211);
php > var_dump($m->set('test', 'value'));
bool(true)
php > var_dump($m->get('test'));
string(5) "value"
php > # ╨а╨░╨▒╨╛╤В╨░╨╡╤В! ╨в╨╡╤Б╤В╨╕╤А╤Г╨╡╨╝ ╤А╨░╨▒╨╛╤В╤Г ╤Б╨╡╤Б╤Б╨╕╨╣:
php > ini_set('session.save_handler', 'memcached');
php > ini_set('session.save_path', 'mcrouter:11211');
php > var_dump(session_start());
PHP Warning:  Uncaught Error: Failed to create session ID: memcached (path: mcrouter:11211) in php shell code:1
Stack trace:
#0 php shell code(1): session_start()
#1 {main}
  thrown in php shell code on line 1
php > # ╨Э╨╡ ╨╖╨░╨▓╨╛╨┤╨╕╤В╤Б╤ПтАж ╨Я╨╛╨┐╤А╨╛╨▒╤Г╨╡╨╝ ╨╖╨░╨┤╨░╤В╤М session_id:
php > session_id("zzz");
php > var_dump(session_start());
PHP Warning:  session_start(): Cannot send session cookie - headers already sent by (output started at php shell code:1) in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning:  session_start(): Unable to clear session lock record in php shell code on line 1
PHP Warning:  session_start(): Failed to read session data: memcached (path: mcrouter:11211) in php shell code on line 1
bool(false)
php >

рддреНрд░реБрдЯрд┐рдХреЛ рдкрд╛рда рдЦреЛрдЬреА рдЧрд░реНрджрд╛ рдХреБрдиреИ рдирддрд┐рдЬрд╛ рдЖрдПрди, рддрд░ рдХреНрд╡реЗрд░реАрдХреЛ рд▓рд╛рдЧрд┐ "рдорд╛рдЗрдХреНрд░реЛрдЙрдЯрд░ php"рдЕрдЧреНрд░рдгреАрдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╕рдмреИрднрдиреНрджрд╛ рдкреБрд░рд╛рдиреЛ рд╕рдорд╛рдзрд╛рди рдирднрдПрдХреЛ рд╕рдорд╕реНрдпрд╛ рдерд┐рдпреЛ - рд╕рдорд░реНрдердирдХреЛ рдЕрднрд╛рд╡ memcached рдмрд╛рдЗрдирд░реА рдкреНрд░реЛрдЯреЛрдХрд▓ред

NB: memcached рдорд╛ ASCII рдкреНрд░реЛрдЯреЛрдХрд▓ рдмрд╛рдЗрдирд░реА рдПрдХ рднрдиреНрджрд╛ рдврд┐рд▓реЛ рдЫ, рд░ рд▓рдЧрд╛рддрд╛рд░ рдХреБрдЮреНрдЬреА рд╣реНрдпрд╛рд╕рд┐рдЩ рдХреЛ рдорд╛рдирдХ рдорд╛рдзреНрдпрдо рдмрд╛рдЗрдирд░реА рдкреНрд░реЛрдЯреЛрдХрд▓ рд╕рдВрдЧ рдорд╛рддреНрд░ рдХрд╛рдо рдЧрд░реНрджрдЫред рддрд░ рдпрд╕рд▓реЗ рдХреБрдиреИ рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд╕реНрдпрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИрдиред

рдЪрд╛рд▓ рдЭреЛрд▓рд╛рдорд╛ рдЫ: рддрдкрд╛рдИрд▓реЗ рдЧрд░реНрдиреБ рдкрд░реНрдиреЗ рднрдиреЗрдХреЛ ASCII рдкреНрд░реЛрдЯреЛрдХрд▓рдорд╛ рд╕реНрд╡рд┐рдЪ рдЧрд░реНрдиреБ рд╣реЛ рд░ рд╕рдмреИ рдХреБрд░рд╛рд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫред рддрд░, рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдЬрд╡рд╛рдл рдЦреЛрдЬреНрдиреЗ рдмрд╛рдиреА php.net рдорд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдПрдХ рдХреНрд░реВрд░ рдордЬрд╛рдХ рдЦреЗрд▓реЗред рддрдкрд╛рдИрдВрд▓реЗ рддреНрдпрд╣рд╛рдБ рд╕рд╣рд┐ рдЙрддреНрддрд░ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдиреБрд╣реБрдиреЗрдЫреИрди... рдЬрдмрд╕рдореНрдо, рддрдкрд╛рдИрдВрд▓реЗ рдЕрдиреНрддреНрдпрдорд╛ рд╕реНрдХреНрд░реЛрд▓ рдЧрд░реНрдиреБрднрдпреЛ, рдЬрд╣рд╛рдБ рдЦрдгреНрдбрдорд╛ "рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдпреЛрдЧрджрд╛рди рдиреЛрдЯрд╣рд░реВ" рд╡рд┐рд╢реНрд╡рд╛рд╕реА рд╣реБрдиреЗрдЫрдиреН рд░ рдЕрдиреБрдЪрд┐рдд рд░реВрдкрдорд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЬрд╡рд╛рдл.

рд╣реЛ, рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдирд╛рдо рд╣реЛ memcached.sess_binary_protocolред рдпреЛ рдЕрд╕рдХреНрд╖рдо рд╣реБрдиреБрдкрд░реНрдЫ, рдЬрд╕ рдкрдЫрд┐ рд╕рддреНрд░рд╣рд░реВрд▓реЗ рдХрд╛рдо рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫред рдЕрдм рдмрд╛рдБрдХреА рд░рд╣реЗрдХреЛ рдХрдиреНрдЯреЗрдирд░рд▓рд╛рдИ mcrouter рдХреЛ PHP рдХреЛ рд╕рд╛рде рдкреЛрдбрдорд╛ рд░рд╛рдЦреНрдиреБ рд╣реЛ!

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рдпрд╕реИрд▓реЗ, рдХреЗрд╡рд▓ рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рд╕рд╛рде рд╣рд╛рдореАрд▓реЗ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдпреМрдВ: рдореЗрдордХреНрдпрд╛рдЪ рдЧрд░рд┐рдПрдХреЛ рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛рдХреЛ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рдХреНрдпрд╛рд╕ рднрдгреНрдбрд╛рд░рдгрдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдмрдврд╛рдЗрдПрдХреЛ рдЫред рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдХрд╛ рд▓рд╛рдЧрд┐ рд╕реНрдкрд╖реНрдЯ рдлрд╛рдЗрджрд╛рд╣рд░реВрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрд╕рд▓реЗ рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рдХрд╛рдо рдЧрд░реНрджрд╛ рдкреИрдВрддрд░реЗрдЦрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдард╛рдЙрдБ рджрд┐рдпреЛ: рдЬрдм рд╕рдмреИ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВрд╕рдБрдЧ рд░рд┐рдЬрд░реНрдн рд╣реБрдиреНрдЫ, рдкреНрд░рд╢рд╛рд╕рдХрдХреЛ рдЬреАрд╡рди рдзреЗрд░реИ рд╕рд░рд▓реАрдХреГрдд рд╣реБрдиреНрдЫред рд╣реЛ, рдпреЛ рд╡рд┐рдзрд┐рдорд╛ рдкрдирд┐ рдпрд╕рдХреЛ рдХрдордЬреЛрд░реАрд╣рд░реВ рдЫрдиреН, рдпреЛ "рдмреИрд╕рд╛рдЦреА" рдЬрд╕реНрддреЛ рд▓рд╛рдЧреНрди рд╕рдХреНрдЫ, рддрд░ рдпрджрд┐ рдпрд╕рд▓реЗ рдкреИрд╕рд╛ рдмрдЪрдд рдЧрд░реНрдЫ, рд╕рдорд╕реНрдпрд╛рд▓рд╛рдИ рдЧрд╛рдбреНрдЫ рд░ рдирдпрд╛рдБ рдХрд╛рд░рдг рдмрдирд╛рдЙрдБрджреИрди - рдХрд┐рди рд╣реЛрдЗрди?

PS

рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдкрдирд┐ рдкрдвреНрдиреБрд╣реЛрд╕реН:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди