Ho sebelisa mcrouter ho lekanya memcached ka holimo

Ho sebelisa mcrouter ho lekanya memcached ka holimo

Ho nts'etsapele merero e boima ka puo efe kapa efe ho hloka mokhoa o ikhethileng le ts'ebeliso ea lisebelisoa tse ikhethileng, empa ha ho tluoa lits'ebetsong ho PHP, boemo bo ka mpefala hoo o tlamehang ho nts'etsapele, mohlala, sesebelisoa sa hau sa kopo. Lengolong lena re tla bua ka bohloko bo tloaelehileng ka ho ajoa ha nako ea polokelo le caching ea data ho memcached le kamoo re rarolotseng mathata ana kateng morerong o le mong oa "ward".

Mohale oa ketsahalo ke kopo ea PHP e thehiloeng ho moralo oa symfony 2.3, o sa kenyelletsoeng ho hang mererong ea khoebo ea ho ntlafatsa. Ntle le polokelo e tloaelehileng ea seshene, morero ona o sebelisitse ka botlalo leano la "caching tsohle". ka memcached: likarabo tsa likopo ho database le li-server tsa API, lifolakha tse fapaneng, linotlolo tsa ho hokahanya ts'ebetso ea khoutu le tse ling tse ngata. Boemong bo joalo, ho senyeha ha memcached ho ba kotsi ts'ebetsong ea kopo. Ho phaella moo, tahlehelo ea cache e lebisa liphellong tse tebileng: DBMS e qala ho phatloha ka seams, litšebeletso tsa API li qala ho thibela likopo, joalo-joalo. Ho tsitsisa boemo ho ka nka metsotso e mashome, 'me nakong ena tšebeletso e tla lieha haholo kapa e sa fumanehe ka ho feletseng.

Re ne re hloka ho fana bokgoni ba ho sekamela tshebediso ka matsapa a manyane, ke. ka liphetoho tse fokolang ho khoutu ea mohloli le ts'ebetso e feletseng e bolokiloeng. Etsa hore cache e se ke ea hanyetsa feela mefokolo, empa hape leka ho fokotsa tahlehelo ea data ho eona.

Phoso ke efe ka memcached ka boeona?

Ka kakaretso, katoloso ea memcached bakeng sa PHP e ts'ehetsa data le polokelo ea nako ka ntle ho lebokose. Mochine oa hashing oa bohlokoa o tsitsitseng o u lumella ho aba lintlha ka mokhoa o ts'oanang ho li-server tse ngata, ka mokhoa o ikhethileng ho sebetsana le senotlolo se seng le se seng ho seva se itseng se tsoang sehlopheng, 'me lisebelisoa tse hahiloeng ka har'a li-failover li netefatsa hore ho na le phumaneho e phahameng ea tšebeletso ea caching (empa, ka bomalimabe, ha ho data).

Lintho li ntlafala hanyane ka polokelo ea nako: o ka khona ho hlophisa memcached.sess_number_of_replicas, ka lebaka la hore data e tla bolokoa ho li-server tse 'maloa ka nako e le' ngoe, 'me haeba ketsahalo e le' ngoe ea memcached e hlōleha, data e tla fetisoa ho tsoa ho ba bang. Leha ho le joalo, haeba seva e khutla inthaneteng ntle le data (joalo ka ha hangata e etsahala kamora ho qala bocha), linotlolo tse ling li tla abuoa molemong oa eona. Ha e le hantle sena se tla bolela tahlehelo ea data ea nako, kaha ha ho na mokhoa oa ho "ea" setšoantšong se seng haeba u fosa.

Lisebelisoa tse tloaelehileng tsa laebrari li lebisitsoe haholo-holo ho tshekaletseng scaling: li u lumella ho eketsa cache ho saese e kholo le ho fana ka phihlello ho eona ho tsoa ho khoutu e ts'oaroang ho li-server tse fapaneng. Leha ho le joalo, maemong a rona, palo ea data e bolokiloeng ha e fete li-gigabyte tse 'maloa,' me ts'ebetso ea node e le 'ngoe kapa tse peli e lekane. Ka hona, lisebelisoa feela tse sebetsang tsa maemo e ka ba ho netefatsa boteng ba memcached ha u ntse u boloka sebaka se le seng sa cache maemong a ho sebetsa. Leha ho le joalo, ho ne ho sa khonehe ho sebelisa monyetla ona esita le monyetla ona ... Mona ke habohlokoa ho hopola mehleng ea khale ea moralo o sebelisitsoeng morerong ona, ke ka lebaka leo ho neng ho sa khonehe ho fumana kopo ho sebetsa le letamo la li-server. Hape re se ke ra lebala ka tahlehelo ea data ea seshene: leihlo la moreki le ile la sisinyeha ho tsoa ho ts'ebetso e kholo ea basebelisi.

Hantle-ntle ho ne ho hlokahala katiso ya direkoto ka memcached le bypassing replicas ha ho ka ba le phoso kapa phoso. E re thusitse ho kenya tšebetsong leano lena mcrouter.

mcrouter

Ena ke router ea memcached e ntlafalitsoeng ke Facebook ho rarolla mathata a eona. E tšehetsa memcached text protocol, e lumellang sekala memcached tse hlomamisitsoeng ho isa tekanyong e hlanyang. Tlhaloso e qaqileng ea mcrouter e ka fumanoa ho phatlalatso ena. Har'a lintho tse ling tshebetso e pharaletseng e ka etsa seo re se hlokang:

  • pheta rekoto;
  • etsa fallback ho li-server tse ling sehlopheng haeba phoso e etsahala.

Kena mosebetsing!

tlhophiso ea mcrouter

Ke tla ea ka kotloloho ho 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"
       ]
     }
   }
 }
}

Ke hobane'ng ha matamo a mararo? Ke hobane'ng ha li-server li phetoa? A re bone hore na e sebetsa joang.

  • Ka tlhophiso ena, mcrouter e khetha tsela eo kopo e tla romelloa ho eona ho latela taelo ea kopo. Mohlankana o mmolella sena OperationSelectorRoute.
  • FUMANA likopo li ea ho mohlokomeli RandomRoutee ikgethelang letamo kapa tsela hara dintho tse ngatanyana children. Karolo e 'ngoe le e' ngoe ea sehlopha sena ka ho latellana e sebetsa MissFailoverRoute, e tla feta ka seva e 'ngoe le e' ngoe ka letamong ho fihlela e fumana karabo ka data, e tla khutlisetsoa ho mofani.
  • Haeba re ne re e sebelisa feela MissFailoverRoute ka letamo la li-server tse tharo, joale likōpo tsohle li ne li tla tla pele ho mohlala oa pele oa memcached, 'me ba bang kaofela ba ne ba tla fumana likōpo ka mokhoa o setseng ha ho se na data. Mokhoa o joalo o ka lebisa ho mojaro o feteletseng ho seva sa pele lenaneng, kahoo ho ile ha etsoa qeto ea ho hlahisa matamo a mararo a nang le liaterese ka tatellano e fapaneng le ho li khetha ka mokhoa o sa reroang.
  • Likopo tse ling kaofela (mme sena ke rekoto) li sebetsoa ka ho sebelisoa AllMajorityRoute. Motho enoa o romela likopo ho li-server tsohle tse ka letamong mme o emetse likarabo ho tsoa bonyane N/2 + 1 ea tsona. Ho tloha ho sebelisoa AllSyncRoute bakeng sa ho ngola ts'ebetso e ne e tlameha ho tloheloa, kaha mokhoa ona o hloka karabelo e ntle ho tsoa ho всех li-server sehlopheng - ho seng joalo e tla khutla SERVER_ERROR. Leha mcrouter e tla eketsa datha ho li-cache tse fumanehang, mosebetsi oa ho bitsa PHP e tla khutlisa phoso mme e tla hlahisa tsebiso. AllMajorityRoute ha e thata hakaalo 'me e lumella ho fihlela halofo ea lihlopha hore li tlosoe mosebetsing ntle le mathata a hlalositsoeng ka holimo.

Bothata bo ka sehloohong Morero ona ke hore haeba ho se na data ka har'a cache, joale bakeng sa kopo e 'ngoe le e' ngoe e tsoang ho moreki N likopo tsa ho memcache li tla etsoa - ho ho bohle li-server ka letamo. Re ka fokotsa palo ea li-server ka matamo, mohlala, ho tse peli: ho tela botšepehi ba polokelo, re fumanaоlebelo le phahameng le mojaro o fokolang ho tloha ho likopo ho isa ho linotlolo tse sieo.

NB: U ka boela ua fumana lihokelo tsa bohlokoa bakeng sa ho ithuta mcrouter litokomane ho wiki и litaba tsa morero (ho kenyeletsoa le tse koetsoeng), tse emelang polokelo eohle ea litlhophiso tse fapaneng.

Ho aha le ho tsamaisa mcrouter

Kopo ea rona (le memcached ka boeona) e sebetsa ho Kubernetes - ka hona, mcrouter le eona e teng moo. Bakeng sa kopano ea setshelo re sebelisa werf, config e tla shebahala tjena:

NB: Mananeo a fanoeng sengolong a phatlalalitsoe sebakeng sa polokelo 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)

... 'me u seke Chate ea helm. Ntho e khahlisang ke hore ho na le jenereithara ea config feela e ipapisitseng le palo ea likopi (haeba ho na le motho ea nang le khetho ea laconic le e ntle haholoanyane, e arolelane maikutlong):

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

Re e kenya sebakeng sa liteko ebe re hlahloba:

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

Ho batla mongolo oa phoso ha hoa fana ka liphetho, empa bakeng sa potso "mcrouter php"Ka pele ho ne ho e-na le bothata ba khale ka ho fetisisa bo sa rarolloang ba morero - ho hloka tshehetso memcached binary protocol.

NB: ASCII protocol in memcached e lieha ho feta ea binary, 'me mekhoa e tloaelehileng ea hashing ea bohlokoa e tsitsitseng e sebetsa feela le binary protocol. Empa sena ha se hlahise mathata bakeng sa nyeoe e itseng.

Leqheka le ka mokotleng: sohle seo o lokelang ho se etsa ke ho fetohela ho protocol ea ASCII mme tsohle li tla sebetsa .... Leha ho le joalo, tabeng ena, tloaelo ea ho batla likarabo ka litokomane ho php.net o bapetse motlae o sehloho. U ke ke ua fumana karabo e nepahetseng moo ... ntle le haeba, ha e le hantle, u phetla ho fihlela qetellong, moo karolong eo "Lintlha tse kentsoeng ke basebelisi" e tla tšepahala le karabo e fokolang ka tsela e hlokang toka.

E, khetho e nepahetseng ea lebitso ke memcached.sess_binary_protocol. E tlameha ho holofala, ka mor'a moo mananeo a tla qala ho sebetsa. Se setseng ke ho kenya setshelo ka mcrouter ka har'a pod e nang le PHP!

fihlela qeto e

Kahoo, ka liphetoho tsa meralo feela re khonne ho rarolla bothata: taba e nang le mamello ea memcached e rarollotsoe, 'me ho tšepahala ha polokelo ea cache ho eketsehile. Ho phaella melemo e totobetseng ea kopo, sena se ile sa fana ka sebaka sa ho tsamaisa ha u sebetsa sethaleng: ha likarolo tsohle li na le polokelo, bophelo ba mookameli bo nolofalitsoe haholo. E, mokhoa ona o boetse o na le mathata a oona, o ka 'na oa shebahala joaloka "crutch", empa haeba o boloka chelete, o pata bothata mme ha o bake tse ncha - hobane'ng?

PES

Bala hape ho blog ea rona:

Source: www.habr.com

Eketsa ka tlhaloso