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

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

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

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

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

ืžื” ื”ื‘ืขื™ื” ืขื memcached ืขืฆืžื•?

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

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

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

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

ืžืงืจืื•ื˜ืจ

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

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

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

ื‘ื ื™ื™ื” ื•ื”ืคืขืœืช 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 >

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

NBืคืจื•ื˜ื•ืงื•ืœ ASCII ื‘-memcached ืื™ื˜ื™ ื™ื•ืชืจ ืžื”ืคืจื•ื˜ื•ืงื•ืœ ื”ื‘ื™ื ืืจื™, ื•ื”ืืžืฆืขื™ื ื”ืกื˜ื ื“ืจื˜ื™ื™ื ืœื’ื™ื‘ื•ื‘ ืขืงื‘ื™ ืฉืœ ืžืคืชื—ื•ืช ืขื•ื‘ื“ื™ื ืจืง ืขื ื”ืคืจื•ื˜ื•ืงื•ืœ ื”ื‘ื™ื ืืจื™. ืื‘ืœ ื–ื” ืœื ื™ื•ืฆืจ ื‘ืขื™ื•ืช ื‘ืžืงืจื” ืกืคืฆื™ืคื™.

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

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

ืžืกืงื ื”

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

ื .ื‘.

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

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

ืงื ื” ืื™ืจื•ื— ืืžื™ืŸ ืœืืชืจื™ื ืขื ื”ื’ื ืช DDoS, ืฉืจืชื™ VPS VDS ๐Ÿ”ฅ ืงื ื” ืื—ืกื•ืŸ ืืชืจื™ื ืืžื™ืŸ ืขื ื”ื’ื ืช DDoS, ืฉืจืชื™ VPS VDS | ProHoster