αž€αžΆαžšαž”αŸ’αžšαžΎ mcrouter αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“ memcached αž•αŸ’αžŠαŸαž€

αž€αžΆαžšαž”αŸ’αžšαžΎ mcrouter αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“ memcached αž•αŸ’αžŠαŸαž€

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αž˜αžΆαž“αž”αž“αŸ’αž‘αž»αž€αžαŸ’αž–αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž—αžΆαžŸαžΆαžŽαžΆαž˜αž½αž™αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž–αž·αžŸαŸαžŸ αž“αž·αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž§αž”αž€αžšαžŽαŸαž–αž·αžŸαŸαžŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž–αŸαž›αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž€αŸ’αž“αž»αž„ PHP αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αžΆαž…αž€αžΆαž“αŸ‹αžαŸ‚αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αž—αž·αžœαžŒαŸ’αžαž§αž‘αžΆαž αžšαžŽαŸαŸ” αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“. αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαžˆαžΊαž…αžΆαž”αŸ‹αžŠαŸ‚αž›αž’αŸ’αž›αžΆαž”αŸ‹αžŸαŸ’αž‚αžΆαž›αŸ‹αž‡αžΆαž˜αž½αž™αž€αžΆαžšαž•αŸ’αž‘αž»αž€αžœαž‚αŸ’αž‚αž…αŸ‚αž€αž…αžΆαž™ αž“αž·αž„αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„ memcached αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„ "វួដ" αž˜αž½αž™αŸ”

αžœαžΈαžšαž”αž»αžšαžŸαž“αŸƒαž±αž€αžΆαžŸαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ PHP αž•αŸ’αž’αŸ‚αž€αž›αžΎ symfony 2.3 framework αžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ‚αž“αž€αžΆαžšαž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‘αŸαŸ” αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž€αžΆαžšαž•αŸ’αž‘αž»αž€αžŸαž˜αŸαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡αž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αŸαž‰αž›αŸαž‰ αž‚αŸ„αž›αž“αž™αŸ„αž”αžΆαž™ "αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„" αž“αŸ…αž€αŸ’αž“αž»αž„ memcachedαŸ– αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ API αž‘αž„αŸ‹αž•αŸ’αžŸαŸαž„αŸ— αž…αžΆαž€αŸ‹αžŸαŸ„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΌαžŠ αž“αž·αž„αž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ” αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ‚αž”αž“αŸαŸ‡ αž€αžΆαžšαž”αŸ†αž”αŸ‚αž€αž“αŸƒ memcached αž€αŸ’αž›αžΆαž™αž‡αžΆαž‚αŸ’αžšαŸ„αŸ‡αžαŸ’αž“αžΆαž€αŸ‹αžŠαž›αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αžαž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αž•αž›αžœαž·αž”αžΆαž€αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžš: DBMS αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž•αŸ’αž‘αž»αŸ‡αž“αŸ…αžŸαŸŠαžΆαž˜ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ API αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž αžΆαž˜αžƒαžΆαžαŸ‹αžŸαŸ†αžŽαžΎαŸ”αž›αŸ” αžŸαŸ’αžαŸαžšαž—αžΆαž–αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αžΆαž…αž…αŸ†αžŽαžΆαž™αž–αŸαž›αžšαžΆαž”αŸ‹αžŸαž·αž”αž“αžΆαž‘αžΈ αž αžΎαž™αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž“αŸαŸ‡ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αžΉαž„αž™αžΊαžαž™αŸ‰αžΆαžœαžαŸ’αž›αžΆαŸ†αž„ αž¬αž˜αž·αž“αž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αŸ”

αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž•αŸ’αžαž›αŸ‹αž‡αžΌαž“ αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž•αŸ’αžŠαŸαž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž˜αžΆαž“αž€αžΆαžšαžαž·αžαžαŸ†αž”αŸ’αžšαžΉαž„αž”αŸ’αžšαŸ‚αž„αžαž·αž…αžαž½αž…, i.e. αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαž·αž…αžαž½αž…αž”αŸ†αž•αž»αžαž…αŸ†αž–αŸ„αŸ‡αž€αžΌαžŠαž”αŸ’αžšαž—αž– αž“αž·αž„αž˜αž»αžαž„αžΆαžšαž–αŸαž‰αž›αŸαž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αŸ” αž’αŸ’αžœαžΎαž±αŸ’αž™αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž’αž“αŸ‹αž“αžΉαž„αž€αžΆαžšαž”αžšαžΆαž‡αŸαž™αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžœαžΆαž•αž„αžŠαŸ‚αžšαŸ”

αžαžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαžαž»αžŸαž‡αžΆαž˜αž½αž™ memcached αžαŸ’αž›αž½αž“αžœαžΆ?

αž‡αžΆαž‘αžΌαž‘αŸ… αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ memcached αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ PHP αž‚αžΆαŸ†αž‘αŸ’αžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αŸ‚αž€αž…αžΆαž™ αž“αž·αž„αž€αžΆαžšαž•αŸ’αž‘αž»αž€αžŸαž˜αŸαž™αž…αŸαž‰αž–αžΈαž”αŸ’αžšαž’αž”αŸ‹αŸ” αž™αž“αŸ’αžαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžš hashing key αž‡αžΆαž”αŸ‹αž›αžΆαž”αŸ‹αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŠαžΆαž€αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αž˜αžΎαŸ—αž‚αŸ’αž“αžΆαž“αŸ…αž›αžΎ servers αž‡αžΆαž…αŸ’αžšαžΎαž“ αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαž“αžΌαžœ key αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αžΈαž˜αž½αž™αŸ—αž‘αŸ…αž€αžΆαž“αŸ‹ server αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αž–αžΈαž€αŸ’αžšαž»αž˜ αž αžΎαž™αž§αž”αž€αžšαžŽαŸαž”αžšαžΆαž‡αŸαž™αžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αž’αžΆαž“αžΆαž“αžΌαžœαž—αžΆαž–αž’αžΆαž…αžšαž€αž”αžΆαž“αžαŸ’αž–αžŸαŸ‹αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ (αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž’αž€αž»αžŸαž› αž‚αŸ’αž˜αžΆαž“β€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™).

αž’αŸ’αžœαžΈαŸ—αž˜αžΆαž“αž—αžΆαž–αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž˜αž»αž“αž”αž“αŸ’αžαž·αž…αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž‘αž»αž€αžœαž‚αŸ’αž‚αŸ– αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αžΆαž“αŸ” memcached.sess_number_of_replicasαž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™ αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž€αžΆαžšαž”αžšαžΆαž‡αŸαž™αž“αŸƒαž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™ memcached αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αŸαžšαž–αžΈαž’αŸ’αž“αž€αžŠαž‘αŸƒαŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžαŸ’αžšαž›αž”αŸ‹αž˜αž€αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαžœαž·αž‰αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ (αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž€αžΎαžαž‘αžΎαž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αžΎαž„αžœαž·αž‰) αžŸαŸ„αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αž‘αžΎαž„αžœαž·αž‰αžαžΆαž˜αž€αžΆαžšαž–αŸαž‰αž…αž·αžαŸ’αžαžšαž”αžŸαŸ‹αžœαžΆαŸ” αžαžΆαž˜αž–αž·αžαž“αŸαŸ‡αž“αžΉαž„αž˜αžΆαž“αž“αŸαž™ αž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαž˜αŸαž™αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž˜αž·αž“αž˜αžΆαž“αžœαž·αž’αžΈ "αž‘αŸ…" αž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž…αž˜αŸ’αž›αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžαž€αžαžΆαž“αŸ”

αž§αž”αž€αžšαžŽαŸαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž˜αžΆαž“αž‚αŸ„αž›αž”αŸ†αžŽαž„αž‡αžΆαž…αž˜αŸ’αž”αž„ αž•αŸ’αžŠαŸαž€ αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αŸ– αž–αž½αž€αž‚αŸαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž“αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαž›αŸ‹αž‘αŸ†αž αŸ†αž˜αž αž·αž˜αžΆ αž“αž·αž„αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαžœαžΆαž–αžΈαž€αžΌαžŠαžŠαŸ‚αž›αž”αž„αŸ’αž αŸ„αŸ‡αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αŸ’αžŸαŸαž„αŸ—αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžšαž”αžŸαŸ‹αž™αžΎαž„ αž”αžšαž·αž˜αžΆαžŽαž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž˜αž·αž“αž›αžΎαžŸαž–αžΈαž‡αžΈαž αŸ’αž‚αžΆαž”αŸƒαž…αŸ’αžšαžΎαž“αž‘αŸ αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαžαŸ’αž“αžΆαŸ†αž„αž˜αž½αž™ αž¬αž–αžΈαžšαž‚αžΊαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αŸ” αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž αžΎαž™ αž§αž”αž€αžšαžŽαŸαžŸαŸ’αžŠαž„αŸ‹αžŠαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž’αžΆαž…αž’αžΆαž“αžΆαž”αžΆαž“αž“αžΌαžœαž—αžΆαž–αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸƒ memcached αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αžšαž€αŸ’αžŸαžΆαž”αžΆαž“αž“αžΌαžœαžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž€αžΆαžšαž„αžΆαžšαŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžœαžΆαž˜αž·αž“αž’αžΆαž…αž‘αžΆαž‰αž™αž€αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈαž±αž€αžΆαžŸαž“αŸαŸ‡αž”αžΆαž“αž‘αŸ... αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžšαŸ†αž›αžΉαž€αž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„ αžŠαŸ‚αž›αž‡αžΆαž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αžœαžΆαž˜αž·αž“αž’αžΆαž…αž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ” αž™αžΎαž„αž€αŸαž˜αž·αž“αžαŸ’αžšαžΌαžœαž—αŸ’αž›αŸαž…αž’αŸ†αž–αžΈαž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαž˜αŸαž™αžŠαŸ‚αžšαŸ– αž—αŸ’αž“αŸ‚αž€αžšαž”αžŸαŸ‹αž’αžαž·αžαž·αž‡αž“αž”αžΆαž“αž‰αŸαžšαž–αžΈαž€αžΆαžšαž…αžΆαž€αž…αŸαž‰αž–αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž™αŸ‰αžΆαž„αž…αŸ’αžšαžΎαž“αŸ”

αžαžΆαž˜αž§αžαŸ’αžŠαž˜αž‚αžαž·αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžš αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž“αŸƒαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ memcached αž“αž·αž„αž€αžΆαžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΆαžšαž…αž˜αŸ’αž›αž„ αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž€αŸ†αž αž»αžŸαž¬αž€αŸ†αž αž»αžŸαŸ” αž”αžΆαž“αž‡αž½αž™αž™αžΎαž„αž’αž“αž»αžœαžαŸ’αžαž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž“αŸαŸ‡αŸ” mcrouter.

mcrouter

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžšαŸ‰αŸ„αžαž‘αŸαžš memcached αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™ Facebook αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžšαž”αžŸαŸ‹αžœαžΆαŸ” αžœαžΆαž‚αžΆαŸ†αž‘αŸ’αžšαž–αž·αž’αžΈαž€αžΆαžšαž’αžαŸ’αžαž”αž‘ memcached αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαž αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“ memcached αž‘αŸ…αžŸαž˜αžΆαž˜αžΆαžαŸ’αžšαž†αŸ’αž€αž½αžαŸ” αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž“αŸƒ mcouter αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ αžŸαŸαž…αž€αŸ’αžαžΈαž”αŸ’αžšαž€αžΆαžŸαž“αŸαŸ‡αŸ”. αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αžšαž”αžŸαŸ‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž˜αž»αžαž„αžΆαžšαž’αŸ†αž‘αžΌαž›αžΆαž™ αžœαžΆαž’αžΆαž…αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ–

  • αžαžαž…αž˜αŸ’αž›αž„;
  • αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž€αŸ†αž αž»αžŸαž€αžΎαžαž‘αžΎαž„αŸ”

αž‘αŸ…αž’αŸ’αžœαžΎαž€αžΆαžš!

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ 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αžŠαŸ‚αž›αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžŠαŸ„αž™αž…αŸƒαžŠαž“αŸ’αž™αž“αžΌαžœαž’αžΆαž„ αž¬αž•αŸ’αž›αžΌαžœαž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αžœαžαŸ’αžαž»αž’αžΆαžšαŸ children. αž’αžΆαžαž»αž“αžΈαž˜αž½αž™αŸ—αž“αŸƒαž’αžΆαžšαŸαž“αŸαŸ‡αž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„αžœαŸαž“αž‡αžΆαž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ MissFailoverRouteαžŠαŸ‚αž›αž“αžΉαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αžΈαž˜αž½αž™αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαž„ αžšαž αžΌαžαž‘αžΆαž›αŸ‹αžαŸ‚αžœαžΆαž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αŸ’αžšαž‚αž›αŸ‹αž‡αžΌαž“αž’αžαž·αžαž·αž‡αž“αžœαž·αž‰αŸ”
  • αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž”αŸ’αžšαžΎαž•αŸ’αžαžΆαž…αŸ‹αž˜αž»αž MissFailoverRoute αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ’αžšαž»αž˜αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž…αŸ†αž“αž½αž“αž”αžΈ αž“αŸ„αŸ‡αžŸαŸ†αžŽαžΎαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αžΉαž„αž˜αž€αž˜αž»αž“αžŠαŸ†αž”αžΌαž„αž‘αŸ…αž€αžΆαž“αŸ‹ memcached αžŠαŸ†αž”αžΌαž„ αž αžΎαž™αž“αŸ…αžŸαž›αŸ‹αž“αžΉαž„αž‘αž‘αž½αž›αžŸαŸ†αžŽαžΎαž“αŸ…αž›αžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž”αŸ‚αž”αž“αŸαŸ‡αž“αžΉαž„αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“ αž”αž“αŸ’αž‘αž»αž€αž›αžΎαžŸαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ†αž”αžΌαž„αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜αž…αŸ†αž“αž½αž“αž”αžΈαžŠαŸ‚αž›αž˜αžΆαž“αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž›αŸ†αžŠαžΆαž”αŸ‹αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž–αž½αž€αžœαžΆαžŠαŸ„αž™αž…αŸƒαžŠαž“αŸ’αž™αŸ”
  • αžŸαŸ†αžŽαžΎαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (αž αžΎαž™αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆ) αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎ AllMajorityRoute. αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž“αŸαŸ‡αž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαž„ αž αžΎαž™αžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž–αžΈαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹ N/2 + 1 αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αž‚αŸαŸ” αž–αžΈαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ AllSyncRoute αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžšαžŸαŸαžšαžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ„αŸ‡αž”αž„αŸ‹αž…αŸ„αž› αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž“αŸαŸ‡αž‘αžΆαž˜αž‘αžΆαžšαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‡αžΆαžœαž·αž‡αŸ’αž‡αž˜αžΆαž“αž–αžΈ всСх αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜ - αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸαžœαžΆαž“αžΉαž„αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰ SERVER_ERROR. αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆ mcrouter αž“αžΉαž„αž”αž“αŸ’αžαŸ‚αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“ αž˜αž»αžαž„αžΆαžš PHP αž αŸ… αž“αžΉαž„αžαŸ’αžšαž‘αž”αŸ‹αž€αŸ†αž αž»αžŸ αž αžΎαž™αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αŸ” AllMajorityRoute αž˜αž·αž“αž˜αžΆαž“αž—αžΆαž–αžαžΉαž„αžšαŸ‰αžΉαž„αžαŸ’αž›αžΆαŸ†αž„αž‘αŸ αž αžΎαž™αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžšαž αžΌαžαžŠαž›αŸ‹αž–αžΆαž€αŸ‹αž€αžŽαŸ’αžαžΆαž›αž“αŸƒαž’αž„αŸ’αž‚αž—αžΆαž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαž€αž…αŸαž‰αž–αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž„αž›αžΎαŸ”

αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž…αž˜αŸ’αž”αž„ αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸαŸ‡αž‚αžΊαžαžΆαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž–αž·αžαž‡αžΆαž˜αž·αž“αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αŸαž“αŸ„αŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαžΎαž“αžΈαž˜αž½αž™αŸ—αž–αžΈαž’αžαž·αžαž·αž‡αž“ N αžŸαŸ†αžŽαžΎαž‘αŸ… memcached αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· - αž‘αŸ… αž‘αŸ…αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαž„αŸ” αž™αžΎαž„β€‹αž’αžΆαž…β€‹αž€αžΆαžαŸ‹β€‹αž”αž“αŸ’αžαž™β€‹αž…αŸ†αž“αž½αž“β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αž”αž˜αŸ’αžšαžΎβ€‹αž€αŸ’αž“αž»αž„β€‹αž’αžΆαž„β€‹αž‡αžΆβ€‹αž§αž‘αžΆαž αžšαžŽαŸβ€‹αž˜αž€β€‹αž‡αžΆβ€‹αž–αžΈαžšαŸ– αž€αžΆαžšβ€‹αž›αŸ‡αž”αž„αŸ‹β€‹αž—αžΆαž–β€‹αž‘αž»αž€β€‹αž…αž·αžαŸ’αžβ€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αž•αŸ’αž‘αž»αž€ αž™αžΎαž„β€‹αž‘αž‘αž½αž›β€‹αž”αžΆαž“ΠΎαž›αŸ’αž”αžΏαž“αž€αžΆαž“αŸ‹αžαŸ‚αžαŸ’αž–αžŸαŸ‹ αž“αž·αž„αž”αž“αŸ’αž‘αž»αž€αžαž·αž…αž–αžΈαžŸαŸ†αžŽαžΎαž‘αŸ…αžŸαŸ„αžŠαŸ‚αž›αž”αžΆαžαŸ‹αŸ”

NBαŸ– αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αžšαž€αžƒαžΎαž‰αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαŸ€αž“ mcouter αž―αž€αžŸαžΆαžšαž“αŸ…αž›αžΎαžœαžΈαž‚αžΈ ΠΈ αž”αž‰αŸ’αž αžΆαž‚αž˜αŸ’αžšαŸ„αž„ (αžšαž½αž˜αž‘αžΆαŸ†αž„αžœαžαŸ’αžαž»αž”αž·αž‘αž‡αž·αž) αžαŸ†αžŽαžΆαž„αž±αŸ’αž™αžƒαŸ’αž›αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αŸ—αŸ”

αž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš mcouter

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ (αž“αž·αž„ memcached αžαŸ’αž›αž½αž“αžœαžΆ) αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Kubernetes - αž’αžΆαžŸαŸ’αžšαŸαž™αž αŸαžαž»αž“αŸαŸ‡ mcrouter αž€αŸαž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αž•αž„αžŠαŸ‚αžšαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ αž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αž’αž»αž„ αž™αžΎαž„β€‹αž”αŸ’αžšαžΎ werf, αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž“αžΉαž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡:

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)

... αž αžΎαž™αž‚αžΌαžšαžœαžΆαž…αŸαž‰ αž‚αŸ†αž“αžΌαžŸαžαžΆαž„αž˜αž½αž€αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–. αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž‚αž½αžšβ€‹αž±αŸ’αž™β€‹αž…αžΆαž”αŸ‹β€‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸβ€‹αž‚αžΊβ€‹αžαžΆβ€‹αž˜αžΆαž“β€‹αžαŸ‚β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αž—αŸ’αž›αžΎαž„β€‹αž€αŸ†αžŽαžαŸ‹β€‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’β€‹αžŠαŸ‚αž›β€‹αž•αŸ’αž’αŸ‚αž€β€‹αž›αžΎβ€‹αž…αŸ†αž“αž½αž“β€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αž…αž˜αŸ’αž›αž„β€‹ (αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸ laconic αž“αž·αž„αž†αžΎαžαž†αžΆαž™αž‡αžΆαž„αž“αŸαŸ‡αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžαž·αž™αŸ„αž”αž›αŸ‹):

{{- $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 αž€αŸ’αž“αž»αž„ memcached αž‚αžΊαž™αžΊαžαž‡αžΆαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžš αž αžΎαž™αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž“αŸƒαž€αžΆαžš hashing key αž‡αžΆαž”αŸ‹αž›αžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ‚αž‡αžΆαž˜αž½αž™ binary protocol αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸαŸ‡αž˜αž·αž“αž”αž„αŸ’αž€αžΎαžαž”αž‰αŸ’αž αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžšαžŽαžΈαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ”

αž›αŸ’αž”αž·αž…αž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαž”αžΌαž”αŸ– αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‚αžΊαž”αŸ’αžαžΌαžšαž‘αŸ…αž–αž·αž’αžΈαž€αžΆαžš ASCII αž αžΎαž™αž’αŸ’αžœαžΈαŸ—αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš.... αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž‘αž˜αŸ’αž›αžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž…αž˜αŸ’αž›αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„ αž―αž€αžŸαžΆαžšαž“αŸ…αž›αžΎ php.net αž”αžΆαž“αž›αŸαž„αžšαžΏαž„αž€αŸ†αž”αŸ’αž›αŸ‚αž„αžŠαŸαžƒαŸ„αžšαžƒαŸ…αŸ” αž’αŸ’αž“αž€β€‹αž“αžΉαž„β€‹αž˜αž·αž“β€‹αž’αžΆαž…β€‹αžšαž€β€‹αžƒαžΎαž‰β€‹αž…αž˜αŸ’αž›αžΎαž™β€‹αžαŸ’αžšαžΉαž˜β€‹αžαŸ’αžšαžΌαžœβ€‹αž“αŸ…β€‹αž‘αžΈβ€‹αž“αŸ„αŸ‡β€‹αž‘αŸ... αž›αž»αŸ‡β€‹αžαŸ’αžšαžΆβ€‹αžαŸ‚β€‹αž’αŸ’αž“αž€β€‹αžšαž˜αžΌαžšβ€‹αž‘αŸ…β€‹αž‘αžΈβ€‹αž”αž‰αŸ’αž…αž”αŸ‹β€‹αžŠαŸ‚αž›β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž•αŸ’αž“αŸ‚αž€ "αž€αŸ†αžŽαžαŸ‹αž…αŸ†αžŽαžΆαŸ†αžŠαŸ‚αž›αž”αžΆαž“αžšαž½αž˜αž…αŸ†αžŽαŸ‚αž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎ" αž“αžΉαž„αžŸαŸ’αž˜αŸ„αŸ‡αžαŸ’αžšαž„αŸ‹αž“αž·αž„ αž…αž˜αŸ’αž›αžΎαž™β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αŸ„αŸ‡β€‹αž†αŸ’αž“αŸ„αžβ€‹αžŠαŸ„αž™β€‹αž’αž™αž»αžαŸ’αžαž·αž’αž˜αŸŒ.

αž”αžΆαž‘ αžˆαŸ’αž˜αŸ„αŸ‡αž‡αž˜αŸ’αžšαžΎαžŸαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž‚αžΊ memcached.sess_binary_protocol. αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αžœαž‚αŸ’αž‚αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž‚αžΊαžŠαžΆαž€αŸ‹αž€αž»αž„αžαžΊαž“αŸαžšαž‡αžΆαž˜αž½αž™ mcouter αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž•αžαž‡αžΆαž˜αž½αž™ PHP!

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŠαŸ„αž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž™αžΎαž„αž’αžΆαž…αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž”αžΆαž“αŸ– αž”αž‰αŸ’αž αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž’αžαŸ‹αž±αž“αž€αŸ†αž αž»αžŸαžšαž”αžŸαŸ‹ memcached αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ αž αžΎαž™αž—αžΆαž–αž‡αžΏαž‡αžΆαž€αŸ‹αž“αŸƒαž€αžΆαžšαž•αŸ’αž‘αž»αž€αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžΎαž“αž‘αžΎαž„αŸ” αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž‚αž»αžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αŸαŸ‡αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž€αž“αŸ’αž›αŸ‚αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαžŸαž˜αž™αž»αž‘αŸ’αž’αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž“αŸ…αž›αžΎαžœαŸαž‘αž·αž€αžΆαŸ– αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αžΆαž“αž‘αž»αž“αž”αŸ†αžšαž»αž„ αž“αŸ„αŸ‡αž‡αžΈαžœαž·αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹αŸ” αž”αžΆαž‘ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž€αŸαž˜αžΆαž“αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αžœαžΆαžŠαŸ‚αžš αžœαžΆαž’αžΆαž…αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž‡αžΆ "αžˆαžΎαž…αŸ’αžšαžαŸ‹" αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαžŸαž“αŸ’αžŸαŸ†αž›αž»αž™ αž€αž”αŸ‹αž”αž‰αŸ’αž αžΆ αž αžΎαž™αž˜αž·αž“αž”αž„αŸ’αž€αžΎαžαžαŸ’αž˜αžΈ - αž αŸαžαž»αž’αŸ’αžœαžΈαž˜αž·αž“αž’αŸ’αžœαžΎ?

PS

αžŸαžΌαž˜αž’αžΆαž“αž•αž„αžŠαŸ‚αžšαž“αŸ…αž›αžΎαž”αŸ’αž›αž€αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹