Ke hoʻohana ʻana i ka mcrouter e hoʻonui i ka memcached ma ke alo

Ke hoʻohana ʻana i ka mcrouter e hoʻonui i ka memcached ma ke alo

ʻO ka hoʻomohala ʻana i nā papahana haʻahaʻa kiʻekiʻe ma kekahi ʻōlelo e koi i kahi ala kūikawā a me ka hoʻohana ʻana i nā mea hana kūikawā, akā i ka wā e pili ana i nā noi ma PHP, hiki ke hoʻonui ʻia ke kūlana a pono ʻoe e hoʻomohala, no ka laʻana, kikowaena noi ponoi. Ma kēia memo, e kamaʻilio mākou e pili ana i ka ʻeha maʻamau me ka mālama ʻana i ka hālāwai a me ka cache data ma memcached a pehea mākou i hoʻoponopono ai i kēia mau pilikia ma kahi papahana "ward".

ʻO ka hero o ka hanana he palapala PHP e pili ana i ka symfony 2.3 framework, ʻaʻole i hoʻokomo ʻia i nā hoʻolālā ʻoihana e hoʻonui. Ma waho aʻe o ka mālama ʻana i ka wā maʻamau, ua hoʻohana piha kēia papahana "caching mea a pau" kulekele i memcached: pane i nā noi i ka waihona a me nā kikowaena API, nā hae like ʻole, nā laka no ka synchronizing code execution a me nā mea hou aku. I kēlā kūlana, lilo ka haʻihaʻi o memcached i mea make i ka hana o ka noi. Eia kekahi, ʻo ka nalowale o ka cache e alakaʻi i nā hopena koʻikoʻi: hoʻomaka ka DBMS e haki i nā seams, hoʻomaka nā lawelawe API e pāpā i nā noi, etc. ʻO ka hoʻokūpaʻa ʻana i ke kūlana he ʻumi mau minuke, a i kēia manawa e lohi nui a loaʻa ʻole paha ka lawelawe.

Pono mākou e hoʻolako ka hiki ke hoʻonui i ka palapala noi me ka hoʻoikaika liʻiliʻi, i.e. me nā hoʻololi liʻiliʻi i ke code kumu a mālama ʻia nā hana piha. E ho'āʻo e hōʻemi i ka nalowale o ka ʻikepili mai ia mea.

He aha ka hewa me ka memcached iā ia iho?

Ma keʻano laulā, kākoʻo ka hoʻonui memcached no PHP i ka ʻikepili i hāʻawi ʻia a me ka waiho ʻana o ka hālāwai ma waho o ka pahu. ʻO ka mīkini no ka hashing kī mau e hiki ai iā ʻoe ke puʻunaue like i ka ʻikepili ma nā kikowaena he nui, e kamaʻilio kūʻokoʻa i kēlā me kēia kī kikoʻī i kahi kikowaena kikoʻī mai ka hui, a me nā mea hana failover i kūkulu ʻia e hōʻoia i ka loaʻa kiʻekiʻe o ka lawelawe caching (akā, ʻaʻole naʻe, ʻaʻohe ʻikepili).

ʻOi aku ka maikaʻi o nā mea me ka waiho ʻana o ka manawa: hiki iā ʻoe ke hoʻonohonoho memcached.sess_number_of_replicas, ma muli o ia mea e mālama ʻia ai ka ʻikepili ma nā kikowaena he nui i ka manawa hoʻokahi, a i ka hopena o ka hāʻule ʻole o hoʻokahi laʻana memcached, e hoʻoili ʻia ka ʻikepili mai nā poʻe ʻē aʻe. Eia nō naʻe, inā hoʻi mai ke kikowaena pūnaewele me ka ʻole o ka ʻikepili (e like me ka hana maʻamau ma hope o ka hoʻomaka hou ʻana), e hāʻawi hou ʻia kekahi o nā kī i kona makemake. ʻOiaʻiʻo e manaʻo kēia poho o ka ikepili kau, no ka mea, ʻaʻohe ala e "hele" i kahi kope ʻē aʻe i ka wā i hala.

ʻO nā mea hana hale waihona puke maʻamau ke kuhikuhi nui ʻia paepae scaling: ʻae lākou iā ʻoe e hoʻonui i ka cache i nā nui nui a hāʻawi i ke komo iā ia mai nā code i hoʻokipa ʻia ma nā kikowaena like ʻole. Eia nō naʻe, i ko mākou kūlana, ʻaʻole i ʻoi aku ka nui o ka ʻikepili i mālama ʻia ma mua o nā gigabytes, a ua lawa ka hana o hoʻokahi a ʻelua paha nodes. No laila, ʻo nā mea hana maʻamau pono wale nō e hiki ke hōʻoia i ka loaʻa ʻana o ka memcached me ka mālama ʻana i hoʻokahi hiʻohiʻona cache ma ke kūlana hana. Eia nō naʻe, ʻaʻole hiki ke hoʻohana i kēia manawa kūpono ... Eia ka mea kūpono e hoʻomanaʻo i ka wā kahiko o ka framework i hoʻohana ʻia i ka papahana, ʻo ia ke kumu i hiki ʻole ai ke kiʻi i ka noi e hana me kahi wai o nā kikowaena. Mai poina hoʻi e pili ana i ka nalowale ʻana o ka ʻikepili o ka hālāwai: ʻōniʻi ka maka o ka mea kūʻai mai ka logout nui o nā mea hoʻohana.

ʻO ke kūpono i koi ʻia ka hoʻopili hou ʻana o nā moʻolelo ma memcached a me ke kaʻe ʻana i nā replika ina he kuhi hewa. Ua kōkua iā mākou e hoʻokō i kēia hoʻolālā mcrouter.

mcrouter

He mea hoʻokele memcached kēia i hoʻomohala ʻia e Facebook e hoʻoponopono i kona mau pilikia. Kākoʻo ia i ka protocol text memcached, i hiki ai nā mea hoʻonohonoho memcached scale i na mea pupule. Hiki ke ʻike ʻia kahi wehewehe kikoʻī o ka mcrouter ma keia hoolaha. Ma waena o nā mea ʻē aʻe hana ākea hiki iā ia ke hana i nā mea e pono ai mākou:

  • e hoʻopili i ka moʻolelo;
  • e hoʻihoʻi i nā kikowaena ʻē aʻe o ka hui inā loaʻa kahi hewa.

E hele i ka hana!

hoʻonohonoho microuter

E hele pololei wau i ka config:

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

No ke aha ʻekolu mau loko? No ke aha i hana hou ʻia ai nā kikowaena? E noʻonoʻo kākou pehea e hana ai.

  • Ma kēia hoʻonohonoho, koho ʻo mcrouter i ke ala e hoʻouna ʻia ai ka noi ma muli o ke kauoha noi. 'Ōlelo ke kanaka iā ia i kēia OperationSelectorRoute.
  • E hele nā ​​noi GET i ka mea lawelawe RandomRouteka mea e koho wale i ka loko a i ʻole ke ala ma waena o nā mea hoʻonohonoho children. ʻO kēlā me kēia ʻāpana o kēia ʻano he mea lawelawe MissFailoverRoute, e hele i kēlā me kēia kikowaena i loko o ka loko wai a loaʻa iā ia kahi pane me ka ʻikepili, e hoʻihoʻi ʻia i ka mea kūʻai aku.
  • Inā mākou i hoʻohana wale MissFailoverRoute me ka loko o ʻekolu mau kikowaena, a laila e hele mua nā noi a pau i ka manawa memcached mua, a ʻo ke koena e loaʻa nā noi ma ke koena i ka wā ʻaʻohe ʻikepili. ʻO ia ala e alakaʻi ai i kaumaha nui ma ke kikowaena mua o ka papa inoa, no laila ua hoʻoholo ʻia e hoʻohua i ʻekolu mau loko me nā helu wahi ma nā ʻano ʻokoʻa like ʻole a koho maʻamau iā lākou.
  • Hoʻohana ʻia nā noi ʻē aʻe a pau (a he moʻolelo kēia). AllMajorityRoute. Hoʻouna kēia mea lawelawe i nā noi i nā kikowaena āpau i ka loko wai a kali i nā pane mai ka liʻiliʻi N/2 + 1 o lākou. Mai ka hoʻohana ʻana AllSyncRoute no ka mea, ua haʻalele ʻia nā hana kākau, no ka mea pono kēia ʻano i ka pane maikaʻi mai o nā mea a pau nā kikowaena i ka hui - i ʻole e hoʻi mai SERVER_ERROR. ʻOiai e hoʻohui ʻo mcrouter i ka ʻikepili i nā cache i loaʻa, ʻo ke kāhea ʻana i ka hana PHP e hoʻihoʻi i kahi hewa a e hoʻopuka i ka leka hoʻomaopopo. AllMajorityRoute ʻAʻole koʻikoʻi loa a hiki i ka hapalua o nā ʻāpana ke lawe ʻia mai ka lawelawe me ka ʻole o nā pilikia i hōʻike ʻia ma luna.

ʻO ka hemahema nui ʻO kēia hoʻolālā inā ʻaʻohe ʻikepili i loko o ka cache, a laila no kēlā me kēia noi mai ka mea kūʻai aku N noi i memcached e hoʻokō maoli ʻia - i i nā mea a pau nā kikowaena i loko o ka loko. Hiki iā mākou ke hōʻemi i ka helu o nā kikowaena i loko o nā loko, no ka laʻana, i ʻelua: e kaumaha ana i ka hilinaʻi mālama, loaʻa iā mākouоʻoi aku ka wikiwiki a me ka liʻiliʻi o ka ukana mai nā noi i nā kī i nalowale.

NB: Loaʻa paha iā ʻoe nā loulou pono no ke aʻo ʻana i ka mcrouter palapala ma wiki и pilikia papahana (me nā mea i pani ʻia), e hōʻike ana i kahi hale kūʻai holoʻokoʻa o nā hoʻonohonoho like ʻole.

Ke kūkulu ʻana a me ka holo ʻana i ka mcrouter

Ke holo nei kā mākou noi (a me ka memcached iā ia iho) ma Kubernetes - no laila, aia nō ka mcrouter ma laila. No ka mea hui pahu hoʻohana mākou werf, ka config e like me kēia:

NB: Ua paʻi ʻia nā papa inoa i hāʻawi ʻia ma ka ʻatikala ma ka waihona 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)

... a kiʻi i waho Papa kuhi helm. ʻO ka mea hoihoi, aia wale nō kahi config generator e pili ana i ka helu o nā replicas (inā loaʻa i kekahi ke koho laconic a nani, e kaʻana like i nā manaʻo):

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

Hoʻopili mākou iā ia i loko o ke kaiapuni hoʻāʻo a nānā:

# 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 >

ʻAʻole i loaʻa nā hopena i ka ʻimi ʻana i ka kikokikona o ka hewa, akā no ka nīnau "mcrouter php"Ma ke alo ka pilikia mua loa o ka papahana - nele i ke kākoʻo protocol binary memcached.

NB: ʻOi aku ka lohi o ka protocol ASCII ma memcached ma mua o ka binary, a ʻo ke ʻano maʻamau o ka hashing kī paʻa e hana wale me ka protocol binary. Akā ʻaʻole kēia e hana i nā pilikia no kahi hihia kikoʻī.

Aia ka hoʻopunipuni i loko o ka ʻeke: ʻo ka mea wale nō āu e hana ai, e hoʻololi i ka protocol ASCII a e hana nā mea a pau.... Eia naʻe, i kēia hihia, ʻo ka maʻa o ka ʻimi ʻana i nā pane ma palapala ma php.net hoʻokani ʻino ʻino. ʻAʻole ʻoe e ʻike i ka pane pololei ma laila ... ke ʻole, ʻoiaʻiʻo, e ʻōwili ʻoe i ka hopena, ma kahi o ka ʻāpana "Memo i hāʻawi ʻia e ka mea hoʻohana" e malama pono a unfairly downvoted pane.

ʻAe, ʻo ka inoa koho kūpono memcached.sess_binary_protocol. Pono e hoʻopau ʻia, a laila e hoʻomaka nā hana. ʻO nā mea a pau e waiho ana i ka ipu me ka mcrouter i loko o kahi pod me PHP!

hopena

No laila, me nā hoʻololi ʻenehana wale nō i hiki iā mākou ke hoʻoponopono i ka pilikia: ua hoʻoholo ʻia ka pilikia me ka hoʻomanawanui hewa memcached, a ua hoʻonui ʻia ka hilinaʻi o ka mālama huna. Ma waho aʻe o nā pono kūpono no ka noi, hāʻawi kēia i kahi lumi no ka hana ʻana i ka wā e hana ai ma luna o ke kahua: inā loaʻa nā ʻāpana āpau i kahi mālama, ua maʻalahi loa ke ola o ka luna hoʻomalu. ʻAe, loaʻa i kēia ʻano nā drawbacks, ʻano like paha ia me ka "crutch", akā inā mālama ia i ke kālā, kanu i ka pilikia a ʻaʻole hoʻi i nā mea hou - no ke aha?

PS

E heluhelu pū ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka