เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ mcouter เป€เบžเบทเปˆเบญโ€‹เบ‚เบฐโ€‹เบซเบเบฒเบ memcached เบขเบฝเบ”โ€‹เบ•เบฒเบกโ€‹เบฅเบงเบ‡โ€‹เบ™เบญเบ™โ€‹

เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ mcouter เป€เบžเบทเปˆเบญโ€‹เบ‚เบฐโ€‹เบซเบเบฒเบ memcached เบขเบฝเบ”โ€‹เบ•เบฒเบกโ€‹เบฅเบงเบ‡โ€‹เบ™เบญเบ™โ€‹

เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เป‚เบซเบผเบ”เบชเบนเบ‡เปƒเบ™เบžเบฒเบชเบฒเปƒเบ”เบเปเปˆเบ•เบฒเบกเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบงเบดเบ—เบตเบเบฒเบ™เบžเบดเป€เบชเบ”เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบžเบดเป€เบชเบ”, เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบกเบฑเบ™เบกเบฒเบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบ™ PHP, เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบชเบฒเบกเบฒเบ”เบฎเป‰เบฒเบเปเบฎเบ‡เบ‚เบถเป‰เบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡,. เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡. เปƒเบ™เบšเบฑเบ™เบ—เบถเบเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเป€เบˆเบฑเบšเบ›เบงเบ”เบ—เบตเปˆเบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบญเบ‡เบ›เบฐเบŠเบธเบกเบ—เบตเปˆเปเบˆเบเบขเบฒเบเปเบฅเบฐเบเบฒเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปƒเบ™ memcached เปเบฅเบฐเบงเบดเบ—เบตเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบขเบนเปˆเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบซเบ™เบถเปˆเบ‡ "ward".

hero เบ‚เบญเบ‡เป‚เบญเบเบฒเบ”เปเบกเปˆเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ PHP เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบญเบš symfony 2.3, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเป„เบ”เป‰เบฅเบงเบกเบขเบนเปˆเปƒเบ™เปเบœเบ™เบเบฒเบ™เบ—เบธเบฅเบฐเบเบดเบ”เบ—เบตเปˆเบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡. เบ™เบญเบ เป€เปœเบทเบญ เป„เบ›เบˆเบฒเบเบšเปˆเบญเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡, เป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰เป„เบ”เป‰ เบ™เบณ เปƒเบŠเป‰เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆ เบ™เบฐเป‚เบเบšเบฒเบ "เป€เบเบฑเบšเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡". เปƒเบ™ memcached: เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ•เปเปˆเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ API, เบ—เบธเบ‡เบ•เปˆเบฒเบ‡เป†, locks เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ synchronizing เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบญเบทเปˆเบ™เป†. เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบเบฒเบ™เปเบ•เบเปเบเบเบ‚เบญเบ‡ memcached เบเบฒเบเป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเบ•เปเปˆเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เบชเบนเบ™เป€เบชเบ cache เบ™เปเบฒเป„เบ›เบชเบนเปˆเบœเบปเบ™เบชเบฐเบ—เป‰เบญเบ™เบ—เบตเปˆเบฎเป‰เบฒเบเปเบฎเบ‡: DBMS เป€เบฅเบตเปˆเบกเบฅเบฐเป€เบšเบตเบ”เบขเบนเปˆ seams, เบšเปเบฅเบดเบเบฒเบ™ API เป€เบฅเบตเปˆเบกเบซเป‰เบฒเบกเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบชเบฐเบ–เบฝเบ™เบฅเบฐเบžเบฒเบšเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบญเบฒเบ”เบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเบชเบดเบšเบ™เบฒเบ—เบต, เปเบฅเบฐเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เป€เบงเบฅเบฒเบ™เบตเป‰เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบˆเบฐเบŠเป‰เบฒเบซเบผเบฒเบเบซเบผเบทเบšเปเปˆเบกเบตเปƒเบซเป‰เบซเบกเบปเบ”.

เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบชเบฐเบซเบ™เบญเบ‡ เบ„เบงเบฒเบกโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบ‚เบฐโ€‹เบซเบเบฒเบโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ•เบฒเบกโ€‹เบฅเบงเบ‡โ€‹เบ™เบญเบ™โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบžเบฐโ€‹เบเบฒโ€‹เบเบฒเบกโ€‹เบžเบฝเบ‡โ€‹เป€เบฅเบฑเบโ€‹เบ™เป‰เบญเบโ€‹, i.e. เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบเบฑเบšเบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เปเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ•เบฑเบกเบ—เบตเปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰. เป€เบฎเบฑเบ”เปƒเบซเป‰ cache เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบเบฑเบšเบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบฅเบง, เปเบ•เปˆเบเบฑเบ‡เบžเบฐเบเบฒเบเบฒเบกเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบชเบนเบ™เป€เบชเบเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบกเบฑเบ™.

เบกเบตเบซเบเบฑเบ‡เบœเบดเบ”เบžเบฒเบ”เบเบฑเบš memcached เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡?

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ memcached เบชเปเบฒเบฅเบฑเบš PHP เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปเบˆเบเบขเบฒเบเปเบฅเบฐเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบญเบ‡เบ›เบฐเบŠเบธเบกเบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡. เบเบปเบ™เป„เบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ hashing เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบงเบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เป„เบ”เป‰เป€เบ—เบปเปˆเบฒเบ—เบฝเบกเบเบฑเบ™เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบ, เปเบเป‰เป„เบ‚เปเบ•เปˆเบฅเบฐเบฅเบฐเบซเบฑเบ”เบชเบฐเป€เบžเบฒเบฐเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบชเบฐเป€เบžเบฒเบฐเบˆเบฒเบเบเบธเปˆเบก, เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบฅเบปเป‰เบกเป€เบซเบฅเบงเปƒเบ™เบ•เบปเบงเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบกเบตเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ caching เบชเบนเบ‡ (เปเบ•เปˆ, เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบšเปเปˆโ€‹เบกเบตโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™).

เบชเบดเปˆเบ‡เบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบเบเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป€เบŠเบ”เบŠเบฑเบ™: เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบ”เป‰ memcached.sess_number_of_replicas, เป€เบ›เบฑเบ™เบœเบปเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™เบ—เบตเปˆเบ‚เปเป‰เบกเบนเบ™เบˆเบฐเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเบผเบฒเบเบ„เบฑเป‰เบ‡, เปเบฅเบฐเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบงเบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡ memcached instance, เบ‚เปเป‰เบกเบนเบ™เบˆเบฐเบ–เบทเบเป‚เบญเบ™เบˆเบฒเบเบ„เบปเบ™เบญเบทเปˆเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ–เป‰เบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบเบฑเบšเบกเบฒเบญเบญเบ™เป„เบฅเบ™เปŒเป‚เบ”เบเบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™ (เบ•เบฒเบกเบ›เบปเบเบเบฐเบ•เบดเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆ), เบšเบฒเบ‡เบเบฐเปเบˆเบˆเบฐเบ–เบทเบเปเบˆเบเบขเบฒเบเบ„เบทเบ™เปƒเบซเบกเปˆ. เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ™เบตเป‰เบˆเบฐเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ เบเบฒเบ™เบชเบนเบ™เป€เบชเบเบ‚เปเป‰เบกเบนเบ™เป€เบŠเบ”เบŠเบฑเบ™, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบšเปเปˆเบกเบตเบ—เบฒเบ‡เบ—เบตเปˆเบˆเบฐ "เป„เบ›" เบเบฑเบš replica เบญเบทเปˆเบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบžเบฒเบ”.

เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปเบกเปˆเบ™เปเบ™เปƒเบชเปˆเบ•เบปเป‰เบ™เบ•เป เปเบ™เบงเบ™เบญเบ™ scaling: เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบก cache เบเบฑเบšเบ‚เบฐเบซเบ™เบฒเบ” gigantic เปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบกเบฑเบ™เบˆเบฒเบเบฅเบฐเบซเบฑเบ”เป‚เบฎเบ”เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบ›เบฐเบฅเบดเบกเบฒเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เบšเปเปˆเป€เบเบตเบ™เบซเบผเบฒเบ gigabyte, เปเบฅเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบชเบญเบ‡ nodes เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบžเบฝเบ‡เบžเป. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เบกเบต memcached เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบฎเบฑเบเบชเบฒเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบซเบ™เบถเปˆเบ‡ cache instance เปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเป‚เบญเบเบฒเบ”เบ™เบตเป‰ ... เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบฅเบฐเบ™เบถเบเป€เบ–เบดเบ‡เบงเบฑเบ”เบ–เบธเบšเบนเบฎเบฒเบ™เบ‚เบญเบ‡เบเบญเบšเบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเปƒเบซเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบชเบฐเบ™เบธเบเป€เบเบต. เบขเปˆเบฒเบฅเบทเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเบนเบ™เป€เบชเบเบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เป€เบŠเบ”เบŠเบฑเบ™: เบ•เบฒเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเป„เบ”เป‰เบšเบดเบ”เบˆเบฒเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ.

เป‚เบ”เบเบซเบฅเบฑเบเบเบฒเบ™เปเบฅเป‰เบง, เบกเบฑเบ™เปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™ replication เบ‚เบญเบ‡เบšเบฑเบ™เบ—เบถเบเปƒเบ™ memcached เปเบฅเบฐ bypassing replicas เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบซเบผเบทเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบŠเปˆเบงเบเบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบ™เบตเป‰ mcouter.

mcouter

เบ™เบตเป‰เปเบกเปˆเบ™ router memcached เบ—เบตเปˆเบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ”เบ Facebook เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบกเบฑเบ™. เบกเบฑเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒเบ‚เปเป‰เบ„เบงเบฒเบก memcached, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰ เบเบฒเบ™โ€‹เบ•เบดเบ”โ€‹เบ•เบฑเป‰เบ‡ memcached เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹ เบเบฑเบšเบญเบฑเบ”เบ•เบฒเบชเปˆเบงเบ™เบšเป‰เบฒ. เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡ mcouter เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™ เบ›เบฐเบเบฒเบ”เบ™เบตเป‰. เปƒเบ™โ€‹เบšเบฑเบ™โ€‹เบ”เบฒโ€‹เบชเบดเปˆเบ‡โ€‹เบญเบทเปˆเบ™เป† เบŸเบฑเบ‡เบŠเบฑเบ™เบเบงเป‰เบฒเบ‡ เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™:

  • replicate เบšเบฑเบ™เบ—เบถเบ;
  • เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบญเบทเปˆเบ™เปƒเบ™เบเบธเปˆเบกเบ–เป‰เบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบทเป‰เบ™.

เป„เบ›โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบ!

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ mcouter

เบ‚เป‰เบญเบเบˆเบฐเป„เบ›เบเบปเบ‡เบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ:

{
 "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"
       ]
     }
   }
 }
}

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบชเบฒเบกเบชเบฐเบ™เบธเบเป€เบเบต? เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบˆเบถเปˆเบ‡เบŠเป‰เปเบฒเบเบฑเบ™? เปƒเบซเป‰เบ„เบดเบ”เบญเบญเบเบงเปˆเบฒเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”.

  • เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ™เบตเป‰, mcouter เป€เบฅเบทเบญเบเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เปเบฒเบชเบฑเปˆเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป. เบœเบนเป‰เบŠเบฒเบเบšเบญเบเบฅเบฒเบงเบ™เบตเป‰ OperationSelectorRoute.
  • เป€เบญเบปเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป„เบ›เบซเบฒเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™ RandomRouteเป€เบŠเบดเปˆเบ‡เป€เบฅเบทเบญเบเบชเบฐเบ™เบธเบเป€เบเบตเบซเบผเบทเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบงเบฑเบ”เบ–เบธ array เปเบšเบšเบชเบธเปˆเบก children. เปเบ•เปˆเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบญเบฒเป€เบฃเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™ MissFailoverRoute, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบœเปˆเบฒเบ™เปเบ•เปˆเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบ™เบชเบฐเบ™เบธเบเป€เบเบตเบˆเบปเบ™เบเปˆเบงเบฒเบกเบฑเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบเบฑเบšเบฅเบนเบเบ„เป‰เบฒ.
  • เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบชเบฐเป€เบžเบฒเบฐ MissFailoverRoute เบ”เป‰เบงเบเบชเบฐเบ™เบธเบเป€เบเบตเบ‚เบญเบ‡เบชเบฒเบกเป€เบŠเบตเบŸเป€เบงเบต, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบกเบฒเบ—เปเบฒเบญเบดเบ”เบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡ memcached เบ—เปเบฒเบญเบดเบ”, เปเบฅเบฐเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบšเบปเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™. เบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบˆเบฐเบ™เปเบฒเป„เบ›เบชเบนเปˆ เบเบฒเบ™เป‚เบซเบผเบ”เบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เปเบฒเบญเบดเบ”เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ, เบชเบฐเบ™เบฑเป‰เบ™เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เบชเบฒเบกเบชเบฐเบ™เบธเบเป€เบเบตเบ—เบตเปˆเบกเบตเบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบฅเปเบฒเบ”เบฑเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปเบฅเบฐเป€เบฅเบทเบญเบเป€เบญเบปเบฒเบžเบงเบเบกเบฑเบ™เปเบšเบšเบชเบธเปˆเบก.
  • เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เบซเบกเบปเบ” (เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบ—เบถเบ) เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰ AllMajorityRoute. เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ™เบตเป‰เบชเบปเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบชเบฐเบ™เบธเบเป€เบเบตเปเบฅเบฐเบฅเปเบ–เป‰เบฒเบ„เปเบฒเบ•เบญเบšเบˆเบฒเบเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ N/2 + 1 เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹ AllSyncRoute เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบ‡เบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ‚เบฝเบ™โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบ›เบฐโ€‹เบ–เบดเป‰เบกโ€‹เป„เบงเป‰โ€‹, เบ™เบฑเบšโ€‹เบ•เบฑเป‰เบ‡โ€‹เปเบ•เปˆโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ™เบตเป‰โ€‹เบฎเบฝเบโ€‹เบฎเป‰เบญเบ‡โ€‹เปƒเบซเป‰โ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ•เบญเบšโ€‹เบชเบฐโ€‹เบซเบ™เบญเบ‡โ€‹เปƒเบ™โ€‹เบ—เบฒเบ‡โ€‹เบšเบงเบโ€‹เบˆเบฒเบโ€‹ ะฒัะตั… เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบ™เบเบธเปˆเบก - เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเบเบฑเบšเบ„เบทเบ™เบกเบฒ SERVER_ERROR. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ mcouter เบˆเบฐเป€เบžเบตเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบกเบตเบขเบนเปˆ, เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบญเบตเป‰เบ™ PHP เบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” เปเบฅเบฐเบˆเบฐเบชเป‰เบฒเบ‡เปเบˆเป‰เบ‡เบเบฒเบ™. AllMajorityRoute เปเบกเปˆเบ™เบšเปเปˆเป€เบ‚เบฑเป‰เบกเบ‡เบงเบ”เปเบฅเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบ–เบดเบ‡เป€เบ„เบดเปˆเบ‡เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเบญเบญเบเบˆเบฒเบเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡.

เบ‚เปเป‰เป€เบชเบเบซเบผเบฑเบ เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบงเปˆเบฒโ€‹เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เปเบ—เป‰โ€‹เบˆเบดเบ‡โ€‹เปƒเบ™โ€‹เบ–เบฒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบˆเปเบฒโ€‹, เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบฎเป‰เบญเบ‡โ€‹เบ‚เปโ€‹เบ‚เบญเบ‡โ€‹เบฅเบนเบโ€‹เบ„เป‰เบฒ N เบเบฒเบ™โ€‹เบฎเป‰เบญเบ‡โ€‹เบ‚เปโ€‹เบ‚เบญเบ‡ memcached เปเบ•เปˆโ€‹เบฅเบฐโ€‹เบ„เบปเบ™โ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ” - to เบเบฑเบšเบ—เบธเบเบ„เบปเบ™ เป€เบŠเบตเบšเป€เบงเบตเปƒเบ™เบชเบฐเบ™เบธเบเป€เบเบต. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบ™เบชเบฐเบ™เบธเบเป€เบเบต, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบ›เบฑเบ™เบชเบญเบ‡: เบเบฒเบ™เป€เบชเบเบชเบฐเบฅเบฐเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบš.ะพเบ„เบงเบฒเบกเป„เบงเบ—เบตเปˆเบชเบนเบ‡เบ‚เบถเป‰เบ™เปเบฅเบฐเบเบฒเบ™เป‚เบซเบผเบ”เบซเบ™เป‰เบญเบเบฅเบปเบ‡เบˆเบฒเบเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเป„เบ›เบซเบฒเบเบฐเปเบˆเบ—เบตเปˆเบ‚เบฒเบ”เบซเบฒเบเป„เบ›.

NB: เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบŠเบญเบเบซเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฎเบฝเบ™เบฎเบนเป‰ mcouter เป€เบญเบเบฐเบชเบฒเบ™เบเปˆเบฝเบงเบเบฑเบš wiki ะธ เบšเบฑเบ™เบซเบฒเป‚เบ„เบ‡เบเบฒเบ™ (เบฅเบงเบกเบ—เบฑเบ‡เบ›เบดเบ”), เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡ storehouse เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เปˆเบฒเบ‡เป†.

เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบฅเบฐเปเบฅเปˆเบ™ mcouter

เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ (เปเบฅเบฐ memcached เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡) เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™ Kubernetes - เบ•เบฒเบกเบ„เบงเบฒเบกเป€เบซเบกเบฒเบฐเบชเบปเบก, mcrouter เบเปเปˆเบ•เบฑเป‰เบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เบชเปเบฒเบฅเบฑเบš เบเบฒเบ™เบ›เบฐเบเบญเบšเบžเบฒเบŠเบฐเบ™เบฐ เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ werf, config เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบšเบดเปˆเบ‡โ€‹เบ„เบทโ€‹เบ™เบตเป‰โ€‹:

NB: เบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เบžเบตเบกเบกเบฒเบขเบนเปˆเปƒเบ™ repository Flant/mcouter.

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)

... เปเบฅเบฐเปเบ•เป‰เบกเบกเบฑเบ™เบญเบญเบ เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบกเบงเบเบเบฑเบ™เบเบฐเบ—เบปเบš. เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปเบกเปˆเบ™เบงเปˆเบฒเบกเบตเบžเบฝเบ‡เปเบ•เปˆ config generator เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ replicas (เบ–เป‰เบฒเปƒเบœเบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบ laconic เปเบฅเบฐ elegant เบซเบผเบฒเบ, เปเบšเปˆเบ‡เบ›เบฑเบ™เบกเบฑเบ™เปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™):

{{- $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 >

เบเบฒเบ™เบŠเบญเบเบซเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบšเปเปˆเป„เบ”เป‰เปƒเบซเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบ”เป†, เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก "mcouter php"เปƒเบ™เปเบ–เบงเบซเบ™เป‰เบฒเปเบกเปˆเบ™เบšเบฑเบ™เบซเบฒเป€เบเบปเปˆเบฒเปเบเปˆเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ - เบ‚เบฒเบ”เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ memcached เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒเบ„เบนเปˆ.

NB: เป‚เบ›เบฃเป‚เบ•เบ„เป ASCII เปƒเบ™ memcached เปเบกเปˆเบ™เบŠเป‰เบฒเบเบงเปˆเบฒ binary one, เปเบฅเบฐเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบงเบดเบ—เบตเบเบฒเบ™ hashing key เบ—เบตเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš binary protocol. เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบชเป‰เบฒเบ‡เบšเบฑเบ™เบซเบฒเบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡.

เป€เบ„เบฑเบ”โ€‹เบฅเบฑเบšโ€‹เปเบกเปˆเบ™โ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เบ–เบปเบ‡โ€‹: เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบกเบตโ€‹เป€เบžเบทเปˆเบญโ€‹เป€เบฎเบฑเบ”โ€‹เปเบกเปˆเบ™โ€‹เบชเบฐโ€‹เบซเบผเบฑเบšโ€‹เบเบฑเบšโ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบชเบฑเบ™โ€‹เบเบฒ ASCII เปเบฅเบฐโ€‹เบ—เบธเบโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบธเบโ€‹เบขเปˆเบฒเบ‡โ€‹เบˆเบฐโ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบ .... เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ™เบดเป„เบชเบ‚เบญเบ‡เบเบฒเบ™เบŠเบญเบเบซเบฒเบ„เปเบฒเบ•เบญเบšเปƒเบ™ เป€เบญเบเบฐเบชเบฒเบ™เบเปˆเบฝเบงเบเบฑเบš php.net เบซเบผเบดเป‰เบ™เบ•เบฐเบซเบผเบปเบเบ—เบตเปˆเป‚เบซเบ”เบฎเป‰เบฒเบ. เบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเบžเบปเบšเบ„เปเบฒเบ•เบญเบšเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™ ... เป€เบงเบฑเป‰เบ™เป€เบชเบเปเบ•เปˆ, เปเบ™เปˆเบ™เบญเบ™, เบ—เปˆเบฒเบ™เป€เบฅเบทเปˆเบญเบ™เป„เบ›เบซเบฒเบšเปˆเบญเบ™เบชเบธเบ”เบ—เป‰เบฒเบ, เบšเปˆเบญเบ™เบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบžเบฒเบ "เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ›เบฐเบเบญเบšเบชเปˆเบงเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰" เบˆเบฐเบŠเบทเปˆเบชเบฑเบ”เปเบฅเบฐ เบ„เบณเบ•เบญเบšเบ—เบตเปˆเบ–เบทเบเบฅเบปเบ‡เบ„เบฐเปเบ™เบ™เบชเบฝเบ‡เบขเปˆเบฒเบ‡เบšเปเปˆเบเบธเบ•เบดเบ—เบณ.

เปเบกเปˆเบ™เปเบฅเป‰เบง, เบŠเบทเปˆเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปเบกเปˆเบ™ memcached.sess_binary_protocol. เบกเบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเบ›เบดเบ”เปƒเบŠเป‰เบ‡เบฒเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบญเบ‡เบ›เบฐเบŠเบธเบกเบˆเบฐเป€เบฅเบตเปˆเบกเป€เบฎเบฑเบ”เบงเบฝเบ. เบชเบดเปˆเบ‡เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เป€เบญเบปเบฒเบ–เบฑเบ‡เปƒเบชเปˆเบเบฑเบš mcouter เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบฑเบเบ”เป‰เบงเบ PHP!

เบชเบฐเบซเบฅเบธเบš

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบฝเบ‡เปเบ•เปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เป‚เบ„เบ‡เบฅเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเป„เบ”เป‰: เบšเบฑเบ™เบซเบฒเบเบฑเบšเบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบ‚เบญเบ‡ memcached เป„เบ”เป‰เบ–เบทเบเปเบเป‰เป„เบ‚เปเบฅเป‰เบง, เปเบฅเบฐเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเบ‚เบญเบ‡เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ cache เป„เบ”เป‰เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™. เบ™เบญเบเป€เบซเบ™เบทเบญเป„เบ›เบˆเบฒเบเบ‚เปเป‰เป„เบ”เป‰เบ›เบฝเบšเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ, เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบซเป‰เบญเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ maneuver เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป€เบงเบ—เบต: เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบกเบตเบชเบฐเบซเบ‡เบงเบ™เป„เบงเป‰, เบŠเบตเบงเบดเบ”เบ‚เบญเบ‡เบœเบนเป‰เบšเปเบฅเบดเบซเบฒเบ™เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ. เปเบกเปˆเบ™เปเบฅเป‰เบง, เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบเบฑเบ‡เบกเบตเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ‚เบญเบ‡เบกเบฑเบ™, เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบ„เป‰เบฒเบเบ„เบท "เป„เบกเป‰เบ„เป‰เบญเบ™", เปเบ•เปˆเบ–เป‰เบฒเบกเบฑเบ™เบ›เบฐเบซเบเบฑเบ”เป€เบ‡เบดเบ™, เบเบฑเบ‡เบšเบฑเบ™เบซเบฒเปเบฅเบฐเบšเปเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เปƒเบซเบกเปˆ - เป€เบ›เบฑเบ™เบซเบเบฑเบ‡?

PS

เบญเปˆเบฒเบ™เบเบฑเบ‡เบขเบนเปˆเปƒเบ™ blog เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™