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,
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
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
- 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
RandomRoute
ekhetha ngokungahleliwe iphuli noma umzila phakathi kwezinto zamalungu afanayochildren
. I-elementi ngayinye yalolu hlu iphinde ibe isibambiMissFailoverRoute
, 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 ukusetshenziswaAllSyncRoute
ngoba imisebenzi yokubhala kwadingeka iyekwe, njengoba le ndlela idinga impendulo eqondile evela всех amaseva eqenjini - kungenjalo izobuyaSERVER_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
Ukwakha nokusebenzisa i-mcrouter
Uhlelo lwethu lokusebenza (futhi luzibambele ngokwalo) lusebenza ku-Kubernetes - ngokufanele, i-mcrouter nayo itholakala lapho. Ngoba umhlangano wesitsha sisebenzisa
NB: Ukufakwa kuhlu okunikezwe esihlokweni kushicilelwe endaweni 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' ]
... 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 }}
}
}
}
}
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 “
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
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:
- "Zilolonge nge-dapp" (usebenzisa i-symfony-demo njengesibonelo):
ingxenye 1 (ukwakha izinhlelo zokusebenza ezilula) иingxenye 2 (ithumela izithombe ze-Docker ku-Kubernetes usebenzisa i-Helm) ; - «
Kusukela empilweni noKubernetes: Iseva ye-HTTP ayizange ithande kanjani abaseSpain ".
Source: www.habr.com