рдХреНрд╖реИрддрд┐рдЬрд░рд┐рддреНрдпрд╛ memcached рд╕реНрдХреЗрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА mcrouter рд╡рд╛рдкрд░рдгреЗ

рдХреНрд╖реИрддрд┐рдЬрд░рд┐рддреНрдпрд╛ memcached рд╕реНрдХреЗрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА mcrouter рд╡рд╛рдкрд░рдгреЗ

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

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

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

рдореЗрдордХреЕрд╢реЗрдбрдордзреНрдпреЗ рдХрд╛рдп рдЪреВрдХ рдЖрд╣реЗ?

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

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

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

рддрджреНрд╡рддрдЪ рддреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ рдореЗрдордХреЕрд╢реЗрдб рдЖрдгрд┐ рдмрд╛рдпрдкрд╛рд╕ рдкреНрд░рддрд┐рдХреГрддреАрдВрдордзреНрдпреЗ рд░реЗрдХреЙрд░реНрдбрдЪреА рдкреНрд░рддрд┐рдХреГрддреА рдЪреВрдХ рдХрд┐рдВрд╡рд╛ рдЪреВрдХ рдЭрд╛рд▓реНрдпрд╛рд╕. рдЖрдореНрд╣рд╛рд▓рд╛ рд╣реА рд░рдгрдиреАрддреА рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рд╕ рдорджрдд рдХреЗрд▓реА mcrouter.

mcrouter

рдлреЗрд╕рдмреБрдХрдиреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗрд▓рд╛ рд╣рд╛ рдореЗрдордХреЕрд╢реЗрдб рд░рд╛рдЙрдЯрд░ рдЖрд╣реЗ. рд╣реЗ 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 рдореЗрдордХреЕрд╢реЗрдбрдЪреА рд╡рд┐рдирдВрддреА рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реА рдЬрд╛рдИрд▓ - рд╕рд░реНрд╡рд╛рдВрдирд╛ рдкреВрд▓ рдордзреНрдпреЗ рд╕рд░реНрд╡реНрд╣рд░. рдЖрдореНрд╣реА рдкреВрд▓рдордзреАрд▓ рд╕рд░реНрд╡реНрд╣рд░рдЪреА рд╕рдВрдЦреНрдпрд╛ рдХрдореА рдХрд░реВ рд╢рдХрддреЛ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рджреЛрди: рд╕реНрдЯреЛрд░реЗрдЬ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣рддреЗрдЪрд╛ рддреНрдпрд╛рдЧ рдХрд░рдгреЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рдорд┐рд│рддреЗ╨╛рд╡рд┐рдирдВрддреНрдпрд╛рдВрдкрд╛рд╕реВрди рдЧрд╣рд╛рд│ рдХреАрдВрдкрд░реНрдпрдВрдд рдЙрдЪреНрдЪ рдЧрддреА рдЖрдгрд┐ рдХрдореА рд▓реЛрдб.

NB: рддреБрдореНрд╣рд╛рд▓рд╛ mcrouter рд╢рд┐рдХрдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рджреБрд╡реЗ рджреЗрдЦреАрд▓ рдорд┐рд│реВ рд╢рдХрддрд╛рдд рд╡рд┐рдХрд┐рд╡рд░реАрд▓ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг ╨╕ рдкреНрд░рдХрд▓реНрдк рд╕рдорд╕реНрдпрд╛ (рдмрдВрдж рдЕрд╕рд▓реЗрд▓реНрдпрд╛рдВрд╕рд╣), рд╡рд┐рд╡рд┐рдз рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг рд╕реНрдЯреЛрдЕрд░рд╣рд╛рдКрд╕рдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ.

mcrouter рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдЪрд╛рд▓рд╡рдгреЗ

рдЖрдордЪрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ (рдЖрдгрд┐ рд╕реНрд╡рддрдГ рдореЗрдордХреЕрд╢реЗрдб) рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдордзреНрдпреЗ рдЪрд╛рд▓рддреЛ - рддреНрдпрд╛рдиреБрд╕рд╛рд░, рдореЕрдХреНрд░реЛрдЯрд░ рджреЗрдЦреАрд▓ рддреЗрдереЗ рдЖрд╣реЗ. рдЪреНрдпрд╛ рд╕рд╛рдареА рдХрдВрдЯреЗрдирд░ рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдореНрд╣реА рд╡рд╛рдкрд░рддреЛ werf, рдЬреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрд╕реЗ рджрд┐рд╕реЗрд▓:

NB: рд▓реЗрдЦрд╛рдд рджрд┐рд▓реЗрд▓реНрдпрд╛ рд╕реВрдЪреА рднрд╛рдВрдбрд╛рд░рд╛рдд рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд рдлреНрд▓рдБрдЯ/рдордХреНрд░реЛрдЙрдЯрд░.

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 >

рддреНрд░реБрдЯреАрдЪрд╛ рдордЬрдХреВрд░ рд╢реЛрдзрд▓реНрдпрд╛рдиреЗ рдХреЛрдгрддреЗрд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд│рд╛рд▓реЗ рдирд╛рд╣реАрдд, рдкрд░рдВрддреБ рдХреНрд╡реЗрд░реАрд╕рд╛рдареА тАЬmcrouter php"рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рд╕рд░реНрд╡рд╛рдд рдЬреБрдиреА рди рд╕реБрдЯрд▓реЗрд▓реА рд╕рдорд╕реНрдпрд╛ рдЖрдШрд╛рдбреАрд╡рд░ рд╣реЛрддреА - рд╕рдорд░реНрдердирд╛рдЪрд╛ рдЕрднрд╛рд╡ memcached рдмрд╛рдпрдирд░реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓.

NB: рдореЗрдордХреЕрд╢реЗрдбрдордзреАрд▓ ASCII рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрд╛рдпрдирд░реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдкреЗрдХреНрд╖рд╛ рд╣рд│реВ рдЖрд╣реЗ рдЖрдгрд┐ рд╕рд╛рддрддреНрдпрдкреВрд░реНрдг рдХреА рд╣реЕрд╢рд┐рдВрдЧрдЪреЗ рдорд╛рдирдХ рд╕рд╛рдзрди рдХреЗрд╡рд│ рдмрд╛рдпрдирд░реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд. рдкрд░рдВрддреБ рд╣реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд░рдгрд╛рд╕рд╛рдареА рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдд рдирд╛рд╣реА.

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

рд╣реЛрдп, рдпреЛрдЧреНрдп рдкрд░реНрдпрд╛рдпрд╛рдЪреЗ рдирд╛рд╡ рдЖрд╣реЗ memcached.sess_binary_protocol. рддреЗ рдЕрдХреНрд╖рдо рдХреЗрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рддреНрдпрд╛рдирдВрддрд░ рд╕рддреНрд░реЗ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреАрд▓. рдлрдХреНрдд рд╢рд┐рд▓реНрд▓рдХ рдЖрд╣реЗ mcrouter рд╕рд╣ рдХрдВрдЯреЗрдирд░ PHP рд╕рд╣ рдкреЙрдбрдордзреНрдпреЗ рдареЗрд╡рдгреЗ!

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

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

PS

рдЖрдордЪреНрдпрд╛ рдмреНрд▓реЙрдЧрд╡рд░ рджреЗрдЦреАрд▓ рд╡рд╛рдЪрд╛:

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

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