A’ cleachdadh mcrouter gus memcached a sgèileadh gu còmhnard

A’ cleachdadh mcrouter gus memcached a sgèileadh gu còmhnard

Feumaidh leasachadh phròiseactan làn luchd ann an cànan sam bith dòigh-obrach sònraichte agus cleachdadh innealan sònraichte, ach nuair a thig e gu tagraidhean ann am PHP, faodaidh an suidheachadh a bhith cho nas miosa is gum feum thu leasachadh, mar eisimpleir, frithealaiche tagraidh fhèin. Anns an nota seo bruidhnidh sinn mun phian air a bheil sinn eòlach le stòradh seisean sgaoilte agus tasgadh dàta ann am memcached agus mar a dh’ fhuasgail sinn na duilgheadasan sin ann an aon phròiseact “uàrd”.

Is e gaisgeach an tachartais tagradh PHP stèidhichte air frèam symfony 2.3, nach eil idir air a ghabhail a-steach anns na planaichean gnìomhachais airson ùrachadh. A bharrachd air stòradh seisean gu math àbhaisteach, rinn am pròiseact seo làn fheum de poileasaidh “caching everything”. ann am memcached: freagairtean do dh'iarrtasan chun an stòr-dàta agus frithealaichean API, diofar bhrataichean, glasan airson cur an gnìomh còd a shioncronachadh agus mòran a bharrachd. Ann an suidheachadh mar sin, bidh briseadh sìos de memcached a ‘fàs marbhtach do ghnìomhachd an tagraidh. A bharrachd air an sin, bidh call tasgadan a’ leantainn gu droch bhuilean: bidh an DBMS a ’tòiseachadh a’ spreadhadh aig na claisean, bidh seirbheisean API a ’tòiseachadh a’ toirmeasg iarrtasan, msaa. Dh’ fhaodadh gun toir e deichean de mhionaidean gus an suidheachadh a dhèanamh seasmhach, agus rè na h-ùine seo bidh an t-seirbheis gu math slaodach no gu tur gun a bhith ri fhaighinn.

Dh'fheumadh sinn a thoirt seachad an comas an tagradh a sgèileadh gu còmhnard gun mòran oidhirp, i.e. le glè bheag de dh’ atharrachaidhean air a’ chòd stòr agus làn ghnìomhachd air a ghleidheadh. Dèan an tasgadan chan ann a-mhàin an aghaidh fàilligeadh, ach cuideachd feuch ri call dàta bhuaithe a lughdachadh.

Dè tha ceàrr air memcached fhèin?

San fharsaingeachd, tha an leudachadh memcached airson PHP a’ toirt taic do dhàta sgaoilte agus stòradh seisean a-mach às a’ bhogsa. Leigidh an uidheamachd airson prìomh hashing cunbhalach leat dàta a sgaoileadh gu cothromach air mòran de luchd-frithealaidh, a’ dèiligeadh gu h-annasach ri gach iuchair shònraichte gu frithealaiche sònraichte bhon bhuidheann, agus bidh innealan fàilligidh togte a’ dèanamh cinnteach gu bheil cothrom àrd air an t-seirbheis tasgadan (ach, gu mì-fhortanach, gun dàta).

Tha cùisean beagan nas fheàrr le stòradh seisean: faodaidh tu rèiteachadh memcached.sess_number_of_replicas, mar thoradh air an sin thèid an dàta a stòradh air grunn luchd-frithealaidh aig an aon àm, agus ma dh’ fhàillig aon eisimpleir memcached, thèid an dàta a ghluasad bho chàch. Ach, ma thig am frithealaiche air ais air-loidhne gun dàta (mar as trice a thachras às deidh ath-thòiseachadh), thèid cuid de na h-iuchraichean ath-riarachadh na fhàbhar. Gu dearbh bidh seo a’ ciallachadh call dàta seisean, leis nach eil dòigh ann air “a dhol” gu mac-samhail eile gun fhios nach caillear thu.

Tha innealan leabharlainn àbhaisteach ag amas gu sònraichte air chòmhnard sgèileadh: leigidh iad leat an tasgadan àrdachadh gu meudan gigantic agus bheir iad cothrom air bho chòd air aoigheachd air diofar luchd-frithealaidh. Ach, anns an t-suidheachadh againn, chan eil an àireamh de dhàta a tha air a stòradh nas àirde na grunn gigabytes, agus tha coileanadh aon no dhà nodan gu leòr. Mar sin, is dòcha gur e na h-aon innealan àbhaisteach feumail dèanamh cinnteach gu bheil memcached ri fhaighinn fhad ‘s a chumas tu co-dhiù aon eisimpleir tasgadan ann an staid obrach. Ach, cha robh e comasach brath a ghabhail air eadhon an cothrom seo ... An seo is fhiach cuimhneachadh air àrsaidheachd an fhrèam a chaidh a chleachdadh sa phròiseact, agus is e sin as coireach gu robh e do-dhèanta an tagradh a bhith ag obair le cruinneachadh de luchd-frithealaidh. Na dìochuimhnich sinn cuideachd mu chall dàta seisean: bha sùil an neach-ceannach a’ tionndadh bho shuaicheantas mòr luchd-cleachdaidh.

Gu h-iomchaidh bha feum air ath-riochdachadh chlàran ann am memcached agus a’ dol seachad air mac-samhail ann an cùis mearachd no mearachd. Chuidich sinn sinn gus an ro-innleachd seo a chur an gnìomh mcrouter.

mcrouter

Is e seo router memcached air a leasachadh le Facebook gus fuasgladh fhaighinn air na duilgheadasan aige. Bidh e a’ toirt taic don phròtacal teacsa memcached, a tha a’ ceadachadh ionadan memcached sgèile gu cuibhrionn cealgach. Gheibhear tuairisgeul mionaideach air mcrouter ann an an sanas seo. Am measg rudan eile comas-gnìomh farsaing faodaidh e na tha a dhìth oirnn a dhèanamh:

  • ath-aithris clàr;
  • dèan tuiteam air ais gu frithealaichean eile sa bhuidheann ma thachras mearachd.

Faigh sìos gu gnìomhachas!

rèiteachadh mcrouter

Thèid mi dìreach chun 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"
       ]
     }
   }
 }
}

Carson trì lòin? Carson a tha na frithealaichean a-rithist? Feuch an obraich sinn a-mach mar a tha e ag obair.

  • Anns an rèiteachadh seo, taghaidh mcrouter an t-slighe air an tèid an t-iarrtas a chuir a-steach stèidhichte air an àithne iarrtas. Tha am fear ag innse seo dha OperationSelectorRoute.
  • Gabh iarrtasan GET chun an neach-làimhseachaidh RandomRoutea bhios air thuaiream a’ taghadh amar no slighe am measg nithean eagrachaidh children. Tha gach eileamaid den raon seo an uair sin na inneal-làimhseachaidh MissFailoverRoute, a thèid tro gach frithealaiche san linne gus am faigh e freagairt le dàta, a thèid a thilleadh chun neach-dèiligidh.
  • Ma chleachd sinn a-mhàin MissFailoverRoute le cruinneachadh de thrì frithealaichean, thigeadh a h-uile iarrtas an toiseach chun chiad eisimpleir memcached, agus gheibheadh ​​​​an còrr iarrtasan air stèidh eile nuair nach eil dàta ann. Bheireadh dòigh-obrach mar seo gu buil cus luchd air a’ chiad fhrithealaiche air an liosta, agus mar sin chaidh co-dhùnadh trì amaran a ghineadh le seòlaidhean ann an diofar shreathan agus an taghadh air thuaiream.
  • Bithear a’ giullachd a h-uile iarrtas eile (agus seo clàr) a’ cleachdadh AllMajorityRoute. Bidh an neach-làimhseachaidh seo a’ cur iarrtasan gu gach frithealaiche san linne agus a’ feitheamh ri freagairtean bho co-dhiù N/2 + 1 dhiubh. Bho chleachdadh AllSyncRoute airson obraichean sgrìobhaidh dh’ fheumadh iad a bhith air an trèigsinn, leis gu bheil feum aig an dòigh seo air deagh fhreagairt bho всех frithealaichean sa bhuidheann - air neo tillidh e SERVER_ERROR. Ged a chuireas mcrouter an dàta ris na caches a tha rim faighinn, bidh an gnìomh PHP ag iarraidh bheir e mearachd air ais agus bheir e fios. AllMajorityRoute chan eil e cho teann agus leigidh e suas ri leth de na h-aonadan a thoirt a-mach à seirbheis às aonais na duilgheadasan a tha air am mìneachadh gu h-àrd.

Prìomh eas-bhuannachd Is e an sgeama seo mura h-eil dàta sam bith san tasgadan, an uairsin airson gach iarrtas bhon neach-dèiligidh N thèid iarrtasan gu memcached a chuir gu bàs - gu do na h-uile seirbhisich anns an linne. Is urrainn dhuinn an àireamh de luchd-frithealaidh ann an amaran a lughdachadh, mar eisimpleir, gu dhà: ag ìobairt earbsachd stòraidh, gheibh sinnоastar nas àirde agus nas lugha de luchd bho iarrtasan gu iuchraichean a tha a dhìth.

NB: Is dòcha gum faigh thu ceanglaichean feumail airson mcrouter ionnsachadh sgrìobhainnean air wiki и cùisean pròiseict (a 'gabhail a-steach feadhainn dùinte), a' riochdachadh taigh-stòir iomlan de dhiofar rèiteachaidhean.

A 'togail agus a' ruith mcrouter

Tha an tagradh againn (agus memcached fhèin) a’ ruith ann an Kubernetes - a rèir sin, tha mcrouter cuideachd suidhichte an sin. Airson co-chruinneachadh container tha sinn a' cleachdadh gaoir, seallaidh an config airson seo mar seo:

NB: Tha na liostaichean a tha air an toirt seachad san artaigil air am foillseachadh anns an 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' ]

(seabhag.yaml)

... agus dèan dealbh dheth Clàr stiùiridh. Is e an rud inntinneach nach eil ann ach gineadair config stèidhichte air an àireamh de mhac-samhail (ma tha roghainn nas laconic agus nas eireachdail aig duine, roinn e anns na beachdan):

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

Bidh sinn ga sgaoileadh a-steach don àrainneachd deuchainn agus a’ sgrùdadh:

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

Cha tug rannsachadh airson teacsa na mearachd toradh sam bith, ach airson a’ cheist “Luchdaich a-nuas mcrouter php“B’ e an duilgheadas as sine sa phròiseact gun fhuasgladh - dìth taic protocol binary memcached.

NB: Tha am protocol ASCII ann am memcached nas slaodaiche na am fear binary, agus chan obraich dòighean àbhaisteach airson prìomh hashing cunbhalach ach leis a’ phròtacal dà-chànanach. Ach chan eil seo a 'cruthachadh dhuilgheadasan airson cùis shònraichte.

Tha an cleas anns a’ bhaga: chan eil agad ach atharrachadh gu protocol ASCII agus obraichidh a h-uile càil .... Ach, anns a 'chùis seo, an cleachdadh a bhith a' coimhead airson freagairtean a-steach sgrìobhainnean air php.net chluich fealla-dhà cruaidh. Chan fhaigh thu am freagairt ceart an sin ... mura sgrolaich thu chun deireadh, far a bheil san roinn, gu dearbh "Notaichean a chuir an cleachdaiche ris" bithidh dìleas agus freagairt neo-chothromach.

Tha, is e ainm an roghainn cheart memcached.sess_binary_protocol. Feumaidh e a bhith ciorramach, às deidh sin tòisichidh na seiseanan ag obair. Chan eil air fhàgail ach an soitheach le mcrouter a chuir ann am pod le PHP!

co-dhùnadh

Mar sin, le dìreach atharrachaidhean bun-structair bha e comasach dhuinn an duilgheadas fhuasgladh: chaidh a’ chùis le fulangas sgàineadh memcached fhuasgladh, agus chaidh earbsachd stòradh tasgadan àrdachadh. A bharrachd air na buannachdan follaiseach airson an tagraidh, thug seo àite airson gluasad nuair a bha e ag obair air an àrd-ùrlar: nuair a tha tèarmann aig a h-uile pàirt, tha beatha an rianadair air a dhèanamh nas sìmplidhe gu mòr. Tha, tha na h-eas-bhuannachdan aig an dòigh seo cuideachd, is dòcha gum bi e coltach ri “crutch”, ach ma shàbhaileas e airgead, adhlaicidh e an duilgheadas agus nach adhbhraich e feadhainn ùra - carson?

PS

Leugh cuideachd air ar blog:

Source: www.habr.com

Cuir beachd ann