Ag baint úsáide as mcrouter chun memcached a scála go cothrománach

Ag baint úsáide as mcrouter chun memcached a scála go cothrománach

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, freastalaí iarratais féin. 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.

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 an fógra seo. I measc rudaí eile feidhmiúlacht leathan 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í eagair children. Láimhseálaí ar a seal is ea gach eilimint den eagar seo MissFailoverRoute, 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 MissFailoverRoute le 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áid AllSyncRoute b'é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 ais SERVER_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. AllMajorityRoute nach 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 doiciméadú ar vicí и saincheisteanna tionscadail (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 caoirigh, a mbeidh cuma mar seo ar an gcumraíocht dó:

NB: Tá na liostaí a thugtar san alt foilsithe sa stór 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' ]

(deirge.yaml)

... 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 }}
         }
       }
     }
   }

(10-mcrouter.yaml)

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 “Íosluchtaigh mcrouter php“Chun tosaigh a bhí an fhadhb is sine gan réiteach den tionscadal - easpa tacaíochta 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 doiciméadú ar php.net 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 freagra mícheart downvoted.

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:

Foinse: will.com

Add a comment