Mampiasa mcrouter hanamafisana ny memcached horizontally

Mampiasa mcrouter hanamafisana ny memcached horizontally

Ny fampivoarana tetikasa be entana amin'ny fiteny rehetra dia mitaky fomba fiasa manokana sy fampiasana fitaovana manokana, fa raha ny momba ny fampiharana amin'ny PHP dia mety hiharatsy ny toe-javatra ka tsy maintsy mivoatra ianao, ohatra, mpizara fampiharana manokana. Amin'ity fanamarihana ity dia hiresaka momba ny fanaintainana mahazatra miaraka amin'ny fitehirizana fivoriana fizarana sy ny cache data amin'ny memcached ary ny fomba namaha ireo olana ireo tamin'ny tetikasa "paroasy" iray.

Ny mahery fo amin'ity fotoana ity dia fampiharana PHP mifototra amin'ny rafitra symfony 2.3, izay tsy tafiditra ao amin'ny drafitra fandraharahana havaozina. Ho fanampin'ny fitahirizana fivoriana mahazatra dia nampiasa tanteraka ity tetikasa ity politika "caching everything". ao amin'ny memcached: valinteny amin'ny fangatahana ny angon-drakitra sy ny mpizara API, saina isan-karazany, hidin-trano ho an'ny fampifanarahana ny famonoana kaody sy ny maro hafa. Amin'ny toe-javatra toy izany, ny fahatapahan'ny memcached dia mahafaty ny fiasan'ny fampiharana. Ankoatr'izay, ny fahaverezan'ny cache dia miteraka voka-dratsy lehibe: manomboka mipoaka ny DBMS, manomboka mandrara ny fangatahana ny serivisy API, sns. Mety haharitra am-polony minitra ny fanamafisana ny toe-draharaha, ary mandritra io fotoana io dia hiadana be na tsy ho afaka tanteraka ny serivisy.

Nila nanome izahay ny fahafahana mitsivalana ny fampiharana amin'ny ezaka kely, i.e. miaraka amin'ny fanovana kely indrindra amin'ny kaody loharano sy ny fiasa feno voatahiry. Ataovy ny cache tsy mahatohitra ny tsy fahombiazana, fa koa miezaka ny hanamaivanana ny data very avy amin'izany.

Inona no tsy mety amin'ny memcached mihitsy?

Amin'ny ankapobeny, ny fanitarana memcached ho an'ny PHP dia manohana ny angon-drakitra zaraina sy ny fitahirizana fivoriana ivelan'ny boaty. Ny mekanika ho an'ny hashing fanalahidy tsy miovaova dia ahafahanao mizara data mitovy amin'ny servisy maro, mamaly manokana ny fanalahidy manokana tsirairay amin'ny mpizara manokana avy amin'ny vondrona, ary ny fitaovana failover ao anatiny dia miantoka ny fisian'ny serivisy caching (saingy, indrisy, tsy misy data).

Tsara kokoa ny zavatra miaraka amin'ny fitahirizana session: azonao atao ny manitsy memcached.sess_number_of_replicas, izay vokatr'izany dia hotehirizina amin'ny lohamilina maromaro indray mandeha ny angon-drakitra, ary raha sendra ny tsy fahombiazan'ny ohatra iray memcached dia hafindra avy amin'ny hafa ny angona. Na izany aza, raha miverina an-tserasera tsy misy angon-drakitra ny mpizara (toy ny mitranga matetika aorian'ny famerenana indray), dia haverina hozaraina ho azy ny sasany amin'ireo fanalahidy. Raha ny marina dia midika izany fahaverezan'ny angona fivoriana, satria tsy misy fomba "mandeha" mankany amin'ny kopia hafa raha sendra misy diso.

Ny fitaovana famakiam-boky mahazatra dia mikendry indrindra marindrano scaling: mamela anao hampitombo ny cache amin'ny habe goavam-be izy ireo ary manome fidirana amin'izany avy amin'ny code nampiantranoina amin'ny lohamilina samihafa. Na izany aza, amin'ny toe-javatra misy antsika, ny habetsaky ny angon-drakitra voatahiry dia tsy mihoatra ny gigabytes maromaro, ary ny fahombiazan'ny nodes iray na roa dia ampy. Noho izany, ny hany fitaovana manara-penitra ilaina dia ny miantoka ny fisian'ny memcached nefa mitazona ohatra cache iray farafahakeliny amin'ny toe-javatra miasa. Na izany aza, tsy azo natao ny nanararaotra na dia izao fotoana izao aza ... Eto dia ilaina ny mampahatsiahy ny fahagolan'ny rafitra ampiasaina amin'ny tetikasa, ka izany no nahatonga ny fampiharana hiasa amin'ny dobo mpizara. Aza hadinoina koa ny fahaverezan'ny angon-drakitra fivoriana: nikisaka ny mason'ny mpanjifa noho ny fidiran'ny mpampiasa.

Tena ilaina izany famerenan'ny rakitra ao amin'ny replika memcached sy mandalo raha misy hadisoana na fahadisoana. Nanampy anay hampihatra ity paikady ity mcrouter.

mcrouter

Ity dia router memcached novolavolain'ny Facebook hamahana ny olana. Izy io dia manohana ny protocol text memcached, izay mamela fametrahana skala memcached ho adala proportions. Ny famaritana amin'ny antsipiriany momba ny mcrouter dia azo jerena ao ity fanambarana ity. Ankoatra ny zavatra hafa malalaka fiasa afaka manao izay ilaintsika izy:

  • replicate record;
  • miverena any amin'ny mpizara hafa ao amin'ny vondrona raha misy hadisoana.

Midira amin'ny orinasa!

fikirakirana mcrouter

Hankany amin'ny config aho:

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

Nahoana no dobo telo? Nahoana no miverimberina ny mpizara? Andeha hojerentsika ny fomba fiasan'izy io.

  • Amin'ity fanamafisana ity, mcrouter dia mifidy ny lalana handefasana ny fangatahana mifototra amin'ny baiko fangatahana. Lazain'ilay bandy azy izany OperationSelectorRoute.
  • Mandehana any amin'ny mpitantana ny fangatahana GET RandomRouteizay mifidy kisendrasendra dobo na lalana eo amin'ireo zavatra array children. Ny singa tsirairay amin'ity array ity dia tompon'andraikitra MissFailoverRoute, izay handeha amin'ny mpizara tsirairay ao amin'ny dobo mandra-pahazoany valiny miaraka amin'ny angona, izay haverina amin'ny mpanjifa.
  • Raha nampiasa manokana izahay MissFailoverRoute miaraka amin'ny dobo mpizara telo, avy eo ny fangatahana rehetra dia ho tonga voalohany amin'ny ohatra memcached voalohany, ary ny ambiny dia hahazo fangatahana amin'ny fototra sisa rehefa tsy misy angona. Ny fomba fiasa toy izany dia mety hitarika amin'ny entana be loatra amin'ny mpizara voalohany amin'ny lisitra, noho izany dia nanapa-kevitra ny hamorona dobo telo miaraka amin'ny adiresy amin'ny filaharana samihafa ary hifidy azy ireo kisendrasendra.
  • Ny fangatahana hafa rehetra (ary ity dia firaketana) dia karakaraina amin'ny fampiasana AllMajorityRoute. Ity mpitantana ity dia mandefa fangatahana amin'ny mpizara rehetra ao amin'ny dobo ary miandry valiny avy amin'ny N/2 + 1 farafaharatsiny amin'izy ireo. Avy amin'ny fampiasana AllSyncRoute fa ny asa fanoratana dia tsy maintsy nilaozana, satria io fomba io dia mitaky valiny tsara avy amin'ny всех mpizara ao amin'ny vondrona - raha tsy izany dia hiverina SERVER_ERROR. Na dia hampiditra ny angon-drakitra amin'ny cache misy aza ny mcrouter, ny fiantsoana PHP miasa hamerina fahadisoana ary hiteraka filazana. AllMajorityRoute dia tsy dia hentitra loatra ary mamela hatramin'ny antsasaky ny vondrona esorina amin'ny serivisy tsy misy olana voalaza etsy ambony.

Ny fatiantoka lehibe Ity tetika ity dia ny hoe raha tena tsy misy angon-drakitra ao amin'ny cache, dia ho tanterahina ny fangatahana tsirairay avy amin'ny mpanjifa N fangatahana memcached - mba ho an'ny rehetra mpizara ao anaty dobo. Afaka mampihena ny isan'ny mpizara ao anaty dobo isika, ohatra, ho roa: manao sorona ny fahatokisana fitahirizana, mahazoоhafainganam-pandeha ambony sy ambany kokoa ny entana avy amin'ny fangatahana ho amin'ny fanalahidy tsy hita.

NB: Azonao atao koa ny mahita rohy mahasoa hianarana mcrouter antontan-taratasy ao amin'ny wiki и olan'ny tetikasa (anisan'izany ny mihidy), maneho trano fitehirizam-bokatra iray manontolo amin'ny lamina isan-karazany.

Manorina sy mihazakazaka mcrouter

Ny fampiharana anay (sy ny memcached ny tenany) dia mandeha ao amin'ny Kubernetes - araka izany dia misy ihany koa ny mcrouter. HO AN'NY fivorian'ny kaontenera ampiasainay werf, ny config ho toy izao:

NB: Ny lisitra nomena ao amin'ny lahatsoratra dia navoaka tao amin'ny tahiry 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)

... ary ataovy sketch izany Sarin'ny familiana. Ny mahaliana dia tsy misy afa-tsy ny config generator mifototra amin'ny isan'ny kopia (raha misy manana safidy laconic sy kanto kokoa dia zarao amin'ny fanehoan-kevitra):

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

Atsofohy amin'ny tontolon'ny fitsapana izany ary manamarina:

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

Ny fikarohana ny lahatsoratry ny hadisoana dia tsy nitondra valiny, fa ny fanontaniana "microuter php"Teo amin'ny lohalaharana no olana tranainy indrindra tsy voavaha tamin'ny tetikasa - tsy fahampian'ny fanohanana protocol binary memcached.

NB: Ny protocole ASCII ao amin'ny memcached dia miadana kokoa noho ny iray, ary ny fomba mahazatra amin'ny fametahana fanalahidy tsy miovaova dia tsy miasa afa-tsy amin'ny protocol binary. Saingy tsy miteraka olana amin'ny tranga manokana izany.

Ny fika dia ao anaty kitapo: ny hany ataonao dia ny mifamadika amin'ny protocol ASCII dia handeha ny zava-drehetra.... Na izany aza, amin'ity tranga ity, ny fahazarana mitady valiny ao antontan-taratasy ao amin'ny php.net nanao vazivazy masiaka. Tsy hahita ny valiny marina ianao eo ... raha tsy hoe, mazava ho azy, ianao dia mihodinkodina hatramin'ny farany, izay ao amin'ny fizarana "Naoty naorin'ny mpampiasa" ho mahatoky ary valiny tsy ara-drariny tsy navoaka.

Eny, ny anarana safidy marina dia memcached.sess_binary_protocol. Tokony ho kilemaina izy io, ary aorian'izay dia hanomboka hiasa ny session. Ny hany sisa tavela dia ny fametrahana ny kaontenera misy mcrouter ao anaty pod misy PHP!

famaranana

Noho izany, tamin'ny fanovana fotodrafitrasa fotsiny dia afaka namaha ny olana izahay: voavaha ny olana momba ny fandeferana amin'ny fandeferana memcached, ary nitombo ny fahatokisana ny fitahirizana cache. Ho fanampin'ny tombony mazava ho an'ny fampiharana, dia nanome toerana ho an'ny fihetsehana izany rehefa miasa eo amin'ny lampihazo: rehefa manana tahiry ny singa rehetra, ny fiainan'ny mpitantana dia tena tsotra. Eny, io fomba io koa dia manana ny tsy fahampiana, mety ho toy ny "crutch", fa raha mitahiry vola, mandevina ny olana ary tsy miteraka vaovao - maninona?

Sal

Vakio ihany koa ao amin'ny bilaoginay:

Source: www.habr.com

Add a comment