ืฉื™ืžื•ืฉ ื‘-mcrouter ื›ื“ื™ ืœืฉื ื•ืช ืืช ืงื ื” ื”ืžื™ื“ื” ืฉืœ memcached ืื•ืคืงื™ืช

ืฉื™ืžื•ืฉ ื‘-mcrouter ื›ื“ื™ ืœืฉื ื•ืช ืืช ืงื ื” ื”ืžื™ื“ื” ืฉืœ memcached ืื•ืคืงื™ืช

ืคื™ืชื•ื— ืคืจื•ื™ืงื˜ื™ื ื‘ืขื•ืžืก ื’ื‘ื•ื” ื‘ื›ืœ ืฉืคื” ื“ื•ืจืฉ ื’ื™ืฉื” ืžื™ื•ื—ื“ืช ื•ืฉื™ืžื•ืฉ ื‘ื›ืœื™ื ืžื™ื•ื—ื“ื™ื, ืืš ื›ืฉืžื“ื•ื‘ืจ ื‘ืืคืœื™ืงืฆื™ื•ืช ื‘-PHP ื”ืžืฆื‘ ื™ื›ื•ืœ ืœื”ื—ืžื™ืจ ืขื“ ื›ื“ื™ ื›ืš ืฉืฆืจื™ืš ืœืคืชื—, ืœืžืฉืœ, ืฉืจืช ื™ื™ืฉื•ืžื™ื ืžืฉืœื•. ื‘ื”ืขืจื” ื–ื• ื ื“ื‘ืจ ืขืœ ื”ื›ืื‘ ื”ืžื•ื›ืจ ืขื ืื—ืกื•ืŸ ื”ืคืขืœื•ืช ืžื‘ื•ื–ืจ ื•ืื—ืกื•ืŸ ื ืชื•ื ื™ื ื‘ืžื˜ืžื•ืŸ ื‘-memcached ื•ื›ื™ืฆื“ ืคืชืจื ื• ืืช ื”ื‘ืขื™ื•ืช ื”ืœืœื• ื‘ืคืจื•ื™ืงื˜ "ืžื—ืœืงื”" ืื—ื“.

ื’ื™ื‘ื•ืจ ื”ืื™ืจื•ืข ื”ื•ื ืืคืœื™ืงืฆื™ื™ืช PHP ื”ืžื‘ื•ืกืกืช ืขืœ ืžืกื’ืจืช ืกื™ืžืคื•ื ื™ื” 2.3, ืฉื›ืœืœ ืœื ื ื›ืœืœืช ื‘ืชื•ื›ื ื™ื•ืช ื”ืขืกืงื™ื•ืช ืœืขื“ื›ื•ืŸ. ื‘ื ื•ืกืฃ ืœืื—ืกื•ืŸ ื”ืคืขืœื•ืช ืกื˜ื ื“ืจื˜ื™ ืœืžื“ื™, ื”ืคืจื•ื™ืงื˜ ื”ื–ื” ืขืฉื” ื‘ื• ืฉื™ืžื•ืฉ ืžืœื ืžื“ื™ื ื™ื•ืช "ืœืฉืžื•ืจ ื”ื›ืœ ื‘ืžื˜ืžื•ืŸ". ื‘-memcached: ืชื’ื•ื‘ื•ืช ืœื‘ืงืฉื•ืช ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื•ืฉืจืชื™ ื”-API, ื“ื’ืœื™ื ืฉื•ื ื™ื, ืžื ืขื•ืœื™ื ืœืกื ื›ืจื•ืŸ ื‘ื™ืฆื•ืข ืงื•ื“ ื•ืขื•ื“ ื•ืขื•ื“. ื‘ืžืฆื‘ ื›ื–ื”, ื”ืชืžื•ื˜ื˜ื•ืช ืฉืœ memcached ื”ื•ืคื›ืช ืงื˜ืœื ื™ืช ืœืชืคืขื•ืœ ื”ืืคืœื™ืงืฆื™ื”. ื‘ื ื•ืกืฃ, ืื•ื‘ื“ืŸ ืžื˜ืžื•ืŸ ืžื•ื‘ื™ืœ ืœืชื•ืฆืื•ืช ื—ืžื•ืจื•ืช: ื”-DBMS ืžืชื—ื™ืœ ืœืคืจื•ืฅ ื‘ืชืคืจื™ื, ืฉื™ืจื•ืชื™ API ืžืชื—ื™ืœื™ื ืœืืกื•ืจ ื‘ืงืฉื•ืช ื•ื›ื•'. ื™ื™ืฆื•ื‘ ื”ืžืฆื‘ ืขืฉื•ื™ ืœื”ื™ืžืฉืš ืขืฉืจื•ืช ื“ืงื•ืช, ื•ื‘ืžื”ืœืš ื”ื–ืžืŸ ื”ื–ื” ื”ืฉื™ืจื•ืช ื™ื”ื™ื” ืื™ื˜ื™ ื ื•ืจื ืื• ืœื ื–ืžื™ืŸ ืœื—ืœื•ื˜ื™ืŸ.

ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœืกืคืง ื”ื™ื›ื•ืœืช ืœืฉื ื•ืช ืื•ืคืงื™ืช ืืช ื”ื™ื™ืฉื•ื ืขื ืžืขื˜ ืžืืžืฅ, ื›ืœื•ืžืจ ืขื ืฉื™ื ื•ื™ื™ื ืžื™ื ื™ืžืœื™ื™ื ื‘ืงื•ื“ ื”ืžืงื•ืจ ื•ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ืžืœืื” ื ืฉืžืจืช. ื”ืคื•ืš ืืช ื”ืžื˜ืžื•ืŸ ืœื ืจืง ืขืžื™ื“ ื‘ืคื ื™ ื›ืฉืœื™ื, ืืœื ื’ื ื ืกื” ืœืžื–ืขืจ ืื•ื‘ื“ืŸ ื ืชื•ื ื™ื ืžืžื ื•.

ืžื” ืจืข ื‘-memcached ืขืฆืžื•?

ื‘ืื•ืคืŸ ื›ืœืœื™, ื”ืชื•ืกืฃ memcached ืขื‘ื•ืจ PHP ืชื•ืžืš ื‘ื ืชื•ื ื™ื ืžื‘ื•ื–ืจื™ื ื•ืื—ืกื•ืŸ ื”ืคืขืœื” ืžื—ื•ืฅ ืœืงื•ืคืกื”. ืžื ื’ื ื•ืŸ ื”ื’ื™ื‘ื•ื‘ ืขืงื‘ื™ ืฉืœ ืžืคืชื—ื•ืช ืžืืคืฉืจ ืœืš ืœื”ืคื™ืฅ ื ืชื•ื ื™ื ื‘ืื•ืคืŸ ืฉื•ื•ื” ื‘ืฉืจืชื™ื ืจื‘ื™ื, ืชื•ืš ื”ืชื™ื™ื—ืกื•ืช ื™ื™ื—ื•ื“ื™ืช ืœื›ืœ ืžืคืชื— ืกืคืฆื™ืคื™ ืœืฉืจืช ืกืคืฆื™ืคื™ ืžื”ืงื‘ื•ืฆื”, ื•ื›ืœื™ ื›ืฉืœ ืžื•ื‘ื ื™ื ืžื‘ื˜ื™ื—ื™ื ื–ืžื™ื ื•ืช ื’ื‘ื•ื”ื” ืฉืœ ืฉื™ืจื•ืช ื”ืžื˜ืžื•ืŸ (ืืš, ืœืžืจื‘ื” ื”ืฆืขืจ, ืื™ืŸ ืžื™ื“ืข).

ื”ืžืฆื‘ ืงืฆืช ื™ื•ืชืจ ื˜ื•ื‘ ืขื ืื—ืกื•ืŸ ื”ืคืขืœื•ืช: ืืชื” ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ memcached.sess_number_of_replicas, ื›ืชื•ืฆืื” ืžื›ืš ื”ื ืชื•ื ื™ื ื™ืื•ื—ืกื ื• ื‘ืžืกืคืจ ืฉืจืชื™ื ื‘ื• ื–ืžื ื™ืช, ื•ื‘ืžืงืจื” ืฉืœ ื›ืฉืœ ืฉืœ ืžื•ืคืข ืื—ื“ ืฉืœ memcached, ื”ื ืชื•ื ื™ื ื™ื•ืขื‘ืจื• ืžืื—ืจื™ื. ืขื ื–ืืช, ืื ื”ืฉืจืช ื™ื—ื–ื•ืจ ืœืื™ื ื˜ืจื ื˜ ืœืœื ื ืชื•ื ื™ื (ื›ืคื™ ืฉืงื•ืจื” ื‘ื“ืจืš ื›ืœืœ ืœืื—ืจ ื”ืคืขืœื” ืžื—ื“ืฉ), ื—ืœืง ืžื”ืžืคืชื—ื•ืช ื™ื—ื•ืœืงื• ืžื—ื“ืฉ ืœื˜ื•ื‘ืชื•. ืœืžืขืฉื” ื–ื” ืื•ืžืจ ืื•ื‘ื“ืŸ ื ืชื•ื ื™ ื”ืคื’ื™ืฉื”, ืฉื›ืŸ ืื™ืŸ ื“ืจืš "ืœืœื›ืช" ืœืขืชืง ืื—ืจ ื‘ืžืงืจื” ืฉืœ ืคืกืคื•ืก.

ื›ืœื™ ืกืคืจื™ื™ื” ืกื˜ื ื“ืจื˜ื™ื™ื ืžื›ื•ื•ื ื™ื ื‘ืขื™ืงืจ ืื•ืคืงื™ ืงื ื” ืžื™ื“ื”: ื”ื ืžืืคืฉืจื™ื ืœืš ืœื”ื’ื“ื™ืœ ืืช ื”ืžื˜ืžื•ืŸ ืœื’ื“ืœื™ื ืขืฆื•ืžื™ื ื•ืœืกืคืง ืœื• ื’ื™ืฉื” ืžืงื•ื“ ื”ืžืชืืจื— ื‘ืฉืจืชื™ื ืฉื•ื ื™ื. ืขื ื–ืืช, ื‘ืžืฆื‘ื ื•, ื ืคื— ื”ื ืชื•ื ื™ื ื”ืžืื•ื—ืกื ื™ื ืื™ื ื• ืขื•ืœื” ืขืœ ืžืกืคืจ ื’ื™ื’ื”-ื‘ื™ื™ื˜, ื•ื”ื‘ื™ืฆื•ืขื™ื ืฉืœ ืฆืžืช ืื—ื“ ืื• ืฉื ื™ื™ื ืžืกืคื™ืงื™ื. ื‘ื”ืชืื ืœื›ืš, ื”ื›ืœื™ื ื”ืกื˜ื ื“ืจื˜ื™ื™ื ื”ืฉื™ืžื•ืฉื™ื™ื ื”ื™ื—ื™ื“ื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ื”ื‘ื˜ื—ืช ื–ืžื™ื ื•ืช ื”-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 ืขื ืžืื’ืจ ืฉืœ ืฉืœื•ืฉื” ืฉืจืชื™ื, ืื– ื›ืœ ื”ื‘ืงืฉื•ืช ื™ื’ื™ืขื• ืชื—ื™ืœื” ืœืžื•ืคืข ื”ืจืืฉื•ืŸ ืฉืœ memcached, ื•ื”ืฉืืจ ื™ืงื‘ืœื• ื‘ืงืฉื•ืช ืขืœ ื‘ืกื™ืก ืฉื™ื•ืจื™ ื›ืืฉืจ ืื™ืŸ ื ืชื•ื ื™ื. ื’ื™ืฉื” ื›ื–ื• ืชื•ื‘ื™ืœ ืœ ืขื•ืžืก ืžื•ืคืจื– ืขืœ ื”ืฉืจืช ื”ืจืืฉื•ืŸ ื‘ืจืฉื™ืžื”, ืื– ื”ื•ื—ืœื˜ ืœื™ืฆื•ืจ ืฉืœื•ืฉื” ืžืื’ืจื™ื ืขื ื›ืชื•ื‘ื•ืช ื‘ืจืฆืคื™ื ืฉื•ื ื™ื ื•ืœื‘ื—ื•ืจ ืื•ืชื ื‘ืื•ืคืŸ ืืงืจืื™.
  • ื›ืœ ืฉืืจ ื”ื‘ืงืฉื•ืช (ื•ื–ื• ืจืฉื•ืžื”) ืžืขื•ื‘ื“ื•ืช ื‘ืืžืฆืขื•ืช AllMajorityRoute. ื”ืžื˜ืคืœ ื”ื–ื” ืฉื•ืœื— ื‘ืงืฉื•ืช ืœื›ืœ ื”ืฉืจืชื™ื ื‘ืžืื’ืจ ื•ืžื—ื›ื” ืœืชื’ื•ื‘ื•ืช ืœืคื—ื•ืช ืž-N/2 + 1 ืžื”ื. ืžืฉื™ืžื•ืฉ AllSyncRoute ืขื‘ื•ืจ ืคืขื•ืœื•ืช ื›ืชื™ื‘ื” ื”ื™ื” ืฆืจื™ืš ืœื ื˜ื•ืฉ, ืฉื›ืŸ ืฉื™ื˜ื” ื–ื• ื“ื•ืจืฉืช ืชื’ื•ื‘ื” ื—ื™ื•ื‘ื™ืช ืž ื›ืœ ืฉืจืชื™ื ื‘ืงื‘ื•ืฆื” - ืื—ืจืช ื–ื” ื™ื—ื–ื•ืจ SERVER_ERROR. ืœืžืจื•ืช ืฉ-mcrouter ื™ื•ืกื™ืฃ ืืช ื”ื ืชื•ื ื™ื ืœืžื˜ืžื•ื ื™ื ื–ืžื™ื ื™ื, ื”ืคื•ื ืงืฆื™ื” ื”ืงื•ืจืืช ืœ-PHP ื™ื—ื–ื™ืจ ืฉื’ื™ืื” ื•ื™ื™ืฆื•ืจ ื”ื•ื“ืขื”. AllMajorityRoute ืื™ื ื• ื›ื” ืžื—ืžื™ืจ ื•ืžืืคืฉืจ ืœื”ื•ืฆื™ื ืขื“ ืžื—ืฆื™ืช ืžื”ื™ื—ื™ื“ื•ืช ืžืฉื™ืจื•ืช ืœืœื ื”ื‘ืขื™ื•ืช ื”ืžืชื•ืืจื•ืช ืœืขื™ืœ.

ื”ื—ื™ืกืจื•ืŸ ื”ืขื™ืงืจื™ ืกื›ื™ืžื” ื–ื• ื”ื™ื ืฉืื ื‘ืืžืช ืื™ืŸ ื ืชื•ื ื™ื ื‘ืžื˜ืžื•ืŸ, ืื– ืขื‘ื•ืจ ื›ืœ ื‘ืงืฉื” ืžื”ืœืงื•ื— ื™ื‘ื•ืฆืขื• ื‘ืคื•ืขืœ N ื‘ืงืฉื•ืช ืœ-memcached - ื›ื“ื™ ื›ืœ ืฉืจืชื™ื ื‘ื‘ืจื™ื›ื”. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืฆืžืฆื ืืช ืžืกืคืจ ื”ืฉืจืชื™ื ื‘-pools, ืœืžืฉืœ, ืœืฉื ื™ื™ื: ืœื”ืงืจื™ื‘ ืืช ืืžื™ื ื•ืช ื”ืื—ืกื•ืŸ, ืื ื—ื ื• ืžืงื‘ืœื™ืะพืžื”ื™ืจื•ืช ื’ื‘ื•ื”ื” ื™ื•ืชืจ ื•ืคื—ื•ืช ืขื•ืžืก ืžื‘ืงืฉื•ืช ืœืžืคืชื—ื•ืช ื—ืกืจื™ื.

NB: ื™ื™ืชื›ืŸ ืฉืชืžืฆื ื’ื ืงื™ืฉื•ืจื™ื ืฉื™ืžื•ืฉื™ื™ื ืœืœื™ืžื•ื“ mcrouter ืชื™ืขื•ื“ ื‘ื•ื•ื™ืงื™ ะธ ื‘ืขื™ื•ืช ืคืจื•ื™ืงื˜ (ื›ื•ืœืœ ืกื’ื•ืจื™ื), ื”ืžื™ื™ืฆื’ื™ื ืžื—ืกืŸ ืฉืœื ืฉืœ ืชืฆื•ืจื•ืช ืฉื•ื ื•ืช.

ื‘ื ื™ื™ื” ื•ื”ืคืขืœื” ืฉืœ ืžืงืจื•ื™ื˜ืจ

ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• (ื•ื’ื memcached ืขืฆืžื”) ืคื•ืขืœืช ื‘-Kubernetes - ื‘ื”ืชืื, ื’ื 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 ื‘-memcached ืื™ื˜ื™ ื™ื•ืชืจ ืžื”ืคืจื•ื˜ื•ืงื•ืœ ื”ื‘ื™ื ืืจื™, ื•ืืžืฆืขื™ื ืกื˜ื ื“ืจื˜ื™ื™ื ืฉืœ ื’ื™ื‘ื•ื‘ ืžืคืชื— ืขืงื‘ื™ ืขื•ื‘ื“ื™ื ืจืง ืขื ื”ืคืจื•ื˜ื•ืงื•ืœ ื”ื‘ื™ื ืืจื™. ืื‘ืœ ื–ื” ืœื ื™ื•ืฆืจ ื‘ืขื™ื•ืช ืœืžืงืจื” ืกืคืฆื™ืคื™.

ื”ื˜ืจื™ืง ื ืžืฆื ื‘ืชื™ืง: ื›ืœ ืžื” ืฉืฆืจื™ืš ืœืขืฉื•ืช ื–ื” ืœืขื‘ื•ืจ ืœืคืจื•ื˜ื•ืงื•ืœ ASCII ื•ื”ื›ืœ ื™ืขื‘ื•ื“.... ืขื ื–ืืช, ื‘ืžืงืจื” ื–ื”, ื”ื”ืจื’ืœ ืœื—ืคืฉ ืชืฉื•ื‘ื•ืช ื‘ ืชื™ืขื•ื“ ื‘-php.net ืฉื™ื—ืง ื‘ื“ื™ื—ื” ืื›ื–ืจื™ืช. ืœื ืชืžืฆืื• ืฉื ืืช ื”ืชืฉื•ื‘ื” ื”ื ื›ื•ื ื”... ืืœื ืื ื›ืŸ, ื›ืžื•ื‘ืŸ, ืชื’ืœืœื• ืขื“ ื”ืกื•ืฃ, ืื™ืคื” ื‘ืงื˜ืข "ื”ืขืจื•ืช ืชืจื ืžืฉืชืžืฉ" ื™ื”ื™ื” ื ืืžืŸ ื• ืชืฉื•ื‘ื” ืฉื”ืฆื‘ื™ืขื• ื ื’ื“ื• ื‘ืฆื•ืจื” ืœื ื”ื•ื’ื ืช.

ื›ืŸ, ืฉื ื”ืื•ืคืฆื™ื” ื”ื ื›ื•ืŸ ื”ื•ื memcached.sess_binary_protocol. ื–ื” ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืžื•ืฉื‘ืช, ื•ืœืื—ืจ ืžื›ืŸ ื”ืคืขืœื•ืช ื™ืชื—ื™ืœื• ืœืขื‘ื•ื“. ื›ืœ ืžื” ืฉื ืฉืืจ ื–ื” ืœื”ื›ื ื™ืก ืืช ื”ืžื™ื›ืœ ืขื mcrouter ืœืชืจืžื™ืœ ืขื PHP!

ืžืกืงื ื”

ืœืคื™ื›ืš, ื‘ืขื–ืจืช ืฉื™ื ื•ื™ื™ื ืชืฉืชื™ืชื™ื™ื ื‘ืœื‘ื“ ื”ืฆืœื—ื ื• ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื”: ื”ื‘ืขื™ื” ืขื ืกื‘ื™ืœื•ืช ืชืงืœื•ืช ื‘-memcached ื ืคืชืจื”, ื•ื”ืืžื™ื ื•ืช ืฉืœ ืื—ืกื•ืŸ ื”ืžื˜ืžื•ืŸ ื”ื•ื’ื“ืœื”. ื‘ื ื•ืกืฃ ืœื™ืชืจื•ื ื•ืช ื”ื‘ืจื•ืจื™ื ืœืืคืœื™ืงืฆื™ื”, ื–ื” ื ืชืŸ ืžืจื—ื‘ ืชืžืจื•ืŸ ื‘ืขื‘ื•ื“ื” ืขืœ ื”ืคืœื˜ืคื•ืจืžื”: ื›ืืฉืจ ืœื›ืœ ื”ืจื›ื™ื‘ื™ื ื™ืฉ ืจื–ืจื‘ื”, ื—ื™ื™ ื”ืžื ื”ืœ ืžืคื•ืฉื˜ื™ื ืžืื•ื“. ื›ืŸ, ืœืฉื™ื˜ื” ื”ื–ื• ื™ืฉ ื’ื ื—ืกืจื•ื ื•ืช, ื”ื™ื ืื•ืœื™ ื ืจืื™ืช ื›ืžื• "ืงื‘", ืื‘ืœ ืื ื”ื™ื ื—ื•ืกื›ืช ื›ืกืฃ, ืงื•ื‘ืจืช ืืช ื”ื‘ืขื™ื” ื•ืœื ื’ื•ืจืžืช ืœื—ื“ืฉื™ื - ืœืžื” ืœื?

ื .ื‘.

ืงืจื ื’ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”