Ukusebenzisa i-mcrouter ukukala i-memcached ngokuvundlile

Ukusebenzisa i-mcrouter ukukala i-memcached ngokuvundlile

Ukuthuthukisa amaphrojekthi anomthwalo omkhulu kunoma yiluphi ulimi kudinga indlela ekhethekile kanye nokusetshenziswa kwamathuluzi akhethekile, kepha uma kukhulunywa ngezinhlelo zokusebenza ku-PHP, isimo singaba sibi kakhulu kangangokuba kufanele uthuthuke, ngokwesibonelo, iseva yohlelo lwakho lokusebenza. Kule nothi sizokhuluma ngobuhlungu obujwayelekile ngokugcinwa kweseshini esabalalisiwe kanye ne-caching yedatha ku-memcached nokuthi sizixazulule kanjani lezi zinkinga kuphrojekthi eyodwa "yewadi".

Iqhawe lomcimbi uhlelo lokusebenza lwe-PHP olusekelwe kuhlaka lwe-symfony 2.3, olungafakiwe nhlobo ezinhlelweni zebhizinisi zokuvuselela. Ngaphezu kokugcinwa kweseshini ejwayelekile, le phrojekthi yasetshenziswa ngokugcwele inqubomgomo "yokugcina yonke into". ku-memcached: izimpendulo zezicelo kusizindalwazi kanye namaseva e-API, amafulegi ahlukahlukene, izingidi zokuvumelanisa ukukhishwa kwekhodi nokunye okuningi. Esimeni esinjalo, ukwephulwa kwe-memcached kuba yingozi ekusebenzeni kwesicelo. Ngaphezu kwalokho, ukulahlekelwa kwe-cache kuholela emiphumeleni emibi kakhulu: i-DBMS iqala ukuqhuma emigqeni, izinsizakalo ze-API ziqala ukuvimba izicelo, njll. Ukuzinzisa isimo kungase kuthathe amashumi emizuzu, futhi phakathi nalesi sikhathi isevisi izohamba kancane kakhulu noma ingatholakali nhlobo.

Besidinga ukuhlinzeka ikhono lokukala uhlelo ngokuvundlile ngomzamo omncane, i.e. ngezinguquko ezincane zekhodi yomthombo kanye nokusebenza okugcwele okulondoloziwe. Yenza inqolobane ingamelani nokwehluleka kuphela, kodwa futhi zama ukunciphisa ukulahleka kwedatha kuyo.

Yini engalungile nge-memcached ngokwayo?

Ngokuvamile, isandiso se-memcached se-PHP sisekela idatha esabalalisiwe nokugcinwa kweseshini ngaphandle kwebhokisi. Indlela ye-hashing yokhiye engaguquguquki ikuvumela ukuthi ubeke idatha ngokulinganayo kumaseva amaningi, ukhulume ngokukhethekile nokhiye ngamunye othize kuseva ethile evela eqenjini, futhi amathuluzi akhelwe ngaphakathi aqinisekisa ukutholakala okuphezulu kwensizakalo yokugcina isikhashana (kodwa, ngeshwa, ayikho idatha).

Izinto ziba ngcono kancane ngesitoreji seseshini: ungalungisa memcached.sess_number_of_replicas, njengomphumela wokuthi idatha izogcinwa eziphakelini ezimbalwa ngesikhathi esisodwa, futhi esimweni sokuhluleka kwesenzakalo esisodwa se-memcache, idatha izodluliswa isuka kwabanye. Nokho, uma iseva ibuya ku-inthanethi ngaphandle kwedatha (njengoba ngokuvamile kwenzeka ngemva kokuqalisa kabusha), abanye okhiye bazosatshalaliswa kabusha ngokuvuna yona. Eqinisweni lokhu kuzosho ukulahleka kwedatha yeseshini, njengoba ingekho indlela “yokuya” kwesinye isifaniso uma kwenzeka uphuthelwe.

Amathuluzi omtapo wolwazi ajwayelekile ahloselwe ikakhulukazi evundlile ukukala: zikuvumela ukuthi ukhuphule i-cache kumasayizi amakhulu futhi unikeze ukufinyelela kuyo kusuka kukhodi ebanjwe kumaseva ahlukene. Kodwa-ke, esimweni sethu, umthamo wedatha egciniwe awudluli amagigabhayithi amaningana, futhi ukusebenza kwenodi eyodwa noma amabili kwanele. Ngakho-ke, amathuluzi ajwayelekile kuphela awusizo kungaba wukuqinisekisa ukutholakala kwe-memcached ngenkathi kugcinwa okungenani isibonelo esisodwa senqolobane esimweni sokusebenza. Kodwa-ke, kwakungenakwenzeka ukusebenzisa leli thuba ngisho naleli thuba ... Lapha kufanelekile ukukhumbula isikhathi esidala sohlaka olusetshenziswe kuphrojekthi, yingakho kwakungenakwenzeka ukuthola isicelo sokusebenza nedamu lamaseva. Masingakhohlwa futhi ngokulahleka kwedatha yeseshini: iso lekhasimende liyanyakaza kusukela ekuphumeni okukhulu kwabasebenzisi.

Ngokufanelekile kwakudingeka ukuphindaphindeka kwamarekhodi kuma-memcached kanye nezifaniso ezidlulayo uma kwenzeka iphutha noma iphutha. Isisize ukusebenzisa leli su i-mcrouter.

i-mcrouter

Lena irutha ye-memcached eyakhiwe yi-Facebook ukuxazulula izinkinga zayo. Isekela iphrothokholi yombhalo we-memcached, evumelayo sikala ukufakwa kwe-memcached ngezilinganiso zokusangana. Incazelo enemininingwane ye-mcrouter ingatholakala ku lesi simemezelo. Phakathi kwezinye izinto ukusebenza okubanzi ingenza esikudingayo:

  • phindaphinda irekhodi;
  • yenza ukubuyela emuva kwamanye amaseva eqenjini uma kwenzeka iphutha.

Ngena emsebenzini!

ukucushwa kwe-mcrouter

Ngizoqonda ngqo ku-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"
       ]
     }
   }
 }
}

Kungani amachibi amathathu? Kungani amaseva ephindaphindwa? Ake sibone ukuthi kusebenza kanjani.

  • Kulokhu kulungiselelwa, i-mcrouter ikhetha indlela lapho isicelo sizothunyelwa khona ngokusekelwe kumyalo wesicelo. Umfana umtshela lokhu OperationSelectorRoute.
  • THOLA izicelo ziya kusiphathi RandomRouteekhetha ngokungahleliwe iphuli noma umzila phakathi kwezinto zamalungu afanayo children. I-elementi ngayinye yalolu hlu iphinde ibe isibambi MissFailoverRoute, ezodlula kuseva ngayinye echibini kuze kube yilapho ithola impendulo enedatha, ezobuyiselwa kuklayenti.
  • Uma sisebenzisa kuphela MissFailoverRoute ngenqwaba yamaseva amathathu, bese zonke izicelo zizofika kuqala esihlokweni sokuqala esigcinwe yi-memcache, kanti ezinye zizothola izicelo ngokusala lapho ingekho idatha. Indlela enjalo ingaholela ukulayisha ngokweqile kuseva yokuqala ohlwini, ngakho-ke kwanqunywa ukuthi kukhiqizwe amachibi amathathu anamakheli ngokulandelana okuhlukile bese kukhethwa ngokungahleliwe.
  • Zonke ezinye izicelo (futhi leli irekhodi) zicutshungulwa kusetshenziswa AllMajorityRoute. Lesi sibambi sithumela izicelo kuwo wonke amaseva endaweni yokubhukuda futhi silindele izimpendulo okungenani ezisuka ku-N/2 + 1 yazo. Kusukela ukusetshenziswa AllSyncRoute ngoba imisebenzi yokubhala kwadingeka iyekwe, njengoba le ndlela idinga impendulo eqondile evela всех amaseva eqenjini - kungenjalo izobuya SERVER_ERROR. Nakuba i-mcrouter izongeza idatha kuma-caches atholakalayo, umsebenzi we-PHP wokubiza izobuyisela iphutha futhi izokhipha isaziso. AllMajorityRoute ayiqinile kangako futhi ivumela kufika kuhhafu wamayunithi ukuthi akhishwe emsebenzini ngaphandle kwezinkinga ezichazwe ngenhla.

Ububi obukhulu Lolu hlelo luwukuthi uma ngempela ingekho idatha kunqolobane, isicelo ngasinye esivela kuklayenti elingu-N izicelo zokuthi memcached zizokwenziwa ngempela - ukuze kubo bonke amaseva echibini. Singanciphisa inani lamaseva kumachibi, ngokwesibonelo, ukuya kokubili: ukunikela ngokuthembeka kwesitoreji, sitholaоisivinini esiphezulu kanye nomthwalo omncane kusukela ezicelweni kuya okhiye abangekho.

NB: Ungase futhi uthole izixhumanisi eziwusizo zokufunda i-mcrouter imibhalo ku-wiki и izinkinga zephrojekthi (kuhlanganise nezivaliwe), ezimele inqolobane yonke yokucushwa okuhlukahlukene.

Ukwakha nokusebenzisa i-mcrouter

Uhlelo lwethu lokusebenza (futhi luzibambele ngokwalo) lusebenza ku-Kubernetes - ngokufanele, i-mcrouter nayo itholakala lapho. Ngoba umhlangano wesitsha sisebenzisa i-werf, ukulungiselelwa okuzobukeka kanjena:

NB: Ukufakwa kuhlu okunikezwe esihlokweni kushicilelwe endaweni yokugcina i-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' ]

(i-werf.yaml)

... bese uyidweba Ishadi lesigqoko. Okuthakazelisayo ukuthi kukhona kuphela i-generator config esekelwe kwinani lama-replicas (uma noma ubani enenketho e-laconic nenhle kakhulu, yabelana ngayo kumazwana):

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

Siyikhiphela endaweni yokuhlola futhi sihlole:

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

Ukusesha umbhalo wephutha akunikanga miphumela, kodwa umbuzo othi “mcrouter php"Phambili bekuyinkinga endala kakhulu engaxazululiwe yephrojekthi - ukuntula ukusekelwa iphrothokholi kanambambili efakwe ku-memcache.

NB: Iphrothokholi ye-ASCII eku-memcached ihamba kancane kuneyona kanambambili, futhi izindlela ezijwayelekile zokhiye ongashintshi we-hashing zisebenza kuphela nephrothokholi kanambambili. Kodwa lokhu akudali izinkinga ecaleni elithile.

Iqhinga lisesikhwameni: okumele ukwenze ukushintshela kuphrothokholi ye-ASCII futhi konke kuzosebenza.... Nokho, kulesi simo, umkhuba ukufuna izimpendulo ku imibhalo ku-php.net wadlala ihlaya elinonya. Ngeke uthole impendulo efanele lapho ... ngaphandle uma, kunjalo, upheqa kuze kube sekugcineni, lapho esigabeni "Amanothi anikelwe ngabasebenzisi" uzothembeka futhi impendulo evotelwe ngokungafanele.

Yebo, igama lenketho elilungile lithi memcached.sess_binary_protocol. Kufanele ikhutshazwe, ngemva kwalokho amaseshini azoqala ukusebenza. Okusele nje ukubeka isitsha esine-mcrouter ku-pod ene-PHP!

isiphetho

Ngakho-ke, ngoshintsho lwengqalasizinda nje sikwazile ukuxazulula inkinga: inkinga yokubekezelela amaphutha e-memcached isixazululiwe, nokuthembeka kwesitoreji senqolobane kwenyukile. Ngaphezu kwezinzuzo ezisobala zohlelo lokusebenza, lokhu kwanikeza indawo yokuqondisa lapho usebenza endaweni yesikhulumi: lapho zonke izingxenye zinendawo ebekiwe, impilo yomqondisi yenziwa lula kakhulu. Yebo, le ndlela nayo inezinselele zayo, ingase ibukeke njenge "crutch", kodwa uma isindisa imali, ivala inkinga futhi ingabangeli ezintsha - kungani kungenjalo?

PS

Funda futhi kubhulogi yethu:

Source: www.habr.com

Engeza amazwana