Iji mcrouter tụọ ihe memcached kwụ ọtọ

Iji mcrouter tụọ ihe memcached kwụ ọtọ

Ịzụlite ọrụ dị elu n'asụsụ ọ bụla chọrọ ụzọ pụrụ iche na iji ngwá ọrụ pụrụ iche, ma a bịa n'ihe gbasara ngwa na PHP, ọnọdụ ahụ nwere ike ịka njọ nke na ị ga-etolite, dịka ọmụmaatụ. nkesa ngwa nke ya. N'ime ndetu a, anyị ga-ekwu maka mgbu a maara nke ọma na nchekwa oge nkesa na nchekwa data na memcached yana otu anyị siri dozie nsogbu ndị a n'otu ọrụ “ward”.

Onye dike nke oge a bụ ngwa PHP dabere na usoro symfony 2.3, nke na-adịghị etinye na atụmatụ azụmahịa imelite. Na mgbakwunye na nchekwa nchekwa oge ọkọlọtọ, ọrụ a mere nke ọma amụma "caching ihe niile". na memcached: nzaghachi nye arịrịọ na nchekwa data na sava API, ọkọlọtọ dị iche iche, mkpọchi maka ịmekọrịta mmebe koodu na ọtụtụ ndị ọzọ. N'ọnọdụ dị otú ahụ, mmebi nke memcached na-egbu egbu maka ọrụ nke ngwa ahụ. Na mgbakwunye, mfu cache na-eduga na nsonaazụ dị njọ: DBMS na-amalite ịgbawa na seams, ọrụ API na-amalite machibido arịrịọ, wdg. Idozi ọnọdụ ahụ nwere ike were nkeji iri iri, na n'oge a, ọrụ ahụ ga-adị nwayọ nwayọ ma ọ bụ enweghị ya kpamkpam.

Anyị kwesịrị inye ike n'usoro nhata ngwa na obere mgbalị, i.e. nwere obere mgbanwe na koodu isi mmalite yana arụ ọrụ zuru oke echekwara. Mee ka cache ọ bụghị naanị na-eguzogide ọdịda, kamakwa gbalịa iwelata ọnwụ data sitere na ya.

Kedu ihe dị njọ na memcached n'onwe ya?

Na mkpokọta, ndọtị memcached maka PHP na-akwado data ekesara na nchekwa oge n'ime igbe. Usoro nke hashing igodo na-agbanwe agbanwe na-enye gị ohere idowe data n'otu n'otu na ọtụtụ sava, na-ekwu okwu n'ụzọ pụrụ iche na igodo ọ bụla akọwapụtara nke otu ihe nkesa sitere na otu ahụ, yana ngwaọrụ arụrụ arụ arụrụ arụ na-eme ka ọrụ caching dị elu (mana, ọ dị nwute, enweghị data).

Ihe dị ntakịrị mma na nchekwa oge: ị nwere ike hazie memcached.sess_number_of_replicas, n'ihi nke a ga-echekwa data ahụ n'ọtụtụ sava ozugbo, ma ọ bụrụ na ọdịda nke otu memcached dara, a ga-ebufe data site na ndị ọzọ. Otú ọ dị, ọ bụrụ na ihe nkesa na-alọghachi na ntanetị na-enweghị data (dị ka ọ na-emekarị mgbe ịmalitegharịa), a ga-ekesa ụfọdụ igodo na ihu ọma ya. N'ezie nke a ga-apụta ọnwụ nke data nnọkọ, ebe ọ bụ na ọ nweghị ụzọ ị ga-esi "gaa" na oyiri ọzọ ma ọ bụrụ na ọ furu efu.

A na-ezubere ngwa ọbá akwụkwọ ọkọlọtọ tumadi na kehoraizin scaling: ha na-enye gị ohere ịbawanye cache na nnukwu nha ma nye ohere ịnweta ya site na koodu kwadoro na sava dị iche iche. Otú ọ dị, n'ọnọdụ anyị, olu nke data echekwara adịghị agafe ọtụtụ gigabytes, na arụmọrụ nke otu ọnụ ma ọ bụ abụọ zuru oke. N'ihi ya, naanị ngwaọrụ ọkọlọtọ bara uru nwere ike ịbụ ịhụ na enwere memcached ka ị na-edobe opekata mpe otu cache n'ọnọdụ ọrụ. Otú ọ dị, ọ gaghị ekwe omume iji ohere a ọbụna mee ihe ... N'ebe a, ọ bara uru icheta oge ochie nke usoro eji eme ihe na oru ngo, nke mere na ọ gaghị ekwe omume ịnweta ngwa iji rụọ ọrụ na ọdọ mmiri nke sava. Ka anyị ghara ichefu banyere ọnwụ nke data nnọkọ: anya ndị ahịa na-atụgharị site na nnukwu logout nke ndị ọrụ.

O doro anya na achọrọ ya ndegharị nke ndekọ na memcached na gafere oyiri n'ihe banyere mmejọ ma ọ bụ mmejọ. Nyere anyị aka ime atụmatụ a mcrouter.

mcrouter

Nke a bụ rawụta memcached nke Facebook mepụtara iji dozie nsogbu ya. Ọ na-akwado ụkpụrụ ederede memcached, nke na-enye ohere nha memcached nrụnye ka ara ruru. Enwere ike ịchọta nkọwa zuru ezu nke mcrouter na ọkwa a. Tinyere ihe ndị ọzọ ọrụ sara mbara ọ nwere ike ime ihe anyị chọrọ:

  • ihe ndekọ oyiri;
  • laghachi azụ na sava ndị ọzọ n'ime otu ma ọ bụrụ na njehie emee.

Gaa ọrụ!

nhazi mcrouter

Aga m aga ozugbo na nhazi:

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

Gịnị kpatara ọdọ mmiri atọ? Kedu ihe kpatara eji emeghachi sava? Ka anyị chọpụta ka o si arụ ọrụ.

  • Na nhazi a, mcrouter na-ahọrọ ụzọ a ga-eziga arịrịọ ahụ dabere na iwu arịrịọ. Nwoke ahụ gwara ya ihe a OperationSelectorRoute.
  • Nweta arịrịọ gakwuru onye njikwa RandomRoutenke na-ahọrọ ọdọ mmiri ma ọ bụ ụzọ na-enweghị usoro n'etiti ihe n'usoro children. Ihe ọ bụla n'usoro a bụ onye njikwa MissFailoverRoute, nke ga-agafe ihe nkesa ọ bụla na ọdọ mmiri ruo mgbe ọ na-enweta nzaghachi na data, nke a ga-eweghachite onye ahịa.
  • Ọ bụrụ na anyị na-eji naanị MissFailoverRoute na ọdọ mmiri nke sava atọ, mgbe ahụ arịrịọ niile ga-ebute ụzọ na nke mbụ memcached, na ndị ọzọ ga-anata arịrịọ na ndabere fọdụrụ mgbe enweghị data. Ụzọ dị otú ahụ ga-eduga oke ibu na nkesa mbụ na ndepụta, yabụ e kpebiri imepụta ọdọ mmiri atọ nwere adreesị n'usoro dị iche iche wee họrọ ha na-enweghị usoro.
  • A na-ahazi arịrịọ ndị ọzọ niile (nke a bụ ndekọ) site na iji AllMajorityRoute. Onye njikwa a na-eziga arịrịọ na sava niile nọ na ọdọ mmiri wee chere nzaghachi site na opekata mpe N/2 + 1 n'ime ha. Site na iji AllSyncRoute n'ihi na a ga-ahapụ ọrụ ide ihe, ebe ọ bụ na usoro a chọrọ nzaghachi dị mma site na всех sava na otu - ma ọ bụghị ya, ọ ga-alaghachi SERVER_ERROR. Ọ bụ ezie na mcrouter ga-agbakwunye data na caches dị, ọrụ PHP na-akpọ ga-eweghachi mperi ma ga-emepụta ọkwa. AllMajorityRoute adịghị ike nke ukwuu ma na-enye ohere ka ewepụ ihe ruru ọkara nke nkeji ọrụ na-enweghị nsogbu ndị akọwara n'elu.

Isi mwepu Atụmatụ a bụ na ọ bụrụ na enweghị data na cache, mgbe ahụ maka arịrịọ ọ bụla sitere n'aka onye ahịa N arịrịọ maka memcached ga-eme n'ezie - ka niile sava na ọdọ mmiri. Anyị nwere ike belata ọnụ ọgụgụ nke sava na ọdọ mmiri, dịka ọmụmaatụ, na abụọ: ịchụ àjà ntụkwasị obi, anyị na-enwetaоọsọ dị elu na obere ibu site na arịrịọ gaa na igodo efu.

NB: Ị nwekwara ike ịhụ njikọ bara uru maka ịmụ mcrouter akwụkwọ na wiki и nsogbu oru ngo (gụnyere ndị mechiri emechi), na-anọchite anya ụlọ nkwakọba ihe niile nke nhazi dị iche iche.

Ụlọ na-agba ọsọ mcrouter

Ngwa anyị (ma memcached n'onwe ya) na-arụ ọrụ na Kubernetes - yabụ, mcrouter dịkwa ebe ahụ. Maka mgbakọ akpa anyị na -eji werf, nhazi nke ga-adị ka nke a:

NB: A na-ebipụta ndepụta ndị e nyere n'isiokwu ahụ na ebe nchekwa 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)

... ma chepụta ya chaatị Helm. Ihe na-akpali mmasị bụ na e nwere naanị config generator dabere na ọnụ ọgụgụ nke oyiri (ọ bụrụ na onye ọ bụla nwere nhọrọ laconic na nke mara mma, kesaa ya na nkwupụta):

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

Anyị na-atụgharị ya na gburugburu ule wee lelee:

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

Ịchọ ederede nke njehie ahụ enyeghị nsonaazụ ọ bụla, mana maka ajụjụ a "mcrouter php"N'ihu bụ nsogbu kachasị ochie na-edozibeghị nke ọrụ ahụ - enweghị nkwado memcached ọnụọgụ abụọ protocol.

NB: Usoro ASCII dị na memcached dị nwayọ karịa nke ọnụọgụ abụọ, na usoro ọkọlọtọ nke hashing igodo na-agbanwe agbanwe na-arụ ọrụ na usoro ọnụọgụ abụọ. Mana nke a anaghị emepụta nsogbu maka otu ikpe.

Aghụghọ dị na akpa ahụ: ihe niile ị ga - eme bụ ịgbanwee na protocol ASCII na ihe niile ga - arụ ọrụ .... Otú ọ dị, na nke a, àgwà nke ịchọ azịza na akwụkwọ na php.net egwuri egwu obi ọjọọ. Ị gaghị ahụ azịza ziri ezi n'ebe ahụ ... ọ gwụla ma, n'ezie, ị pịgharịa gaa na njedebe, ebe dị na ngalaba "Ihe ndetu nyere onye ọrụ" ga-ekwesị ntụkwasị obi na azịza na-ezighi ezi.

Ee, aha nhọrọ ziri ezi bụ memcached.sess_binary_protocol. A ghaghị gbanyụọ ya, mgbe nke ahụ gasịrị, nnọkọ ga-amalite ịrụ ọrụ. Naanị ihe fọdụrụ bụ itinye akpa ahụ nwere mcrouter n'ime pọd nwere PHP!

nkwubi

Yabụ, site na naanị mgbanwe akụrụngwa anyị nwere ike dozie nsogbu ahụ: edozila nsogbu ahụ na nnabata mmejọ memcached, yana abawanyela ntụkwasị obi nke nchekwa nchekwa. Na mgbakwunye na uru doro anya maka ngwa ahụ, nke a nyere ohere maka ịmegharị mgbe ị na-arụ ọrụ n'elu ikpo okwu: mgbe ihe niile nwere ebe nchekwa, ndụ onye nchịkwa na-adị mfe karị. Ee, usoro a nwekwara ihe ndọghachi azụ ya, ọ nwere ike ịdị ka "crutch", ma ọ bụrụ na ọ na-echekwa ego, na-eli nsogbu ahụ ma ghara ime ka ndị ọhụrụ - gịnị kpatara ya?

PS

Gụọkwa na blọọgụ anyị:

isi: www.habr.com

Tinye a comment