
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, . 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
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 . Phakathi kwezinye izinto 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 ezinoluhluchildren. Isiqalelo ngasinye solu luhlu ngokulandelelana sisibambiMissFailoverRoute, eya kuhamba ngeseva nganye echibini ide ifumane impendulo ngedatha, eya kubuyiselwa kumxhasi. - Ukuba sisebenzise kuphela
MissFailoverRoutekunye 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 ekusebenziseniAllSyncRoutekuba imisebenzi yokubhala kwafuneka iyekwe, ekubeni le ndlela ifuna impendulo eyakhayo evela всех abancedisi kwiqela - kungenjalo iya kubuyaSERVER_ERROR. Nangona i-mcrouter iyakongeza idatha kwii-cache ezikhoyo, umsebenzi wokufowuna we-PHP izakubuyisela imposiso kwaye iya kwenza isaziso.AllMajorityRouteayingqongqo 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 и (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 , uqwalaselo oluya kujongeka ngolu hlobo:
NB: Uluhlu olunikwe kwinqaku lupapashwa kwindawo yokugcina .
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' ]()
... 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 }}
}
}
}
}()
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 “"Ngaphambili yayiyeyona ngxaki indala ingasonjululwanga yeprojekthi - 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 wadlala isiqhulo esikhohlakeleyo. Awuyi kufumana impendulo echanekileyo apho ... ngaphandle kokuba, ngokuqinisekileyo, upheqa ukuya ekupheleni, apho kwicandelo "Amanqaku anikezelwe ngumsebenzisi" uya kuthembeka kwaye .
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:
- "Ziqhelise nge-dapp" (usebenzisa i-symfony-demo njengomzekelo): и ;
- «».
umthombo: www.habr.com
