
Teastaíonn cur chuige speisialta agus úsáid uirlisí speisialta chun tionscadail ard-ualaigh a fhorbairt i dteanga ar bith, ach nuair a thagann sé le hiarratais i PHP, is féidir leis an scéal éirí chomh tromaithe sin go gcaithfidh tú a fhorbairt, mar shampla, . Sa nóta seo labhróimid faoin bpian aithnidiúil maidir le stóráil seisiúin dáilte agus taisceadh sonraí i memcached agus conas a réitigh muid na fadhbanna seo i dtionscadal “barda” amháin.
Is iarratas PHP é laoch na hócáide bunaithe ar chreat symfony 2.3, nach bhfuil san áireamh ar chor ar bith sna pleananna gnó le nuashonrú. Chomh maith le gnáthstóráil seisiún, bhain an tionscadal seo lánúsáid as polasaí "caching everything". in memcached: freagraí ar iarratais ar an mbunachar sonraí agus freastalaithe API, bratacha éagsúla, glais chun cód a shioncronú agus go leor eile. I gcás den sórt sin, éiríonn miondealú ar memcached marfach d’oibriú an iarratais. Ina theannta sin, bíonn iarmhairtí tromchúiseacha mar thoradh ar chaillteanas taisce: tosaíonn an DBMS ag pléasctha ag na seams, tosaíonn seirbhísí API ag toirmeasc iarratais, etc. D’fhéadfadh go dtógfaidh sé na deich nóiméad chun an cás a chobhsú, agus le linn an ama seo beidh an tseirbhís thar a bheith mall nó ar fáil go hiomlán.
B’éigean dúinn soláthar a dhéanamh an cumas an feidhmchlár a scála go cothrománach gan mórán iarrachta, i.e. le mionathruithe ar an gcód foinse agus feidhmiúlacht iomlán caomhnaithe. Déan an taisce ní hamháin resistant a teipeanna, ach freisin iarracht a íoslaghdú caillteanas sonraí as é.
Cad atá cearr le memcached féin?
Go ginearálta, tacaíonn an síneadh memcached do PHP sonraí dáilte agus stóráil seisiúin as an mbosca. Ceadaíonn an mheicníocht le haghaidh hashing eochair comhsheasmhach duit sonraí a dháileadh go cothrom ar go leor freastalaithe, ag tabhairt aghaidh ar gach eochair ar leith chuig freastalaí ar leith ón ngrúpa, agus cinntíonn uirlisí teipthe ionsuite ard-infhaighteacht na seirbhíse taisce (ach, ar an drochuair, gan sonraí).
Tá rudaí beagán níos fearr le stóráil seisiúin: is féidir leat a chumrú memcached.sess_number_of_replicas, mar thoradh ar a stórálfar na sonraí ar roinnt freastalaithe ag an am céanna, agus i gcás teipe memcached amháin, aistreofar na sonraí ó dhaoine eile. Mar sin féin, má thagann an freastalaí ar ais ar líne gan sonraí (mar a tharlaíonn de ghnáth tar éis atosú), déanfar cuid de na heochracha a athdháileadh ina fhabhar. Go deimhin ciallóidh sé seo caillteanas sonraí seisiúin, ós rud é nach bhfuil aon bhealach le "dul" chuig macasamhail eile ar eagla go gcailltear é.
Tá uirlisí caighdeánacha leabharlainne dírithe go príomha ar cothrománach scálú: ligeann siad duit an taisce a mhéadú go méideanna ollmhóra agus rochtain a sholáthar dó ó chód arna óstáil ar fhreastalaithe éagsúla. Mar sin féin, inár gcás, ní sháraíonn méid na sonraí stóráilte roinnt ghigibheart, agus tá feidhmíocht nóid amháin nó dhó sách go leor. Dá réir sin, is é an t-aon uirlisí caighdeánacha úsáideacha a d'fhéadfadh a bheith ann ná infhaighteacht memcached a chinntiú agus cás taisce amháin ar a laghad a choinneáil i riocht oibre. Mar sin féin, níorbh fhéidir leas a bhaint as an deis seo fiú... Anseo is fiú seaniarsmaí an chreata a úsáideadh sa tionscadal a thabhairt chun cuimhne, agus is é sin an fáth go raibh sé dodhéanta an feidhmchlár a fháil chun oibriú le linn freastalaithe. Ná déanaimis dearmad freisin ar chailliúint sonraí seisiúin: tá súile an chustaiméara tar éis casadh as an logáil amach ollmhór úsáideoirí.
Go hidéalach bhí sé ag teastáil macasamhlú taifead i memcached agus ag seachaint macasamhla i gcás botún nó botún. Chuidigh sé linn an straitéis seo a chur i bhfeidhm .
mcrouter
Is é seo an ródaire memcached forbartha ag Facebook chun a chuid fadhbanna a réiteach. Tacaíonn sé leis an bprótacal téacs memcached, a cheadaíonn suiteálacha memcached scála go comhréireanna dÚsachtach. Is féidir cur síos mionsonraithe ar mcrouter a fháil i . I measc rudaí eile is féidir leis an méid a theastaíonn uainn a dhéanamh:
- taifead a mhacasamhlú;
- déan cúltaca le freastalaithe eile sa ghrúpa má tharlaíonn earráid.
Téigh síos ar ghnó!
cumraíocht mcrouter
Rachaidh mé díreach chuig an 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"
]
}
}
}
}Cén fáth trí linnte? Cén fáth a ndéantar freastalaithe arís agus arís eile? Déanaimis amach conas a oibríonn sé.
- Sa chumraíocht seo, roghnaíonn mcrouter an cosán a seolfar an t-iarratas chuige bunaithe ar ordú an iarratais. Insíonn an fear seo dó
OperationSelectorRoute. - Téigh chuig an láimhseálaí le hiarratais GET
RandomRoutea roghnaíonn go randamach linn snámha nó bealach i measc rudaí eagairchildren. Láimhseálaí ar a seal is ea gach eilimint den eagar seoMissFailoverRoute, a rachaidh trí gach freastalaí sa chomhthiomsú go dtí go bhfaighidh sé freagra le sonraí, a chuirfear ar ais chuig an gcliant. - Má úsáidtear muid go heisiach
MissFailoverRoutele comhthiomsú de thrí fhreastalaithe, ansin thiocfadh gach iarratas chuig an gcéad ásc memcached, agus gheobhadh an chuid eile iarratais ar bhonn iarmharach nuair nach bhfuil aon sonraí ann. Bheadh cur chuige den sórt sin mar thoradh ar ualach iomarcach ar an gcéad fhreastalaí ar an liosta, mar sin socraíodh trí linn a ghiniúint le seoltaí i seichimh éagsúla agus iad a roghnú go randamach. - Déantar gach iarratas eile (agus taifead é seo) a phróiseáil trí úsáid a bhaint as
AllMajorityRoute. Seolann an láimhseálaí seo iarratais chuig gach freastalaí sa chomhthiomsú agus fanann sé ar fhreagraí ó N/2 + 1 acu ar a laghad. Ó úsáidAllSyncRouteb'éigean oibríochtaí scríbhneoireachta a thréigean, toisc go dteastaíonn freagra dearfach ón modh seo Gach freastalaithe sa ghrúpa - ar shlí eile beidh sé ar aisSERVER_ERROR. Cé go gcuirfidh mcrouter na sonraí leis na caches atá ar fáil, an fheidhm PHP atá ag glaoch cuirfidh sé earráid ar ais agus ginfidh sé fógra.AllMajorityRoutenach bhfuil chomh dian sin agus ceadaíonn sé suas le leath de na haonaid a bhaint as seirbhís gan na fadhbanna a luaitear thuas.
Príomh-mhíbhuntáiste Is éard atá i gceist leis an scéim seo ná mura bhfuil sonraí sa taisce i ndáiríre, déanfar iarratais ón gcliant N chuig memcached a fhorghníomhú i ndáiríre - go do chách freastalaithe sa linn. Is féidir linn líon na bhfreastalaithe i linnte a laghdú, mar shampla, go dtí dhá cheann: iontaofacht stórála a íobairt, faigheann muidоluas níos airde agus níos lú ualach ó iarratais ar eochracha ar iarraidh.
NB: Seans go bhfaighidh tú naisc úsáideacha le haghaidh mcrouter foghlama и (lena n-áirítear cinn dúnta), a ionadaíonn stór iomlán de chumraíochtaí éagsúla.
Mcrouter a thógáil agus a rith
Ritheann ár n-iarratas (agus memcached féin) i Kubernetes - dá réir sin, tá mcrouter suite ann freisin. Le haghaidh tionól coimeádán úsáidimid , a mbeidh cuma mar seo ar an gcumraíocht dó:
NB: Tá na liostaí a thugtar san alt foilsithe sa stór .
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' ]()
... agus sceitse amach é Cairt Helm. Is é an rud suimiúil nach bhfuil ach gineadóir cumraíochta bunaithe ar líon na macasamhla (má tá rogha níos laconic agus galánta ag duine ar bith, déan é a roinnt sna tuairimí):
{{- $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 }}
}
}
}
}()
Déanaimid é a rolladh amach sa timpeallacht tástála agus seiceáil:
# 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 >Níor thug cuardach téacs na hearráide aon torthaí, ach don cheist ““Chun tosaigh a bhí an fhadhb is sine gan réiteach den tionscadal - prótacal dénártha memcached.
NB: Tá an prótacal ASCII i memcached níos moille ná an ceann dénártha, agus ní oibríonn modhanna caighdeánacha hashing eochair comhsheasmhach ach amháin leis an bprótacal dénártha. Ach ní chruthaíonn sé seo fadhbanna do chás ar leith.
Tá an cleas sa mhála: níl le déanamh agat ach athrú go prótacal ASCII agus oibreoidh gach rud…. Mar sin féin, sa chás seo, tá an nós ag lorg freagraí i d'imir sé magadh cruálach. Ní bhfaighidh tú an freagra ceart ansin... ach amháin, ar ndóigh, scrollaíonn tú go dtí an deireadh, cá háit sa rannán "Nótaí a chuir an t-úsáideoir leis" beidh dílis agus .
Sea, is é an t-ainm rogha ceart memcached.sess_binary_protocol. Caithfidh sé a bheith faoi mhíchumas, agus ina dhiaidh sin tosóidh na seisiúin ag obair. Níl fágtha ach an coimeádán le mcrouter a chur isteach i pod le PHP!
Conclúid
Mar sin, le hathruithe bonneagair díreach bhí muid in ann an fhadhb a réiteach: réitíodh an cheist maidir le lamháltas locht memcached, agus méadaíodh iontaofacht an stórais taisce. Chomh maith leis na buntáistí soiléire don iarratas, thug sé seo spás le haghaidh ainliú agus iad ag obair ar an ardán: nuair a bhíonn cúlchiste ag na comhpháirteanna go léir, déantar saol an riarthóra a shimpliú go mór. Sea, tá a míbhuntáistí ag an modh seo freisin, d'fhéadfadh go mbeadh cuma “crutch” air, ach má shábhálann sé airgead, adhlacann sé an fhadhb agus ní chuireann sé cinn nua - cén fáth?
PS
Léigh freisin ar ár mblag:
- "Cleachtaigh le dapp" (ag baint úsáide as symfony- demo mar shampla): и ;
- «'.
Foinse: will.com
