Lilo mcrouter lati ṣe iwọn memcached ni petele

Lilo mcrouter lati ṣe iwọn memcached ni petele

Ṣiṣe idagbasoke awọn iṣẹ akanṣe giga ni eyikeyi ede nilo ọna pataki kan ati lilo awọn irinṣẹ pataki, ṣugbọn nigbati o ba de awọn ohun elo ni PHP, ipo naa le di pupọ ti o ni lati dagbasoke, fun apẹẹrẹ, olupin ohun elo ti ara. Ninu akọsilẹ yii a yoo sọrọ nipa irora ti o faramọ pẹlu ibi ipamọ igba pinpin ati fifipamọ data ni memcached ati bii a ṣe yanju awọn iṣoro wọnyi ni iṣẹ akanṣe “ward” kan.

Akikanju iṣẹlẹ naa jẹ ohun elo PHP kan ti o da lori ilana 2.3 symfony, eyiti ko si rara ninu awọn ero iṣowo lati ṣe imudojuiwọn. Ni afikun si ibi ipamọ igba boṣewa oyimbo, iṣẹ akanṣe yii lo ni kikun "caching ohun gbogbo" imulo ni memcached: awọn idahun si awọn ibeere si ibi ipamọ data ati awọn olupin API, ọpọlọpọ awọn asia, awọn titiipa fun mimuuṣiṣẹpọ koodu ipaniyan ati pupọ diẹ sii. Ni iru ipo bẹẹ, didenukole ti memcached di apaniyan si iṣẹ ti ohun elo naa. Ni afikun, ipadanu kaṣe nyorisi awọn abajade to ṣe pataki: DBMS bẹrẹ lati bu ni awọn okun, awọn iṣẹ API bẹrẹ lati gbesele awọn ibeere, ati bẹbẹ lọ. Iduroṣinṣin ipo le gba awọn iṣẹju mẹwa mẹwa, ati ni akoko yii iṣẹ naa yoo lọra pupọ tabi ko si patapata.

A nilo lati pese agbara lati petele iwọn ohun elo pẹlu kekere akitiyan, i.e. pẹlu awọn iyipada kekere si koodu orisun ati iṣẹ ṣiṣe ni kikun ti o tọju. Ṣe kaṣe kii ṣe sooro si awọn ikuna nikan, ṣugbọn tun gbiyanju lati dinku pipadanu data lati ọdọ rẹ.

Kini aṣiṣe pẹlu memcached funrararẹ?

Ni gbogbogbo, itẹsiwaju memcached fun PHP ṣe atilẹyin data pinpin ati ibi ipamọ igba jade ninu apoti. Ilana fun hashing bọtini deede gba ọ laaye lati gbe data ni deede lori ọpọlọpọ awọn olupin, ni iyasọtọ ti n ba sọrọ bọtini kọọkan pato si olupin kan pato lati ẹgbẹ, ati awọn irinṣẹ ikuna ti a ṣe sinu ṣe idaniloju wiwa giga ti iṣẹ caching (ṣugbọn, laanu, ko si data).

Awọn nkan dara diẹ pẹlu ibi ipamọ igba: o le tunto memcached.sess_number_of_replicas, bi abajade ti data naa yoo wa ni ipamọ lori awọn olupin pupọ ni ẹẹkan, ati ninu iṣẹlẹ ti ikuna ti apẹẹrẹ memcached kan, data naa yoo gbe lọ lati ọdọ awọn miiran. Bibẹẹkọ, ti olupin ba pada wa lori ayelujara laisi data (bii igbagbogbo ṣẹlẹ lẹhin atunbere), diẹ ninu awọn bọtini yoo tun pin ni oju-rere rẹ. Ni otitọ eyi yoo tumọ si isonu ti data igba, niwọn igba ti ko si ọna lati “lọ” si ẹda miiran ti o ba padanu.

Standard ìkàwé irinṣẹ ti wa ni Eleto o kun ni petele igbelosoke: wọn gba ọ laaye lati mu kaṣe pọ si awọn iwọn gigantic ati pese iraye si lati koodu ti gbalejo lori awọn olupin oriṣiriṣi. Sibẹsibẹ, ni ipo wa, iwọn didun ti data ti o fipamọ ko kọja gigabytes pupọ, ati iṣẹ ti awọn apa kan tabi meji jẹ to. Nitorinaa, awọn irinṣẹ boṣewa ti o wulo nikan le jẹ lati rii daju wiwa memcached lakoko mimu o kere ju apẹẹrẹ kaṣe kan ni ipo iṣẹ. Sibẹsibẹ, ko ṣee ṣe lati lo anfani paapaa anfani yii ... Nibi o tọ lati ṣe iranti igba atijọ ti ilana ti a lo ninu iṣẹ naa, eyiti o jẹ idi ti ko ṣee ṣe lati gba ohun elo lati ṣiṣẹ pẹlu adagun awọn olupin. Jẹ ki a tun maṣe gbagbe nipa isonu ti data igba: oju alabara ti tẹ lati ibujade nla ti awọn olumulo.

Apere ti o ti beere atunse ti awọn igbasilẹ ni memcached ati fori awọn ẹda ninu ọran ti aṣiṣe tabi aṣiṣe. Ṣe iranlọwọ fun wa lati ṣe ilana yii mcrouter.

mcrouter

Eyi jẹ olulana memcached ti o dagbasoke nipasẹ Facebook lati yanju awọn iṣoro rẹ. O ṣe atilẹyin ilana ọrọ memcached, eyiti o gba laaye asekale memcached awọn fifi sori ẹrọ to were ti yẹ. Apejuwe alaye ti mcrouter ni a le rii ni ìkéde yìí. Lara ohun miiran jakejado iṣẹ- o le ṣe ohun ti a nilo:

  • igbasilẹ atunṣe;
  • ma ṣubu si awọn olupin miiran ninu ẹgbẹ ti aṣiṣe ba waye.

Lọ si iṣẹ!

mcrouter iṣeto ni

Emi yoo lọ taara si atunto:

{
 "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"
       ]
     }
   }
 }
}

Kí nìdí mẹta adagun? Kini idi ti awọn olupin tun ṣe? Jẹ ká ro ero jade bi o ti ṣiṣẹ.

  • Ninu iṣeto yii, mcrouter yan ọna si eyiti ibeere naa yoo firanṣẹ da lori aṣẹ ibeere. Arakunrin naa sọ eyi fun u OperationSelectorRoute.
  • Awọn ibeere GET lọ si olutọju RandomRouteeyiti o yan adagun-odo tabi ipa-ọna laileto laarin awọn ohun-ọṣọ children. Ẹya kọọkan ti titobi yii jẹ oluṣakoso ni titan MissFailoverRoute, eyi ti yoo lọ nipasẹ olupin kọọkan ninu adagun titi ti o fi gba esi pẹlu data, eyi ti yoo pada si onibara.
  • Ti a ba lo ni iyasọtọ MissFailoverRoute pẹlu adagun ti awọn olupin mẹta, lẹhinna gbogbo awọn ibeere yoo wa ni akọkọ si apẹẹrẹ memcached akọkọ, ati pe iyoku yoo gba awọn ibeere ni ipilẹ ti o ku nigbati ko si data. Iru ọna bẹ yoo ja si fifuye pupọ lori olupin akọkọ ninu atokọ naa, nitorinaa o pinnu lati ṣe ina awọn adagun omi mẹta pẹlu awọn adirẹsi ni awọn ọna oriṣiriṣi ati yan wọn laileto.
  • Gbogbo awọn ibeere miiran (ati eyi jẹ igbasilẹ) ti ni ilọsiwaju ni lilo AllMajorityRoute. Olutọju yii nfi awọn ibeere ranṣẹ si gbogbo awọn olupin ni adagun-odo ati duro fun awọn idahun lati o kere ju N/2 + 1 ninu wọn. Lati lilo AllSyncRoute fun awọn iṣẹ kikọ ni lati kọ silẹ, nitori ọna yii nilo esi rere lati всех awọn olupin ni ẹgbẹ - bibẹẹkọ o yoo pada SERVER_ERROR. Botilẹjẹpe mcrouter yoo ṣafikun data si awọn kaṣe ti o wa, iṣẹ PHP pipe yoo pada aṣiṣe ati ki o yoo se ina akiyesi. AllMajorityRoute ni ko ki muna ati ki o gba soke to idaji ninu awọn sipo lati wa ni ya jade ti iṣẹ lai awọn isoro ti salaye loke.

Alailanfani akọkọ Eto yii ni pe ti ko ba si data gaan ninu kaṣe, lẹhinna fun ibeere kọọkan lati ọdọ alabara N awọn ibeere si memcached yoo ṣee ṣe ni otitọ - lati si gbogbo apèsè ninu awọn pool. A le dinku nọmba awọn olupin ni awọn adagun omi, fun apẹẹrẹ, si meji: rubọ igbẹkẹle ipamọ, a gbaоti o ga iyara ati ki o kere fifuye lati ibeere to sonu awọn bọtini.

NB: O tun le wa awọn ọna asopọ to wulo fun kikọ mcrouter iwe lori wiki и oran ise agbese (pẹlu awọn tiipa), o nsoju gbogbo ile-itaja ti ọpọlọpọ awọn atunto.

Ilé ati ki o nṣiṣẹ mcrouter

Ohun elo wa (ati memcached funrararẹ) nṣiṣẹ ni Kubernetes - ni ibamu, mcrouter tun wa nibẹ. Fun eiyan ijọ a lo werf, atunto fun eyiti yoo dabi eyi:

NB: Awọn atokọ ti a fun ni nkan naa ni a gbejade ni ibi ipamọ 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' ]

(werf.yaml)

... ki o si ya aworan rẹ Helm aworan atọka. Ohun ti o yanilenu ni pe olupilẹṣẹ atunto kan wa ti o da lori nọmba awọn ẹda (ti ẹnikẹni ba ni aṣayan laconic diẹ sii ati yangan, pin ninu awọn asọye):

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

A yi lọ si agbegbe idanwo ati ṣayẹwo:

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

Wiwa ọrọ ti aṣiṣe ko fun awọn abajade eyikeyi, ṣugbọn fun ibeere naa "mcrouter php"Ni iwaju ni iṣoro ti a ko yanju julọ ti iṣẹ akanṣe naa - aini ti support memcached alakomeji bèèrè.

NB: Ilana ASCII ni memcached jẹ losokepupo ju alakomeji lọ, ati awọn ọna boṣewa ti hashing bọtini dédé nikan ṣiṣẹ pẹlu ilana alakomeji. Ṣugbọn eyi ko ṣẹda awọn iṣoro fun ọran kan pato.

Ẹtan naa wa ninu apo: gbogbo ohun ti o ni lati ṣe ni yipada si ilana ASCII ati pe ohun gbogbo yoo ṣiṣẹ…. Sibẹsibẹ, ninu ọran yii, aṣa ti wiwa awọn idahun ni iwe lori php.net dun a ìka awada. Iwọ kii yoo rii idahun to pe nibẹ… ayafi ti, dajudaju, o yi lọ si opin, nibiti o wa ni apakan "Awọn akọsilẹ ti olumulo ṣe alabapin" yoo jẹ olóòótọ ati unfairly downvoted idahun.

Bẹẹni, orukọ aṣayan to tọ ni memcached.sess_binary_protocol. O gbọdọ jẹ alaabo, lẹhin eyi awọn akoko yoo bẹrẹ ṣiṣẹ. Gbogbo ohun ti o ku ni lati fi eiyan pẹlu mcrouter sinu adarọ ese pẹlu PHP!

ipari

Nitorinaa, pẹlu awọn ayipada amayederun nikan a ni anfani lati yanju iṣoro naa: ọran pẹlu ifarada ẹbi memcached ti ni ipinnu, ati igbẹkẹle ti ibi ipamọ kaṣe ti pọ si. Ni afikun si awọn anfani ti o han gbangba fun ohun elo, eyi funni ni yara fun ọgbọn nigbati o n ṣiṣẹ lori pẹpẹ: nigbati gbogbo awọn paati ba ni ifiṣura, igbesi aye oludari jẹ irọrun pupọ. Bẹẹni, ọna yii tun ni awọn alailanfani rẹ, o le dabi “apapọ”, ṣugbọn ti o ba fi owo pamọ, o sin iṣoro naa ati pe ko fa awọn tuntun - kilode?

PS

Ka tun lori bulọọgi wa:

orisun: www.habr.com

Fi ọrọìwòye kun