
Kugadzira mapurojekiti akaremerwa mumutauro chero upi zvake kunoda nzira yakakosha uye kushandiswa kwezvishandiso zvakakosha, asi kana zvasvika kune maapplication muPHP, mamiriro acho anogona kuwedzera zvekuti iwe unofanirwa kukudziridza, semuenzaniso. . Muchinyorwa ichi tichataura nezve kurwadziwa kwakajairika nekugoverwa kwesesheni kuchengetedza uye data caching mune memcached uye nekugadzirisa kwatakaita matambudziko aya mune imwe "wadhi" chirongwa.
Iyo gamba rechiitiko ndeye PHP application yakavakirwa pane symfony 2.3 chimiro, icho chisina kubatanidzwa zvachose muzvirongwa zvebhizinesi zvekuvandudza. Pamusoro pekuchengetwa kwesesheni kwakaringana, chirongwa ichi chakashandisa zvizere "caching zvese" mutemo mune memcached: mhinduro kune zvikumbiro kune dhatabhesi uye API maseva, akasiyana mireza, makiyi ekuyananisa kodhi kuuraya uye zvimwe zvakawanda. Mumamiriro ezvinhu akadaro, kuparara kwememcached kunouraya kushanda kwechikumbiro. Mukuwedzera, kurasikirwa kwecache kunotungamirira kumigumisiro yakakomba: DBMS inotanga kuputika pamasevhisi, API masevhisi anotanga kurambidza zvikumbiro, nezvimwe. Kudzikamisa mamiriro ezvinhu kunogona kutora makumi emaminetsi, uye panguva ino sevhisi ichanonoka zvakanyanya kana kusawanikwa zvachose.
Taifanira kupa kugona kuyera yakatwasuka application nekuedza kushoma, i.e. ine shanduko shoma kune kodhi kodhi uye kushanda kwakazara kwakachengetedzwa. Ita kuti cache isangopikisa kukundikana, asi edzawo kuderedza kurasikirwa kwedata kubva pairi.
Chii chakaipa ne memcached pachayo?
Kazhinji, iyo memcached yekuwedzera yePP inotsigira yakagovaniswa data uye chikamu chekuchengetedza kunze kwebhokisi. Iyo nzira yekuenderana kiyi hashing inokutendera iwe kuti uise data zvakaenzana pamasevha mazhinji, uchitaura zvakasiyana kiyi yega yega kune chaiyo sevha kubva muboka, uye yakavakirwa-mukati failover maturusi anovimbisa kuwanikwa kwakanyanya kweiyo caching sevhisi (asi, zvinosuruvarisa, hapana data).
Zvinhu zviri nani zvishoma nekuchengetedza chikamu: unogona kugadzirisa memcached.sess_number_of_replicas, semhedzisiro iyo data ichachengetwa pamaseva akati wandei kamwechete, uye kana paine kukundikana kweimwe memcached muenzaniso, iyo data ichaendeswa kubva kune vamwe. Nekudaro, kana sevha ikadzoka pamhepo isina data (sezvinowanzoitika mushure mekutangazve), mamwe makiyi anozogovaniswa mukuda kwayo. Chokwadi izvi zvichareva kurasikirwa kwesesheni data, sezvo pasina nzira "yekuenda" kune imwe replica kana ukapotsa.
Zvishandiso zveraibhurari zvakajairika zvinonangwa zvakanyanya chinjikira kuyera: ivo vanokutendera iwe kuti uwedzere cache kune yakakura saizi uye nekupa kuwana kwairi kubva kodhi inobatwa pane akasiyana maseva. Nekudaro, mumamiriro edu ezvinhu, vhoriyamu yedata yakachengetwa haipfuure akati wandei gigabytes, uye kuita kweimwe kana mbiri node zvakakwana zvakakwana. Saizvozvo, iyo chete inobatsira yakajairwa maturusi inogona kuve yekuona kuwanikwa kwememcached uchichengetedza kamwechete cache muenzaniso mukushanda mamiriro. Zvisinei, zvakanga zvisingabviri kushandisa kunyange mukana uyu ... Pano zvakakodzera kuyeuka yekare yegadziriro yakashandiswa muprojekti, ndicho chikonzero zvakanga zvisingakwanisi kuwana chikumbiro kushanda nedziva remaseva. Ngatisakanganwewo nezve kurasikirwa kwesesheni data: ziso remutengi rakadonha kubva pakubuda kukuru kwevashandisi.
Zvakanakisa zvaidiwa kudzokorora marekodhi mune memcached uye bypassing replicas pakaitika kukanganisa kana kukanganisa. Vakatibatsira kushandisa zano iri .
mcrouter
Iyi memcached router yakagadzirwa ne Facebook kugadzirisa matambudziko ayo. Inotsigira memcached text protocol, iyo inobvumira scale memcached installations kusvika pakupenga. Tsanangudzo yakadzama ye mcrouter inogona kuwanikwa mukati . Pakati pezvimwe zvinhu inogona kuita zvatinoda:
- dzokorora rekodhi;
- ita fallback kune mamwe maseva muboka kana kukanganisa kukaitika.
Zvebhizimisi!
mcrouter configuration
Ini ndichananga kune 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"
]
}
}
}
}Sei madziva matatu? Sei maseva achidzokororwa? Ngatione kuti zvinoshanda sei.
- Mukugadzirisa uku, mcrouter inosarudza nzira iyo chikumbiro chichatumirwa zvichienderana nemurairo wekukumbira. Mukomana anomuudza izvi
OperationSelectorRoute. - WANA zvikumbiro enda kumubati
RandomRouteiyo inosarudza dziva kana nzira pakati pezvinhu zvakarongwachildren. Chinhu chimwe nechimwe chechikamu ichi chinoshandura chibatisoMissFailoverRoute, iyo ichapfuura nepakati pesevha imwe neimwe mudziva kusvikira yawana mhinduro ine data, iyo ichadzorerwa kumutengi. - Kana takashandisa chete
MissFailoverRoutenedziva remaseva matatu, zvino zvikumbiro zvese zvaizotanga kuuya kune yekutanga memcached muenzaniso, uye vamwe vese vaizogamuchira zvikumbiro pane yakasara kana pasina data. Maitiro akadaro achaita kuti mutoro wakawandisa pane yekutanga server mune iyo rondedzero, saka zvakasarudzwa kugadzira madziva matatu ane kero mumateedzana akasiyana uye sarudza iwo zvisina tsarukano. - Zvimwe zvikumbiro zvese (uye iyi rekodhi) zvinogadziriswa uchishandisa
AllMajorityRoute. Uyu mubati anotumira zvikumbiro kune ese maseva ari mudziva uye anomirira mhinduro kubva kanenge N/2 + 1 yavo. Kubva kushandiswaAllSyncRoutenokuti kunyora mabasa aifanira kusiiwa, sezvo nzira iyi inoda mhinduro yakanaka kubva всех maseva ari muboka - zvikasadaro ichadzokaSERVER_ERROR. Kunyangwe mcrouter ichawedzera iyo data kune anowanikwa cache, iyo yekudaidza PHP basa ichadzorera kukanganisa uye ichaunza chiziviso.AllMajorityRoutehaina kuomesesa uye inobvumira kusvika hafu yemayuniti kutorwa kunze kwebasa pasina matambudziko anotsanangurwa pamusoro.
Main kukanganisa Ichi chirongwa ndechekuti kana pasina dhata mu cache, saka pachikumbiro chega chega kubva kumutengi N zvikumbiro zve memcached zvinonyatso itwa - kune vose maseva mudziva. Isu tinogona kuderedza huwandu hwemaseva mumadziva, semuenzaniso, kusvika maviri: kupa kuvimbika kwekuchengetedza, tinowana.оkumhanya kwepamusoro uye kuderera kwemutoro kubva kune zvikumbiro kune makiyi asipo.
NB: Unogonawo kuwana zvinongedzo zvinobatsira pakudzidza mcrouter и (kusanganisira akavharwa), anomiririra dura rose rezvigadziriso zvakasiyana.
Kuvaka uye kumhanya mcrouter
Yedu yekushandisa (uye memcached pachayo) inomhanya muKubernetes - saizvozvo, mcrouter inowanikwawo ipapo. For gungano remidziyo tinoshandisa , iyo config iyo ichaita seizvi:
NB: Mazita akapihwa muchinyorwa anoburitswa mune repository .
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' ]()
... uye dhizaini kunze Helm chati. Chinhu chinonakidza ndechekuti pane chete gadziriso jenareta zvichienderana nenhamba yezvinyorwa (kana paine chero munhu ane yakawedzera laconic uye inoyevedza sarudzo, igovera mune zvakataurwa):
{{- $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 }}
}
}
}
}()
Isu tinoiburitsa munzvimbo yekuyedza uye tarisa:
# 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 >Kutsvaga chinyorwa chekukanganisa hakuna kupa chero mhinduro, asi yemubvunzo ""Pamberi paive nedambudziko rekare risati ragadziriswa reprojekiti - memcached binary protocol.
NB: Iyo ASCII protocol mune memcached inononoka kupfuura iyo yebhinari, uye yakajairwa nzira dzekiyi hashing dzinoenderana dzinoshanda chete neiyo binary protocol. Asi izvi hazvigadziri matambudziko kune imwe nyaya.
Hunyengeri huri mubhegi: zvese zvaunofanirwa kuita chinja kune ASCII protocol uye zvese zvichashanda.... Zvisinei, munyaya iyi, tsika yekutsvaga mhinduro mukati akaita jee reutsinye. Iwe haugoni kuwana mhinduro yakarurama ipapo ... kunze kwekuti, hongu, iwe unopeta kusvika kumagumo, apo muchikamu "Manotsi anopihwa nemushandisi" achava akatendeka uye .
Ehe, iro rakakodzera sarudzo zita ndere memcached.sess_binary_protocol. Inofanira kunge yakaremara, mushure mezvo zvirongwa zvinotanga kushanda. Chasara kuisa mudziyo une mcrouter mupodhi ine PHP!
mhedziso
Nekudaro, nekungochinja kwezvivakwa takakwanisa kugadzirisa dambudziko: nyaya ine memcached kukanganisa kushivirira yakagadziriswa, uye kuvimbika kwekuchengetedza cache kwakawedzera. Pamusoro pezvakanakira zviri pachena zvekushandisa, izvi zvakapa nzvimbo yekufambisa paunenge uchishanda pachikuva: kana zvikamu zvese zvine chengetedzo, hupenyu hwemutungamiriri hunorerutswa zvakanyanya. Hongu, nzira iyi inewo zvipingamupinyi zvayo, inogona kutaridzika se "crutch", asi kana ichichengetedza mari, inoviga dambudziko uye haikonzeri zvitsva - nei?
PS
Verenga zvakare pablog yedu:
- "Dzidzira ne dapp" (uchishandisa symfony-demo semuenzaniso): и ;
- «".
Source: www.habr.com
