Kugwiritsa ntchito mcrouter kukulitsa memcached mopingasa

Kugwiritsa ntchito mcrouter kukulitsa memcached mopingasa

Kupanga mapulojekiti olemetsa kwambiri m'chilankhulo chilichonse kumafuna njira yapadera komanso kugwiritsa ntchito zida zapadera, koma zikafika pakugwiritsa ntchito mu PHP, zinthu zitha kukulirakulira kotero kuti muyenera kupanga, mwachitsanzo, seva yanu yofunsira. M'nkhaniyi tikambirana za ululu wodziwika bwino ndi kugawidwa kwa gawo losungirako ndi kusunga deta mu memcached ndi momwe tinathetsera mavutowa mu "ward" imodzi.

Ngwazi yamwambowu ndi pulogalamu ya PHP yozikidwa pa symfony 2.3 chimango, chomwe sichinaphatikizidwe konse mumalingaliro abizinesi kuti asinthe. Kuphatikiza pa kusungirako kokhazikika kwa gawoli, polojekitiyi idagwiritsidwa ntchito mokwanira "Caching chirichonse". mu memcached: mayankho ku zopempha ku database ndi ma seva a API, mbendera zosiyanasiyana, maloko olumikizirana ma code ndi zina zambiri. Zikatero, kuwonongeka kwa memcached kumakhala koopsa pakugwiritsa ntchito pulogalamuyo. Kuonjezera apo, kutayika kwa cache kumabweretsa zotsatira zoopsa: DBMS imayamba kuphulika pa seams, mautumiki a API amayamba kuletsa zopempha, ndi zina zotero. Kukhazikitsa zinthu kutha kutenga mphindi khumi, ndipo panthawiyi ntchitoyo idzakhala yodekha kapena yosapezeka.

Tinkafunika kupereka kuthekera kopitilira muyeso wogwiritsa ntchito movutikira pang'ono,ndi. ndi kusintha kochepa kwa code code ndi ntchito zonse zosungidwa. Pangani posungira osati kugonjetsedwa ndi zolephera, komanso yesetsani kuchepetsa imfa deta kwa izo.

Cholakwika ndi chiyani ndi memcached yokha?

Mwambiri, kukulitsa kwa memcached kwa PHP kumathandizira kugawidwa kwa data ndi kusungidwa kwa gawolo m'bokosi. Makina ogwiritsira ntchito ma key hashing amakulolani kuti muyike deta pa ma seva ambiri, mwapadera kuyang'ana fungulo lililonse ku seva inayake kuchokera pagulu, ndi zida zowonongeka zimatsimikizira kupezeka kwakukulu kwa utumiki wa caching (koma, mwatsoka, palibe deta).

Zinthu zili bwinoko pang'ono ndi kusungirako gawo: mutha kukonza memcached.sess_number_of_replicas, chifukwa cha zomwe deta idzasungidwa pa ma seva angapo nthawi imodzi, ndipo pakagwa vuto limodzi la memcached, deta idzasamutsidwa kuchokera kwa ena. Komabe, ngati seva ibwereranso pa intaneti popanda deta (monga momwe zimachitikira pambuyo poyambitsanso), makiyi ena adzagawidwanso m'malo mwake. Ndipotu izi zidzatanthauza kutayika kwa data ya gawo, popeza palibe njira yopitira ku chithunzi china ngati mwaphonya.

Standard laibulale zida umalimbana makamaka yopingasa makulitsidwe: amakulolani kuti muwonjezere posungira kukula kwake kwakukulu ndikupereka mwayi wofikirako kuchokera ku code yomwe imakhala pa maseva osiyanasiyana. Komabe, m'mikhalidwe yathu, kuchuluka kwa deta yosungidwa sikudutsa ma gigabytes angapo, ndipo ntchito ya node imodzi kapena ziwiri ndizokwanira. Chifukwa chake, zida zokhazo zofunikira zitha kukhala zowonetsetsa kupezeka kwa memcached pomwe mukusunga kachedwe kamodzi kogwira ntchito. Komabe, sikunali kotheka kupezerapo mwayi ngakhale mwayi uwu ... Apa ndi bwino kukumbukira zakale za chimango chomwe chinagwiritsidwa ntchito mu polojekitiyi, chifukwa chake kunali kosatheka kuti pulogalamuyo igwire ntchito ndi dziwe la ma seva. Tisaiwalenso za kutayika kwa data ya gawo: diso la kasitomala lidagwedezeka kuchokera pakutuluka kwakukulu kwa ogwiritsa ntchito.

Moyenera zinali zofunika kubwerezedwanso kwa zolembedwa mu memcached ndi bypassing replicas pakalakwa kapena kulakwitsa. Yatithandiza kukhazikitsa njira imeneyi mcrouter.

mcrouter

Ichi ndi rauta memcached opangidwa ndi Facebook kuthetsa mavuto ake. Imathandizira memcached text protocol, yomwe imalola masikelo memcached makhazikitsidwe kumlingo wamisala. Kufotokozera mwatsatanetsatane wa mcrouter angapezeke mu chilengezo ichi. Mwa zina ntchito zambiri ikhoza kuchita zomwe tikufuna:

  • kubwereza mbiri;
  • bwererani ku ma seva ena pagulu ngati cholakwika chichitika.

Pitani kuntchito!

mcrouter kasinthidwe

Ndipita molunjika ku 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"
       ]
     }
   }
 }
}

Chifukwa chiyani ma dziwe atatu? Chifukwa chiyani ma seva amabwerezedwa? Tiyeni tiwone momwe zimagwirira ntchito.

  • Mu kasinthidwe uku, mcrouter amasankha njira yomwe pempho lidzatumizidwa kutengera lamulo la pempho. Mnyamatayo anamuuza izi OperationSelectorRoute.
  • PEZA zopempha zipite kwa wothandizira RandomRouteyomwe imasankha dziwe kapena njira mwachisawawa pakati pa zinthu zingapo children. Chilichonse cha gulu ili ndi chothandizira MissFailoverRoute, yomwe idzadutsa pa seva iliyonse mu dziwe mpaka italandira yankho ndi deta, yomwe idzabwezeredwa kwa kasitomala.
  • Ngati tigwiritsa ntchito zokha MissFailoverRoute ndi dziwe la ma seva atatu, ndiye zopempha zonse zimabwera poyamba pa chitsanzo choyamba cha memcached, ndipo ena onse adzalandira zopempha motsalira pamene palibe deta. Njira yotereyi ingayambitse katundu wambiri pa seva yoyamba pamndandanda, kotero adaganiza kupanga maiwe atatu okhala ndi maadiresi motsatizana zosiyanasiyana ndikusankha mwachisawawa.
  • Zopempha zina zonse (ndipo iyi ndi mbiri) zimakonzedwa pogwiritsa ntchito AllMajorityRoute. Wothandizira uyu amatumiza zopempha kwa ma seva onse omwe ali padziwe ndikudikirira mayankho kuchokera kwa osachepera N/2 + 1 mwa iwo. Kuyambira ntchito AllSyncRoute chifukwa kulemba ntchito anayenera kusiyidwa, popeza njira imeneyi amafuna kuyankha zabwino kuchokera всСх ma seva mu gulu - apo ayi adzabwerera SERVER_ERROR. Ngakhale mcrouter idzawonjezera zomwe zilipo, ntchito yoyitanitsa PHP adzabwezera cholakwika ndipo adzapereka chidziwitso. AllMajorityRoute sizovuta kwambiri ndipo zimalola kuti theka la magawo achotsedwe popanda zovuta zomwe tafotokozazi.

Vuto lalikulu Chiwembu ichi ndi chakuti ngati palibe deta mu cache, ndiye kuti pempho lililonse kuchokera kwa kasitomala N zopempha kuti memcached zidzachitidwa - kuti kwa onse ma seva mu dziwe. Titha kuchepetsa kuchuluka kwa ma seva m'madziwe, mwachitsanzo, mpaka awiri: kupereka kudalirika kosungirako, timapeza.ΠΎliwiro lapamwamba komanso katundu wocheperako kuchokera ku zopempha kupita ku makiyi akusowa.

NB: Mukhozanso kupeza maulalo othandiza kuphunzira mcrouter zolemba pa wiki ΠΈ nkhani za polojekiti (kuphatikiza zotsekedwa), zomwe zikuyimira nkhokwe yonse ya masinthidwe osiyanasiyana.

Kumanga ndi kuthamanga mcrouter

Ntchito yathu (ndi memcached yokha) imayendera Kubernetes - motero, mcrouter ilinso pamenepo. Za msonkhano wa chidebe timagwiritsa ntchito werf, config yomwe idzawonekere motere:

NB: Zolemba zomwe zaperekedwa m'nkhaniyi zimasindikizidwa m'malo osungira pansi / 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)

... ndi jambulani izo Tchati cha helm. Chosangalatsa ndichakuti pali jenereta yokhayo yotengera kuchuluka kwa zofananira (ngati wina ali ndi njira ya laconic komanso yokongola kwambiri, gawani mu ndemanga):

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

Timaziyika m'malo oyesera ndikuwunika:

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

Kusaka mawu olakwika sikunapereke zotsatira, koma pafunso "mcrouter php"Kutsogolo kunali vuto lakale kwambiri lomwe silinathetsedwe - kusowa thandizo protocol ya binary yolumikizidwa.

NB: Protocol ya ASCII mu memcached ndiyochedwa kuposa ya binary, ndipo njira zofananira zamakiyi osasinthika zimagwira ntchito ndi protocol ya binary. Koma izi sizimayambitsa mavuto pa nkhani inayake.

Chinyengo chili m'thumba: zomwe muyenera kuchita ndikusinthira ku protocol ya ASCII ndipo zonse zigwira .... Komabe, mu nkhani iyi, chizolowezi kufunafuna mayankho mu zolemba pa php.net adasewera nthabwala yankhanza. Simungapeze yankho lolondola pamenepo ... pokhapokha, ndithudi, mupukuta mpaka kumapeto, komwe kuli gawolo "Zolemba zomwe ogwiritsa ntchito adapereka" adzakhala okhulupirika ndi kuyankha mopanda chilungamo.

Inde, njira yoyenera dzina ndi memcached.sess_binary_protocol. Iyenera kuyimitsidwa, pambuyo pake magawowo ayamba kugwira ntchito. Chotsalira ndikuyika chidebe chokhala ndi mcrouter mu pod ndi PHP!

Pomaliza

Chifukwa chake, ndi kusintha kwachitukuko kokha tinatha kuthana ndi vutoli: vuto la kulekerera zolakwika za memcached lathetsedwa, ndipo kudalirika kwa kusungirako cache kwawonjezeka. Kuphatikiza pa zabwino zowonekera pakugwiritsa ntchito, izi zidapereka mwayi wowongolera pogwira ntchito papulatifomu: pomwe zigawo zonse zili ndi nkhokwe, moyo wa woyang'anira umakhala wosavuta. Inde, njira iyi imakhalanso ndi zovuta zake, zikhoza kuwoneka ngati "ndodo", koma ngati zimasunga ndalama, zimakwirira vutoli ndipo sizimayambitsa zatsopano - bwanji?

PS

Werenganinso pa blog yathu:

Source: www.habr.com

Kuwonjezera ndemanga