Siv mcrouter los ntsuas memcached kab rov tav

Siv mcrouter los ntsuas memcached kab rov tav

Kev tsim cov phiaj xwm loj hauv ib hom lus yuav tsum muaj txoj hauv kev tshwj xeeb thiab siv cov cuab yeej tshwj xeeb, tab sis thaum nws los txog rau cov ntawv thov hauv PHP, qhov xwm txheej tuaj yeem ua rau hnyav heev uas koj yuav tsum tau tsim, piv txwv li, tus kheej daim ntawv thov server. Hauv daim ntawv no peb yuav tham txog qhov mob uas paub nrog kev sib tham sib faib thiab cov ntaub ntawv caching hauv memcached thiab seb peb daws cov teeb meem no li cas hauv ib txoj haujlwm "ward".

Tus phab ej ntawm lub sijhawm yog PHP daim ntawv thov raws li symfony 2.3 lub moj khaum, uas tsis yog tag nrho suav nrog hauv cov phiaj xwm kev lag luam los hloov kho. Ntxiv nrog rau qhov kev sib tham zoo heev, qhov project no tau siv tag nrho "caching txhua yam" txoj cai hauv memcached: cov lus teb rau kev thov rau cov ntaub ntawv thiab API servers, ntau yam chij, xauv rau synchronizing code ua thiab ntau ntxiv. Hauv qhov xwm txheej zoo li no, kev tawg ntawm memcached ua rau tuag taus rau kev ua haujlwm ntawm daim ntawv thov. Tsis tas li ntawd, kev poob cache ua rau muaj qhov tshwm sim loj: DBMS pib tawg ntawm cov seams, API cov kev pabcuam pib txwv tsis pub thov, thiab lwm yam. Kev ruaj khov ntawm qhov xwm txheej yuav siv sijhawm kaum feeb, thiab lub sijhawm no cov kev pabcuam yuav qeeb heev lossis tsis muaj tiav.

Peb yuav tsum tau muab muaj peev xwm mus rau kab rov tav scale daim ntawv thov nrog me ntsis kev rau siab, i.e. nrog tsawg kawg kev hloov pauv rau qhov chaws code thiab tag nrho functionality khaws cia. Ua kom lub cache tsis tsuas yog tiv taus qhov ua tsis tiav, tab sis kuj sim txo cov ntaub ntawv poob los ntawm nws.

Dab tsi tsis ncaj ncees lawm nrog memcached nws tus kheej?

Feem ntau, cov memcached txuas ntxiv rau PHP txhawb nqa cov ntaub ntawv faib tawm thiab kev sib tham cia tawm ntawm lub thawv. Lub mechanism ntawm qhov tseem ceeb sib xws hashing tso cai rau koj kom sib npaug ntawm cov ntaub ntawv ntawm ntau lub servers, tshwj xeeb hais txog txhua tus yuam sij tshwj xeeb rau ib tus neeg rau zaub mov tshwj xeeb los ntawm pab pawg, thiab cov cuab yeej ua tsis tau zoo ua kom muaj cov kev pabcuam caching siab (tab sis, hmoov tsis, tsis muaj ntaub ntawv).

Tej yam me ntsis zoo dua nrog kev sib tham cia: koj tuaj yeem teeb tsa memcached.sess_number_of_replicas, raws li qhov tshwm sim ntawm cov ntaub ntawv yuav muab khaws cia rau ntau lub servers ib zaug, thiab nyob rau hauv qhov kev tshwm sim ntawm ib qho kev ua tsis tiav ntawm ib qho memcached, cov ntaub ntawv yuav raug xa los ntawm lwm tus. Txawm li cas los xij, yog tias tus neeg rau zaub mov rov qab los hauv online yam tsis muaj cov ntaub ntawv (raws li feem ntau tshwm sim tom qab rov pib dua), qee cov yuam sij yuav raug xa rov qab rau nws qhov kev pom zoo. Qhov tseeb qhov no yuav txhais tau tias poob ntawm kev sib tham cov ntaub ntawv, vim tsis muaj txoj hauv kev "mus" mus rau lwm qhov kev hloov pauv thaum tsis nco qab.

Cov cuab yeej tsev qiv ntawv Standard yog tsom feem ntau ntawm kab rov tav scaling: lawv tso cai rau koj nce lub cache rau qhov loj me thiab muab kev nkag mus rau nws los ntawm cov cai tuav ntawm cov servers sib txawv. Txawm li cas los xij, hauv peb qhov xwm txheej, qhov ntim ntawm cov ntaub ntawv khaws cia tsis pub dhau ob peb gigabytes, thiab kev ua haujlwm ntawm ib lossis ob lub nodes yog txaus txaus. Raws li, tsuas yog cov cuab yeej siv tau zoo tuaj yeem ua kom ntseeg tau tias muaj memcached thaum tuav tsawg kawg ib qho cache hauv kev ua haujlwm. Txawm li cas los xij, nws tsis muaj peev xwm coj kom zoo dua txawm tias lub sijhawm no ... Ntawm no nws tsim nyog rov qab nco txog lub sijhawm qub ntawm lub moj khaum siv hauv qhov project, uas yog vim li cas nws thiaj li tsis tuaj yeem tau txais daim ntawv thov ua haujlwm nrog lub pas dej ntawm cov servers. Cia peb tseem tsis txhob hnov ​​​​qab txog qhov poob ntawm kev sib tham cov ntaub ntawv: tus neeg siv khoom lub qhov muag twitched los ntawm qhov loj heev logout ntawm cov neeg siv.

Qhov zoo tshaj plaws nws yuav tsum tau replication ntawm cov ntaub ntawv nyob rau hauv memcached thiab bypassing replicas thaum ua yuam kev los yog yuam kev. Pab peb siv lub tswv yim no mcrouter.

mcrouter

Qhov no yog memcached router tsim los ntawm Facebook los daws nws cov teeb meem. Nws txhawb cov memcached ntawv raws tu qauv, uas tso cai scale memcached installations rau insane proportions. Cov lus piav qhia ntxaws ntawm mcrouter tuaj yeem pom hauv tsab ntawv tshaj tawm no. Ntawm lwm yam dav functionality nws tuaj yeem ua raws li peb xav tau:

  • replicate cov ntaub ntawv;
  • ua fallback rau lwm cov servers hauv pab pawg yog tias muaj teeb meem tshwm sim.

Mus ua haujlwm!

mcrouter configuration

Kuv yuav ncaj qha mus rau lub 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"
       ]
     }
   }
 }
}

Vim li cas peb lub pas dej? Vim li cas cov servers rov ua dua? Cia peb kawm seb nws ua haujlwm li cas.

  • Hauv qhov kev teeb tsa no, mcrouter xaiv txoj hauv kev uas qhov kev thov yuav raug xa raws li cov lus thov. Tus txiv neej qhia nws li no OperationSelectorRoute.
  • Tau txais kev thov mus rau tus tuav RandomRouteuas randomly xaiv ib pas dej ua ke los yog txoj kev ntawm array khoom children. Txhua yam ntawm cov array no yog nyob rau hauv lem ib tug handler MissFailoverRoute, uas yuav dhau los ntawm txhua tus neeg rau zaub mov hauv lub pas dej kom txog thaum nws tau txais cov lus teb nrog cov ntaub ntawv, uas yuav xa rov qab rau tus neeg siv khoom.
  • Yog peb siv xwb MissFailoverRoute nrog lub pas dej ua ke ntawm peb lub servers, tom qab ntawd txhua qhov kev thov yuav tuaj rau thawj zaug memcached, thiab tus so yuav tau txais kev thov ntawm qhov seem thaum tsis muaj ntaub ntawv. Txoj kev zoo li no yuav ua rau load ntau dhau ntawm thawj tus neeg rau zaub mov hauv daim ntawv teev npe, yog li nws tau txiav txim siab los tsim peb lub pas dej nrog qhov chaw nyob hauv cov kab sib txawv thiab xaiv lawv random.
  • Tag nrho lwm yam kev thov (thiab qhov no yog cov ntaub ntawv) raug ua tiav siv AllMajorityRoute. Tus neeg saib xyuas no xa cov lus thov rau txhua tus servers hauv lub pas dej thiab tos cov lus teb los ntawm tsawg kawg N / 2 + 1 ntawm lawv. Los ntawm kev siv AllSyncRoute rau kev sau ntawv yuav tsum tau muab tso tseg, vim hais tias txoj kev no yuav tsum muaj lus teb zoo los ntawm ntawm txhua tus servers hauv pab pawg - txwv tsis pub nws yuav rov qab los SERVER_ERROR. Txawm hais tias mcrouter yuav ntxiv cov ntaub ntawv rau cov caches muaj, hu rau PHP muaj nuj nqi yuav rov qab ua yuam kev thiab yuav tsim kev ceeb toom. AllMajorityRoute tsis yog nruj heev thiab tso cai rau ib nrab ntawm cov chav nyob kom raug tshem tawm ntawm kev pabcuam yam tsis muaj teeb meem tau piav qhia saum toj no.

Lub ntsiab tsis zoo Cov tswv yim no yog tias yog tias tsis muaj cov ntaub ntawv hauv lub cache tiag tiag, tom qab ntawd rau txhua qhov kev thov los ntawm tus neeg thov N thov rau memcached tiag tiag yuav raug tua - rau rau txhua tus servers nyob rau hauv lub pas dej ua ke. Peb tuaj yeem txo tus naj npawb ntawm cov servers hauv cov pas dej, piv txwv li, rau ob: kev tso siab rau kev cia siab, peb tau txaisоceev dua thiab tsawg load los ntawm kev thov mus rau cov yuam sij uas ploj lawm.

NB: Koj kuj tuaj yeem pom cov txuas txuas rau kev kawm mcrouter cov ntaub ntawv ntawm wiki и qhov project teeb meem (nrog rau cov kaw), sawv cev rau tag nrho lub tsev khaws khoom ntawm ntau yam kev teeb tsa.

Tsim thiab khiav mcrouter

Peb daim ntawv thov (thiab memcached nws tus kheej) khiav hauv Kubernetes - raws li, mcrouter kuj nyob ntawd. Rau thawv sib dhos peb siv werf, lub config uas yuav zoo li no:

NB: Cov npe tau muab rau hauv tsab xov xwm tau tshaj tawm hauv lub chaw khaws cia 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. yam)

... thiab sketch nws tawm Helm daim duab. Qhov nthuav yog tias tsuas muaj lub tshuab hluav taws xob config raws li tus naj npawb ntawm replicas (yog tias leej twg muaj kev xaiv ntau dua laconic thiab elegant, qhia nws hauv cov lus):

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

Peb yob nws tawm mus rau hauv qhov chaw xeem thiab xyuas:

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

Tshawb nrhiav cov ntawv ntawm qhov yuam kev tsis tau muab cov txiaj ntsig, tab sis rau cov lus nug "mcrouter php ua"Nyob rau hauv pem hauv ntej yog qhov qub tshaj plaws unsolved teeb meem ntawm qhov project - tsis muaj kev txhawb nqa memcached binary raws tu qauv.

NB: ASCII raws tu qauv hauv memcached yog qeeb dua li binary ib qho, thiab tus qauv txhais tau hais tias qhov tseem ceeb sib xws tsuas yog ua haujlwm nrog binary raws tu qauv. Tab sis qhov no tsis tsim teeb meem rau ib rooj plaub tshwj xeeb.

Qhov ua kom yuam kev yog nyob rau hauv lub hnab: txhua yam koj yuav tsum ua yog hloov mus rau ASCII raws tu qauv thiab txhua yam yuav ua haujlwm .... Txawm li cas los xij, hauv qhov no, tus cwj pwm ntawm kev nrhiav cov lus teb hauv cov ntaub ntawv ntawm php.net ua si lom zem kawg. Koj yuav tsis pom cov lus teb raug muaj ... tshwj tsis yog, tau kawg, koj scroll mus rau qhov kawg, qhov twg hauv ntu "Cov neeg siv tau sau ntawv" yuav ncaj ncees thiab tsis ncaj ncees downvoted teb.

Yog, lub npe xaiv raug yog memcached.sess_binary_protocol. Nws yuav tsum raug kaw, tom qab ntawd cov ntu yuav pib ua haujlwm. Txhua yam uas tseem tshuav yog muab lub thawv nrog mcrouter rau hauv lub pod nrog PHP!

xaus

Yog li, tsuas yog kev hloov pauv hauv kev tsim kho peb tuaj yeem daws qhov teeb meem: qhov teeb meem nrog memcached txhaum kev zam tau raug daws, thiab kev ntseeg siab ntawm cache cia tau nce. Ntxiv rau qhov pom tseeb qhov zoo rau daim ntawv thov, qhov no tau muab chav rau maneuver thaum ua haujlwm ntawm lub platform: thaum tag nrho cov khoom muaj qhov tshwj tseg, lub neej ntawm tus thawj coj tau yooj yim heev. Yog lawm, txoj kev no kuj muaj nws qhov tsis zoo, nws yuav zoo li "Crutch", tab sis yog tias nws txuag nyiaj, faus qhov teeb meem thiab tsis ua rau cov tshiab - vim li cas ho tsis?

PS

Nyeem kuj ntawm peb blog:

Tau qhov twg los: www.hab.com

Ntxiv ib saib