Fa'aaogā le mcrouter e fa'alava le memcached fa'alava

Fa'aaogā le mcrouter e fa'alava le memcached fa'alava

O le atinaʻeina o poloketi maualuga i soʻo se gagana e manaʻomia ai se auala faʻapitoa ma le faʻaogaina o meafaigaluega faʻapitoa, ae a oʻo mai i talosaga ile PHP, e mafai ona faʻateleina le tulaga e tatau ona e atiina ae, mo se faʻataʻitaʻiga, lava server talosaga. I lenei faʻamatalaga o le a matou talanoa e uiga i le tiga masani i le tufatufaina o le teuina o sauniga ma faʻamaumauga faʻamaumauga i memcached ma le auala na matou foia ai nei faʻafitauli i se tasi "uarota" poloketi.

O le toa o le taimi o se PHP talosaga e faʻavae i luga o le symfony 2.3 framework, lea e le o aofia uma i fuafuaga faʻapisinisi e faʻafouina. I le faaopoopo atu i le teuina o sauniga masani, o lenei poloketi na faʻaaogaina atoatoa "caching mea uma" faiga faavae i memcached: tali i talosaga i le database ma API servers, fuʻa eseese, loka mo le synchronizing code execution ma sili atu. I se tulaga faapena, o le malepe o le memcached e avea ma mea leaga i le faʻaogaina o le talosaga. E le gata i lea, o le leiloa o le cache e oʻo atu ai i aʻafiaga ogaoga: o le DBMS e amata ona paʻu i le suʻega, API auaunaga amata faʻasaina talosaga, ma isi. O le fa'amautuina o le tulaga e ono alu ai le sefulu minute, ma o le taimi lea o le a matua telegese le tautua pe matua le avanoa.

Sa tatau ona matou saunia le mafai ona fa'alava faalava le talosaga ma sina taumafaiga itiiti, i.e. fa'atasi ai ma suiga la'ititi ile fa'apogai ma le fa'atinoina atoatoa. Fai le cache e le gata ina teteʻe i faʻaletonu, ae taumafai foi e faʻaitiitia faʻamaumauga mai ai.

O le a le mea e sese i le memcached lava ia?

I se tulaga lautele, o le faʻalauteleina o le memcached mo PHP e lagolagoina faʻamatalaga tufatufaina ma le teuina o sauniga mai le pusa. O le masini mo faʻamaufaʻailoga autu e mafai ai e oe ona tuʻu tutusa faʻamaumauga i luga o le tele o sapalai, faʻapitoa faʻafesoʻotaʻi ki faʻapitoa taʻitasi i se server patino mai le kulupu, ma faʻapipiʻiina meafaigaluega failover faʻamautinoa le maualuga o le avanoa o le caching service (ae, o le mea e leaga ai, leai ni fa'amatalaga).

E sili atu le lelei o mea i le teuina o sauniga: e mafai ona e faʻatulagaina memcached.sess_number_of_replicas, o se taunuuga o le a teuina faʻamatalaga i luga o le tele o sapalai i le taimi e tasi, ma i le tulaga o le toilalo o se tasi faʻataʻitaʻiga memcached, o le a faʻafeiloaʻi faʻamatalaga mai isi. Ae peitaʻi, afai e toe foʻi mai le 'auʻaunaga i luga ole laiga e aunoa ma faʻamaumauga (e pei ona masani ona tupu pe a uma le toe amataina), o nisi o ki o le a toe tufatufa atu i lona fiafia. O le mea moni o le uiga o lenei mea leiloa o fa'amaumauga o sauniga, talu ai e leai se auala e "alu" i se isi faʻataʻitaʻiga i le tulaga o se misi.

O meafaigaluega masani faletusi e fa'atatau i faalava scaling: latou te faʻatagaina oe e faʻateleina le cache i lapopoa tetele ma tuʻuina atu avanoa i ai mai code faʻapipiʻi i luga o sapalai eseese. Ae ui i lea, i lo tatou tulaga, o le tele o faʻamaumauga teuina e le sili atu i le tele o gigabytes, ma o le faʻatinoga o le tasi pe lua nodes e lava. E tusa ai, na o le pau lava le mea faigaluega masani e mafai ona faʻamautinoa le maua o le memcached aʻo tausia ia le itiiti ifo ma le tasi le cache faʻataʻitaʻiga i le tulaga galue. Ae ui i lea, e leʻi mafai ona faʻaaogaina e oʻo lava i lenei avanoa ... O iinei e taua le manatuaina o le tuai o le faʻavae na faʻaaogaina i le poloketi, o le mea lea na le mafai ai ona maua le talosaga e galue ma se vaitaele o sapalai. Aua nei galo foi e uiga i le leiloa o faʻamaumauga o sauniga: o mata o le tagata faʻatau na faʻafefe mai le tele o le logo out o tagata faʻaoga.

O le mea sili sa manaʻomia kopi o faʻamaumauga i memcached ma le faʻaaogaina o kopi i le tulaga o se mea sese po o se mea sese. Fesoasoani ia i matou e faʻatino lenei taʻiala mcrouter.

mcrouter

O se router memcached lea na atiae e le Facebook e foia ai ona faafitauli. E lagolagoina le memcached text protocol, lea e mafai ai fua fa'apipi'i memcached i vaega valea. E mafai ona maua se faʻamatalaga auiliili o le mcrouter i totonu lenei faasilasilaga. Faatasi ai ma isi mea lautele galuega tauave e mafai ona faia mea tatou te manaʻomia:

  • toe fai faamaumauga;
  • toe fa'afo'i i isi 'au'aunaga i le vaega pe a tupu se mea sese.

Alu i le galuega!

mcrouter configuration

O le a ou alu saʻo i le 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"
       ]
     }
   }
 }
}

Aisea e tolu vaitaele? Aisea e toe fai ai le server? Se'i tatou va'ai pe fa'afefea ona aoga.

  • I lenei faʻatulagaga, e filifilia e le mcrouter le ala e tuʻuina atu ai le talosaga e faʻavae i luga o le poloaiga talosaga. Ua taʻu atu e le tama ia te ia lenei mea OperationSelectorRoute.
  • GET talosaga e alu i le pule RandomRoutelea e filifili fa'afuase'i se vaita'ele po'o se auala i totonu o fa'asologa o mea children. O elemene ta'itasi o lenei fa'asologa o lo'o avea ma fa'atonu MissFailoverRoute, lea o le a alu i totonu o 'auʻaunaga taʻitasi i totonu o le vaitaele seia maua se tali faʻatasi ma faʻamaumauga, lea o le a toe faʻafoʻi atu i le kalani.
  • Afai matou te faʻaaogaina faʻapitoa MissFailoverRoute fa'atasi ai ma se vaitaele o le tolu 'au'aunaga, ona o'o mai ai lea o talosaga uma i le fa'ata'ita'iga muamua memcached, ma o le a maua e isi fa'atonuga i luga o se fa'avae totoe pe a leai se fa'amatalaga. O se auala faapena o le a taitai atu ai i tele uta i luga o le server muamua i le lisi, o lea na filifili ai e fausia ni vaitaele se tolu ma tuatusi i faʻasologa eseese ma filifili faʻafuaseʻi.
  • O isi talosaga uma (ma o se fa'amaumauga lenei) o lo'o fa'aogaina e fa'aaoga AllMajorityRoute. E tu'uina atu e lenei tagata fa'atonu talosaga i 'au'aunaga uma i totonu o le vaita'ele ma fa'atali mo tali mai ia le itiiti ifo N/2 + 1 o latou. Mai le faʻaaogaina AllSyncRoute aua o galuega tusitusi e tatau ona lafoai, talu ai o lenei metotia e manaʻomia ai se tali lelei mai всех 'au'aunaga i le vaega - a leai o le a toe fo'i mai SERVER_ERROR. E ui o le a faʻaopoopo e le mcrouter faʻamatalaga i faʻamaumauga avanoa, o le valaʻau PHP galuega o le a toe faafoi mai se mea sese ma o le a fa'ailoa mai. AllMajorityRoute e le fa'amalo ma fa'ataga e o'o atu i le afa o iunite e ave'esea mai le tautua e aunoa ma fa'afitauli o lo'o fa'amatalaina i luga.

Fa'aletonu autu O lenei polokalame e faapea afai e leai se faʻamatalaga i totonu o le cache, o talosaga taʻitasi mai le kalani N talosaga i memcached o le a faia moni lava - ia i tagata uma 'au'auna i le vaita'ele. E mafai ona matou faʻaititia le numera o 'auʻaunaga i vaitaele, mo se faʻataʻitaʻiga, i le lua: ositaulagaina le faʻatuatuaina o le teuina, matou te mauaоmaualuga le saoasaoa ma itiiti le uta mai talosaga i ki misi.

NB: E mafai foi ona e mauaina ni sootaga aoga mo le aoaoina o le mcrouter fa'amaumauga ile wiki и mataupu tau galuega (e aofia ai ma tapuni), e fai ma sui o se faleteuoloa atoa o faatulagaga eseese.

Fausiaina ma ta'avale mcrouter

O la matou talosaga (ma le memcached lava ia) e tamoʻe i Kubernetes - e tusa ai, o loʻo i ai foi le mcrouter iina. Mo fa'apotopotoga fa'amau matou te faaaogaina werf, o le config o le a pei o lenei:

NB: O lisi o loʻo tuʻuina atu i totonu o le tusiga o loʻo lolomiina i totonu o le fale teu oloa 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)

... ma tusi ata Siata foeuli. O le mea manaia e na'o le config generator e fa'atatau i le numera o kopi (afai ei ai se tasi e sili atu le laconic ma le aulelei filifiliga, faʻasoa i faʻamatalaga):

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

Matou te taʻavale i totonu o le siosiomaga suʻega ma siaki:

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

O le su'esu'eina o le tusitusiga o le mea sese e le'i maua ai se i'uga, ae mo le fesili "mcrouter php"I le pito i luma o le faafitauli sili ona leva e leʻi foia o le poloketi - leai se lagolago memcached binary protocol.

NB: O le ASCII protocol i memcached e sili atu lemu nai lo le binary, ma o auala masani o le faʻaogaina o ki faʻamaufaʻailoga e naʻo le galue i le binary protocol. Ae e le tupu ai ni faʻafitauli mo se mataupu faʻapitoa.

O le togafiti o loʻo i totonu o le ato: pau le mea e tatau ona e faia o le fesuiaʻi i le ASCII protocol ma o le a aoga mea uma.... Ae ui i lea, i lenei tulaga, o le masani o le sailia o tali i totonu fa'amaumauga ile php.net na faia se tala malie mataga. O le ae le mauaina le tali saʻo iina ... vagana ai, ioe, e te taʻavale i le pito, o fea i totonu o le vaega "Fa'amatalaga sao a le tagata fa'aoga" o le a faamaoni ma tali le sa'o le palotaina.

Ioe, o le igoa filifiliga sa'o o le memcached.sess_binary_protocol. E tatau ona faʻagata, a maeʻa lea o le a amata ona galue le vasega. Pau lava le mea o loʻo totoe o le tuʻuina lea o le atigipusa ma le mcrouter i totonu o se pusa ma PHP!

iʻuga

O le mea lea, i le naʻo suiga o atinaʻe na mafai ai ona matou foia le faʻafitauli: o le mataupu i le faʻapalepale faʻaletonu memcached ua uma ona foia, ma ua faʻateleina le faʻatuatuaina o le teuina o cache. I le faaopoopo atu i tulaga lelei mo le talosaga, na maua ai le avanoa mo le gaioiga pe a galue i luga o le tulaga: pe a iai vaega uma e faʻaagaga, o le olaga o le pule e matua faʻafaigofie. Ioe, o lenei metotia e iai foʻi ona faʻaletonu, atonu e foliga mai o se "tootoo", ae afai e teu tupe, tanumia le faʻafitauli ma e le mafua ai ni mea fou - aisea e leai ai?

SALA

Faitau foi i la matou blog:

puna: www.habr.com

Faaopoopo i ai se faamatalaga