Kushandisa mcrouter kuyera memcached yakachinjika

Kushandisa mcrouter kuyera memcached yakachinjika

Kugadzira mapurojekiti akaremerwa mumutauro chero upi zvake kunoda nzira yakakosha uye kushandiswa kwezvishandiso zvakakosha, asi kana zvasvika kune maapplication muPHP, mamiriro acho anogona kuwedzera zvekuti iwe unofanirwa kukudziridza, semuenzaniso. wega application server. Muchinyorwa ichi tichataura nezve kurwadziwa kwakajairika nekugoverwa kwesesheni kuchengetedza uye data caching mune memcached uye nekugadzirisa kwatakaita matambudziko aya mune imwe "wadhi" chirongwa.

Iyo gamba rechiitiko ndeye PHP application yakavakirwa pane symfony 2.3 chimiro, icho chisina kubatanidzwa zvachose muzvirongwa zvebhizinesi zvekuvandudza. Pamusoro pekuchengetwa kwesesheni kwakaringana, chirongwa ichi chakashandisa zvizere "caching zvese" mutemo mune memcached: mhinduro kune zvikumbiro kune dhatabhesi uye API maseva, akasiyana mireza, makiyi ekuyananisa kodhi kuuraya uye zvimwe zvakawanda. Mumamiriro ezvinhu akadaro, kuparara kwememcached kunouraya kushanda kwechikumbiro. Mukuwedzera, kurasikirwa kwecache kunotungamirira kumigumisiro yakakomba: DBMS inotanga kuputika pamasevhisi, API masevhisi anotanga kurambidza zvikumbiro, nezvimwe. Kudzikamisa mamiriro ezvinhu kunogona kutora makumi emaminetsi, uye panguva ino sevhisi ichanonoka zvakanyanya kana kusawanikwa zvachose.

Taifanira kupa kugona kuyera yakatwasuka application nekuedza kushoma, i.e. ine shanduko shoma kune kodhi kodhi uye kushanda kwakazara kwakachengetedzwa. Ita kuti cache isangopikisa kukundikana, asi edzawo kuderedza kurasikirwa kwedata kubva pairi.

Chii chakaipa ne memcached pachayo?

Kazhinji, iyo memcached yekuwedzera yePP inotsigira yakagovaniswa data uye chikamu chekuchengetedza kunze kwebhokisi. Iyo nzira yekuenderana kiyi hashing inokutendera iwe kuti uise data zvakaenzana pamasevha mazhinji, uchitaura zvakasiyana kiyi yega yega kune chaiyo sevha kubva muboka, uye yakavakirwa-mukati failover maturusi anovimbisa kuwanikwa kwakanyanya kweiyo caching sevhisi (asi, zvinosuruvarisa, hapana data).

Zvinhu zviri nani zvishoma nekuchengetedza chikamu: unogona kugadzirisa memcached.sess_number_of_replicas, semhedzisiro iyo data ichachengetwa pamaseva akati wandei kamwechete, uye kana paine kukundikana kweimwe memcached muenzaniso, iyo data ichaendeswa kubva kune vamwe. Nekudaro, kana sevha ikadzoka pamhepo isina data (sezvinowanzoitika mushure mekutangazve), mamwe makiyi anozogovaniswa mukuda kwayo. Chokwadi izvi zvichareva kurasikirwa kwesesheni data, sezvo pasina nzira "yekuenda" kune imwe replica kana ukapotsa.

Zvishandiso zveraibhurari zvakajairika zvinonangwa zvakanyanya chinjikira kuyera: ivo vanokutendera iwe kuti uwedzere cache kune yakakura saizi uye nekupa kuwana kwairi kubva kodhi inobatwa pane akasiyana maseva. Nekudaro, mumamiriro edu ezvinhu, vhoriyamu yedata yakachengetwa haipfuure akati wandei gigabytes, uye kuita kweimwe kana mbiri node zvakakwana zvakakwana. Saizvozvo, iyo chete inobatsira yakajairwa maturusi inogona kuve yekuona kuwanikwa kwememcached uchichengetedza kamwechete cache muenzaniso mukushanda mamiriro. Zvisinei, zvakanga zvisingabviri kushandisa kunyange mukana uyu ... Pano zvakakodzera kuyeuka yekare yegadziriro yakashandiswa muprojekti, ndicho chikonzero zvakanga zvisingakwanisi kuwana chikumbiro kushanda nedziva remaseva. Ngatisakanganwewo nezve kurasikirwa kwesesheni data: ziso remutengi rakadonha kubva pakubuda kukuru kwevashandisi.

Zvakanakisa zvaidiwa kudzokorora marekodhi mune memcached uye bypassing replicas pakaitika kukanganisa kana kukanganisa. Vakatibatsira kushandisa zano iri mcrouter.

mcrouter

Iyi memcached router yakagadzirwa ne Facebook kugadzirisa matambudziko ayo. Inotsigira memcached text protocol, iyo inobvumira scale memcached installations kusvika pakupenga. Tsanangudzo yakadzama ye mcrouter inogona kuwanikwa mukati chiziviso ichi. Pakati pezvimwe zvinhu yakakura kushanda inogona kuita zvatinoda:

  • dzokorora rekodhi;
  • ita fallback kune mamwe maseva muboka kana kukanganisa kukaitika.

Zvebhizimisi!

mcrouter configuration

Ini ndichananga kune 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"
       ]
     }
   }
 }
}

Sei madziva matatu? Sei maseva achidzokororwa? Ngatione kuti zvinoshanda sei.

  • Mukugadzirisa uku, mcrouter inosarudza nzira iyo chikumbiro chichatumirwa zvichienderana nemurairo wekukumbira. Mukomana anomuudza izvi OperationSelectorRoute.
  • WANA zvikumbiro enda kumubati RandomRouteiyo inosarudza dziva kana nzira pakati pezvinhu zvakarongwa children. Chinhu chimwe nechimwe chechikamu ichi chinoshandura chibatiso MissFailoverRoute, iyo ichapfuura nepakati pesevha imwe neimwe mudziva kusvikira yawana mhinduro ine data, iyo ichadzorerwa kumutengi.
  • Kana takashandisa chete MissFailoverRoute nedziva remaseva matatu, zvino zvikumbiro zvese zvaizotanga kuuya kune yekutanga memcached muenzaniso, uye vamwe vese vaizogamuchira zvikumbiro pane yakasara kana pasina data. Maitiro akadaro achaita kuti mutoro wakawandisa pane yekutanga server mune iyo rondedzero, saka zvakasarudzwa kugadzira madziva matatu ane kero mumateedzana akasiyana uye sarudza iwo zvisina tsarukano.
  • Zvimwe zvikumbiro zvese (uye iyi rekodhi) zvinogadziriswa uchishandisa AllMajorityRoute. Uyu mubati anotumira zvikumbiro kune ese maseva ari mudziva uye anomirira mhinduro kubva kanenge N/2 + 1 yavo. Kubva kushandiswa AllSyncRoute nokuti kunyora mabasa aifanira kusiiwa, sezvo nzira iyi inoda mhinduro yakanaka kubva всех maseva ari muboka - zvikasadaro ichadzoka SERVER_ERROR. Kunyangwe mcrouter ichawedzera iyo data kune anowanikwa cache, iyo yekudaidza PHP basa ichadzorera kukanganisa uye ichaunza chiziviso. AllMajorityRoute haina kuomesesa uye inobvumira kusvika hafu yemayuniti kutorwa kunze kwebasa pasina matambudziko anotsanangurwa pamusoro.

Main kukanganisa Ichi chirongwa ndechekuti kana pasina dhata mu cache, saka pachikumbiro chega chega kubva kumutengi N zvikumbiro zve memcached zvinonyatso itwa - kune vose maseva mudziva. Isu tinogona kuderedza huwandu hwemaseva mumadziva, semuenzaniso, kusvika maviri: kupa kuvimbika kwekuchengetedza, tinowana.оkumhanya kwepamusoro uye kuderera kwemutoro kubva kune zvikumbiro kune makiyi asipo.

NB: Unogonawo kuwana zvinongedzo zvinobatsira pakudzidza mcrouter zvinyorwa pawiki и nyaya dzeprojekiti (kusanganisira akavharwa), anomiririra dura rose rezvigadziriso zvakasiyana.

Kuvaka uye kumhanya mcrouter

Yedu yekushandisa (uye memcached pachayo) inomhanya muKubernetes - saizvozvo, mcrouter inowanikwawo ipapo. For gungano remidziyo tinoshandisa werf, iyo config iyo ichaita seizvi:

NB: Mazita akapihwa muchinyorwa anoburitswa mune repository 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)

... uye dhizaini kunze Helm chati. Chinhu chinonakidza ndechekuti pane chete gadziriso jenareta zvichienderana nenhamba yezvinyorwa (kana paine chero munhu ane yakawedzera laconic uye inoyevedza sarudzo, igovera mune zvakataurwa):

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

Isu tinoiburitsa munzvimbo yekuyedza uye tarisa:

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

Kutsvaga chinyorwa chekukanganisa hakuna kupa chero mhinduro, asi yemubvunzo "microuter php"Pamberi paive nedambudziko rekare risati ragadziriswa reprojekiti - kushaya rutsigiro memcached binary protocol.

NB: Iyo ASCII protocol mune memcached inononoka kupfuura iyo yebhinari, uye yakajairwa nzira dzekiyi hashing dzinoenderana dzinoshanda chete neiyo binary protocol. Asi izvi hazvigadziri matambudziko kune imwe nyaya.

Hunyengeri huri mubhegi: zvese zvaunofanirwa kuita chinja kune ASCII protocol uye zvese zvichashanda.... Zvisinei, munyaya iyi, tsika yekutsvaga mhinduro mukati zvinyorwa pa php.net akaita jee reutsinye. Iwe haugoni kuwana mhinduro yakarurama ipapo ... kunze kwekuti, hongu, iwe unopeta kusvika kumagumo, apo muchikamu "Manotsi anopihwa nemushandisi" achava akatendeka uye mhinduro isina kunaka.

Ehe, iro rakakodzera sarudzo zita ndere memcached.sess_binary_protocol. Inofanira kunge yakaremara, mushure mezvo zvirongwa zvinotanga kushanda. Chasara kuisa mudziyo une mcrouter mupodhi ine PHP!

mhedziso

Nekudaro, nekungochinja kwezvivakwa takakwanisa kugadzirisa dambudziko: nyaya ine memcached kukanganisa kushivirira yakagadziriswa, uye kuvimbika kwekuchengetedza cache kwakawedzera. Pamusoro pezvakanakira zviri pachena zvekushandisa, izvi zvakapa nzvimbo yekufambisa paunenge uchishanda pachikuva: kana zvikamu zvese zvine chengetedzo, hupenyu hwemutungamiriri hunorerutswa zvakanyanya. Hongu, nzira iyi inewo zvipingamupinyi zvayo, inogona kutaridzika se "crutch", asi kana ichichengetedza mari, inoviga dambudziko uye haikonzeri zvitsva - nei?

PS

Verenga zvakare pablog yedu:

Source: www.habr.com

Tenga inovimbika yekutambira kwemasaiti ane DDoS dziviriro, VPS VDS maseva 🔥 Tenga webhusaiti yakavimbika ine dziviriro yeDDoS, maseva eVPS VDS | ProHoster