Ukusebenzisa i-mcrouter ukukala i-memcached ngokuthe tye

Ukusebenzisa i-mcrouter ukukala i-memcached ngokuthe tye

Ukuphuhlisa iiprojekthi zomthwalo omkhulu kulo naluphi na ulwimi kufuna indlela ekhethekileyo kunye nokusetyenziswa kwezixhobo ezizodwa, kodwa xa kuziwa kwizicelo kwi-PHP, imeko ingaba nzima kakhulu ukuba kufuneka uphuhlise, umzekelo, umncedisi wesicelo owakhe. Kule nqaku siza kuthetha ngentlungu eqhelekileyo kunye nokugcinwa kweseshoni esabiwayo kunye nokugcinwa kwedatha kwi-memcached kunye nendlela esisombulule ngayo ezi ngxaki kwiprojekthi enye "yewadi".

Iqhawe lesiganeko sisicelo se-PHP esekelwe kwisakhelo se-symfony 2.3, esingabandakanyi konke konke kwizicwangciso zoshishino zokuhlaziya. Ukongeza kugcino lweseshini eqhelekileyo, le projekthi isetyenziswe ngokupheleleyo umgaqo-nkqubo "wokugcina yonke into". kwi-memcached: iimpendulo kwizicelo kwisiseko sedatha kunye nabancedisi be-API, iiflegi ezahlukeneyo, izitshixo zokwenza ungqamaniso lwekhowudi kunye nokunye okuninzi. Kwimeko enjalo, ukuqhekeka kwe-memcached kuba yingozi ekusebenzeni kwesicelo. Ukongezelela, ukulahlekelwa kwe-cache kukhokelela kwimiphumo emibi: i-DBMS iqala ukuqhuma kwi-seams, iinkonzo ze-API ziqala ukuvala izicelo, njl. Ukuzinzisa imeko kunokuthatha amashumi emizuzu, kwaye ngeli xesha inkonzo iya kucotha kakhulu okanye ingafumaneki ngokupheleleyo.

Sasidinga ukubonelela ukukwazi ukukala ngokuthe tye isicelo ngomzamo omncinci, o.k. ngotshintsho oluncinci kwikhowudi yemvelaphi kunye nokusebenza okugcweleyo okugciniweyo. Yenza i-cache ingaxhathisi kuphela ukusilela, kodwa uzame ukunciphisa ilahleko yedatha kuyo.

Yintoni ephosakeleyo nge-memcached ngokwayo?

Ngokubanzi, ukwandiswa kwe-memcached ye-PHP ixhasa ukuhanjiswa kwedatha kunye nokugcinwa kweseshoni ngaphandle kwebhokisi. Indlela ye-hashing engundoqo engaguqukiyo ikuvumela ukuba ubeke idatha ngokulinganayo kwiiseva ezininzi, ngokukodwa ukujongana nesitshixo ngasinye kumncedisi othile osuka kwiqela, kunye nezixhobo ezakhelwe ngaphakathi ze-failover ziqinisekisa ukufumaneka okuphezulu kwenkonzo ye-caching (kodwa, ngelishwa, akukho data).

Izinto zingcono kancinci ngogcino lweseshoni: ungaqwalasela memcached.sess_number_of_replicas, ngenxa yoko idatha iya kugcinwa kwiiseva ezininzi ngexesha elinye, kwaye kwimeko yokungaphumeleli komzekelo omnye we-memcached, idatha iya kudluliselwa kwabanye. Nangona kunjalo, ukuba umncedisi ubuya kwi-intanethi ngaphandle kwedatha (njengesiqhelo ukwenzeka emva kokuqaliswa kwakhona), ezinye zezitshixo ziya kuphinda zihanjiswe ngokuthanda kwayo. Enyanisweni oku kuya kuthetha ukulahleka kwedatha yeseshoni, kuba ingekho indlela “yokuya” kwenye ikopi xa uphosiwe.

Izixhobo zethala leencwadi ezisemgangathweni zijolise ikakhulu tyaba Ukukala: zikuvumela ukuba unyuse i-cache kubungakanani obukhulu kwaye unikeze ufikelelo kuyo kwikhowudi ebanjwe kwiiseva ezahlukeneyo. Nangona kunjalo, kwimeko yethu, umthamo wedatha egciniweyo ayidluli iigigabytes ezininzi, kwaye ukusebenza kwenodi enye okanye ezimbini kwanele. Ngokufanelekileyo, ekuphela kwezixhobo eziluncedo ezisemgangathweni inokuba kukuqinisekisa ukufumaneka kwe-memcached ngelixa ugcina ubuncinci umzekelo omnye we-cache kwimeko yokusebenza. Nangona kunjalo, kwakungenakwenzeka ukusebenzisa eli thuba ... Apha kukufanelekile ukukhumbula ixesha elidala lesakhelo esisetyenzisiweyo kwiprojekthi, yingakho kwakungenakwenzeka ukufumana isicelo sokusebenza kunye ne-pool yamaseva. Masingaze silibale malunga nokulahleka kwedatha yeseshoni: iliso lomthengi lithintelwe ekuphumeni okukhulu kwabasebenzisi.

Ngokufanelekileyo yayifuneka ukuphindaphindwa kweerekhodi kwiikopi ezifihliweyo kunye nezidlulayo xa kukho impazamo okanye impazamo. Sincede ukuba siphumeze esi sicwangciso umcrouter.

umcrouter

Le yi-router ye-memcached ephuhliswe ngu-Facebook ukusombulula iingxaki zayo. Ixhasa umthetho olandelwayo wombhalo ogciniweyo, ovumelayo Isikali sofakelo lwe-memcached ngomlinganiselo ophambeneyo. Inkcazo eneenkcukacha ye-mcrouter inokufumaneka kwi esi sibhengezo. Phakathi kwezinye izinto ukusebenza okubanzi inokwenza into esiyifunayo:

  • phinda irekhodi;
  • yenza ukubuyisela umva kwabanye abancedisi kwiqela ukuba kukho impazamo.

Ngeshishini!

uqwalaselo lwe-mcrouter

Ndiza kuya ngqo kuqwalaselo:

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

Kutheni amachibi amathathu? Kutheni iiseva ziphindaphindwa? Makhe sibone ukuba isebenza njani.

  • Kolu qwalaselo, i-mcrouter ikhetha indlela apho isicelo siya kuthunyelwa khona ngokusekelwe kumyalelo wesicelo. Umfo umxelela lento OperationSelectorRoute.
  • Izicelo ze-GET ziya kumphathi RandomRouteekhetha ngokungenamkhethe idama okanye indlela phakathi kwezinto ezinoluhlu children. Isiqalelo ngasinye solu luhlu ngokulandelelana sisibambi MissFailoverRoute, eya kuhamba ngeseva nganye echibini ide ifumane impendulo ngedatha, eya kubuyiselwa kumxhasi.
  • Ukuba sisebenzise kuphela MissFailoverRoute kunye nequla labancedisi abathathu, emva koko zonke izicelo ziza kuqala kumzekelo wokuqala we-memcached, kwaye abanye baya kufumana izicelo ngokushiyekileyo xa kungekho datha. Indlela enjalo inokukhokelela ekubeni umthwalo ogqithisileyo kumncedisi wokuqala kuluhlu, ngoko ke kwagqitywa ekubeni kuveliswe amachibi amathathu aneedilesi ezilandelelanayo ezahlukeneyo kwaye ukhethe ngokungenamkhethe.
  • Zonke ezinye izicelo (kwaye le yirekhodi) ziqwalaselwa kusetyenziswa AllMajorityRoute. Lo mphathi uthumela izicelo kubo bonke abancedisi echibini kwaye ulindele iimpendulo ukusuka ubuncinane kwi-N / 2 + 1 kubo. Ukusuka ekusebenziseni AllSyncRoute kuba imisebenzi yokubhala kwafuneka iyekwe, ekubeni le ndlela ifuna impendulo eyakhayo evela всех abancedisi kwiqela - kungenjalo iya kubuya SERVER_ERROR. Nangona i-mcrouter iyakongeza idatha kwii-cache ezikhoyo, umsebenzi wokufowuna we-PHP izakubuyisela imposiso kwaye iya kwenza isaziso. AllMajorityRoute ayingqongqo kangako kwaye ivumela ukuya kuthi ga kwisiqingatha seeyunithi ukuba zithathwe ngaphandle kwenkonzo ngaphandle kweengxaki ezichazwe ngasentla.

Ukusilela okuphambili Olu dweliso lwelokuba ukuba ngenene akukho datha kwindawo efihlakeleyo, ngoko ngesicelo ngasinye kumxhasi N izicelo ze memcached ziyakwenziwa ngenene - ukuya kubo bonke abancedisi equleni. Sinokunciphisa inani leeseva kumachibi, umzekelo, ukuya ezimbini: ukuthembeka kokugcinwa kwedini, sifumanaоisantya esiphezulu kunye nomthwalo omncinci ukusuka kwizicelo ukuya kwizitshixo ezingekhoyo.

NB: Usenokufumana amakhonkco aluncedo okufunda i-mcrouter uxwebhu kwiwiki и imiba yeprojekthi (kubandakanywa nezivaliweyo), ezimele uvimba opheleleyo wolungelelwaniso olwahlukeneyo.

Ukwakha kunye nokuqhuba i-mcrouter

Isicelo sethu (kunye ne-memcached ngokwayo) siqhuba kwi-Kubernetes - ngokufanelekileyo, i-mcrouter ikhona apho. Kuba indibano yesikhongozeli sisebenzisa i-werf, uqwalaselo oluya kujongeka ngolu hlobo:

NB: Uluhlu olunikwe kwinqaku lupapashwa kwindawo 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)

... kwaye uyizobe Itshathi yeHelm. Into enomdla kukuba kukho kuphela i-config generator esekelwe kwinani leekopi (ukuba nabani na unokhetho olune-laconic kunye nobuhle, yabelana ngayo kumagqabantshintshi):

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

Siyikhuphela kwindawo yovavanyo kwaye sijonge:

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

Ukukhangela okubhaliweyo kwempazamo akunikanga ziphumo, kodwa kumbuzo “microuter php"Ngaphambili yayiyeyona ngxaki indala ingasonjululwanga yeprojekthi - ukungabikho kwenkxaso iprotocol yokubini efihliweyo.

NB: Iprothokholi ye-ASCII kwi-memcached iyacotha kuneyona yokubini, kwaye iindlela ezisezantsi ze-hashing yesitshixo esihambelanayo zisebenza kuphela ngeprotocol yokubini. Kodwa oku akudali iingxaki kwimeko ethile.

Iqhinga lisengxoweni: konke okufuneka ukwenze kukutshintshela kwiprotocol ye-ASCII kwaye yonke into iya kusebenza.... Nangona kunjalo, kule meko, umkhwa wokukhangela iimpendulo kwi uxwebhu kwi php.net wadlala isiqhulo esikhohlakeleyo. Awuyi kufumana impendulo echanekileyo apho ... ngaphandle kokuba, ngokuqinisekileyo, upheqa ukuya ekupheleni, apho kwicandelo "Amanqaku anikezelwe ngumsebenzisi" uya kuthembeka kwaye impendulo ephantsi ngokungafanelekanga.

Ewe, igama lokhetho elichanekileyo ngu memcached.sess_binary_protocol. Kufuneka ingasebenzi, emva koko iiseshoni ziya kuqala ukusebenza. Ekuphela kwento eseleyo kukubeka isitya kunye ne-mcrouter kwipod ene-PHP!

isiphelo

Ngaloo ndlela, ngotshintsho nje lwezakhiwo sakwazi ukusombulula ingxaki: umba wokunyamezela i-memcached fault tolerance usonjululwe, kwaye ukuthembeka kokugcinwa kwe-cache kuye kwandiswa. Ukongeza kwiinzuzo ezicacileyo zesicelo, oku kwanika indawo yokulawula xa usebenza eqongeni: xa onke amacandelo anogcino, ubomi bomlawuli bulula kakhulu. Ewe, le ndlela nayo inezithintelo zayo, inokubonakala ngathi "i-crutch", kodwa ukuba igcina imali, ingcwaba ingxaki kwaye ayibangeli abatsha - kutheni kungenjalo?

PS

Funda nakwibhlog yethu:

umthombo: www.habr.com

Thenga ukusingathwa okuthembekileyo kwiindawo ezinokhuseleko lweDDoS, iiseva zeVPS VDS 🔥 Thenga ukusingathwa kwewebhusayithi okuthembekileyo ngokhuseleko lwe-DDoS, iiseva zeVPS VDS | ProHoster