Yin amfani da mcrouter don daidaita ma'auni a kwance

Yin amfani da mcrouter don daidaita ma'auni a kwance

Haɓaka ayyuka masu girma a cikin kowane harshe yana buƙatar tsari na musamman da kuma amfani da kayan aiki na musamman, amma idan ya zo ga aikace-aikace a cikin PHP, yanayin zai iya ƙara tsanantawa cewa dole ne ku haɓaka, misali, uwar garken aikace-aikacen kansa. A cikin wannan bayanin za mu yi magana game da ciwon da aka saba da shi tare da rarraba zaman ajiya da adana bayanai a cikin memcached da kuma yadda muka magance waɗannan matsalolin a cikin aikin "ward" guda ɗaya.

Jarumin bikin shine aikace-aikacen PHP dangane da tsarin symfony 2.3, wanda kwata-kwata ba a haɗa shi cikin shirye-shiryen kasuwanci don sabuntawa ba. Baya ga daidaitaccen ma'ajin zaman, wannan aikin ya yi cikakken amfani da shi manufar "caching everything". a cikin memcached: martani ga buƙatun zuwa bayanan bayanai da sabar API, tutoci daban-daban, makullai don aiwatar da lambar aiki tare da ƙari mai yawa. A irin wannan yanayin, ɓarna na memcached ya zama mai mutuwa ga aikin aikace-aikacen. Bugu da ƙari, asarar cache yana haifar da sakamako mai tsanani: DBMS ya fara fashe a cikin sutura, ayyukan API sun fara hana buƙatun, da dai sauransu. Tsayar da lamarin na iya ɗaukar dubun mintuna, kuma a wannan lokacin sabis ɗin zai kasance da jinkirin jinkiri ko babu gaba ɗaya.

Muna buƙatar samarwa da ikon a kwance auna aikace-aikacen tare da ƙaramin ƙoƙari, i.e. tare da ƙananan canje-canje zuwa lambar tushe da cikakken aiki da aka kiyaye. Yi cache ba wai kawai juriya ga gazawa ba, har ma da ƙoƙarin rage asarar bayanai daga gare ta.

Menene laifin memcached kanta?

Gabaɗaya, haɓakar memcached don PHP yana goyan bayan rarraba bayanai da ajiyar lokaci daga cikin akwatin. Tsarin madaidaicin maɓalli na hashing yana ba ku damar daidaita bayanai akan sabar da yawa, musamman magance kowane takamaiman maɓalli ga takamaiman sabar daga rukunin, da kayan aikin gazawar da aka gina a ciki suna tabbatar da wadatar sabis ɗin caching (amma, abin takaici, babu data).

Abubuwa sun ɗan fi kyau tare da ajiyar lokaci: kuna iya saitawa memcached.sess_number_of_replicas, a sakamakon haka za a adana bayanan a kan sabar da yawa a lokaci ɗaya, kuma idan wani misali na memcached ya gaza, za a canja wurin bayanan daga wasu. Duk da haka, idan uwar garken ya dawo kan layi ba tare da bayanai ba (kamar yadda yakan faru bayan sake kunnawa), za a sake rarraba wasu maɓallan don dacewa. A gaskiya wannan zai nufi asarar bayanan zaman, Tun da babu wata hanya ta “tafi” zuwa wani kwafi idan an rasa.

Daidaitaccen kayan aikin ɗakin karatu ana nufin su ne a kwance scaling: suna ba ka damar ƙara cache zuwa manyan girma dabam da ba da damar yin amfani da shi daga lambar da aka shirya akan sabar daban-daban. Duk da haka, a cikin halin da ake ciki, adadin da aka adana ba ya wuce gigabytes da yawa, kuma aikin nodes ɗaya ko biyu ya isa sosai. Saboda haka, ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun kayan aikin na iya zama don tabbatar da samuwar memcached yayin kiyaye aƙalla misalin cache ɗaya a yanayin aiki. Duk da haka, ba zai yiwu a yi amfani da wannan damar ba ... A nan yana da daraja tunawa da tsohuwar tsarin da aka yi amfani da shi a cikin aikin, wanda shine dalilin da ya sa ba zai yiwu ba don samun aikace-aikacen yin aiki tare da tafkin sabobin. Kada kuma mu manta game da asarar bayanan zaman: idon abokin ciniki ya kaɗa daga babban alamar masu amfani.

Da kyau an buƙata kwafin bayanai a cikin abubuwan da aka ɓoye da kuma ƙetare kwafi a cikin kuskure ko kuskure. Ya taimaka mana aiwatar da wannan dabarar mcrouter.

mcrouter

Wannan wani memcached na'ura mai ba da hanya tsakanin hanyoyin sadarwa ne da Facebook ya kirkira don magance matsalolinsa. Yana goyan bayan ƙaƙƙarfan ƙa'idar rubutu, wanda ke ba da izini sikelin memcached shigarwa zuwa hauka rabbai. Ana iya samun cikakken bayanin mcrouter a ciki wannan sanarwa. Daga cikin wasu abubuwa m ayyuka zai iya yin abin da muke bukata:

  • maimaita rikodin;
  • yi faɗuwa zuwa wasu sabar a cikin ƙungiyar idan kuskure ya faru.

Je zuwa aiki!

mcrouter sanyi

Zan tafi kai tsaye zuwa 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"
       ]
     }
   }
 }
}

Me yasa tafkuna uku? Me yasa ake maimaita sabobin? Bari mu gano yadda yake aiki.

  • A cikin wannan tsarin, mcrouter yana zaɓar hanyar da za a aika buƙatar bisa ga umarnin buƙatar. Mutumin ya gaya masa haka OperationSelectorRoute.
  • SAMU buƙatun je ga mai sarrafa RandomRoutewanda ba da gangan ya zaɓi wurin tafki ko hanya tsakanin abubuwan tsararru ba children. Kowane kashi na wannan tsararru bi da bi shi ne mai kulawa MissFailoverRoute, wanda zai bi ta kowace uwar garke a cikin tafkin har sai ya sami amsa tare da bayanai, wanda za a mayar da shi ga abokin ciniki.
  • Idan muka yi amfani da shi na musamman MissFailoverRoute tare da tafkin sabobin uku, sannan duk buƙatun za su zo da farko zuwa misalin memcached na farko, sauran kuma za su karɓi buƙatun akan saura lokacin da babu bayanai. Irin wannan hanya zai kai ga nauyi mai yawa akan sabar farko a cikin jerin, don haka an yanke shawarar samar da wuraren tafki guda uku tare da adireshi a cikin jeri daban-daban kuma zabar su ba da gangan ba.
  • Duk sauran buƙatun (kuma wannan rikodin ne) ana sarrafa su ta amfani da su AllMajorityRoute. Wannan ma'aikacin yana aika buƙatun ga duk sabobin da ke cikin tafkin kuma yana jiran amsa daga aƙalla N/2 + 1 daga cikinsu. Daga amfani AllSyncRoute don aikin rubutu dole ne a watsar da shi, tunda wannan hanyar tana buƙatar amsa mai kyau daga всех sabobin a cikin rukuni - in ba haka ba zai dawo SERVER_ERROR. Ko da yake mcrouter zai ƙara bayanai zuwa ma'ajin da aka samo, aikin PHP na kira zai dawo da kuskure kuma zai haifar da sanarwa. AllMajorityRoute ba shi da tsauri sosai kuma yana ba da damar har zuwa rabin raka'a a cire su daga sabis ba tare da matsalolin da aka bayyana a sama ba.

Babban hasara Wannan makirci shine idan da gaske babu bayanai a cikin cache, to ga kowane buƙatun daga abokin ciniki N buƙatun zuwa memcached za a aiwatar da shi - zuwa ga kowa sabobin a cikin tafkin. Za mu iya rage adadin sabobin a cikin wuraren waha, alal misali, zuwa biyu: sadaukar da amincin ajiya, muna samunоgudu mafi girma da ƙarancin kaya daga buƙatun zuwa maɓallan da suka ɓace.

NB: Hakanan kuna iya samun hanyoyin haɗin kai masu amfani don koyan mcrouter takardu akan wiki и batutuwan aikin (ciki har da rufaffiyar), wakiltar dukan rumbun adana kayayyaki daban-daban.

Gina da kuma gujewa mcrouter

Aikace-aikacenmu (kuma memcached kanta) yana gudana a Kubernetes - saboda haka, mcrouter shima yana can. Domin akwati taro muna amfani wuf, tsarin da zai yi kama da haka:

NB: Ana buga jerin abubuwan da aka bayar a cikin labarin a cikin ma'ajiya 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' ]

(wuf.yaml)

... da kuma zana shi Tsarin Helm. Abu mai ban sha'awa shi ne cewa akwai kawai janareta na daidaitawa dangane da adadin kwafi (idan kowa yana da zaɓin laconic da kyau, raba shi a cikin sharhi):

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

Muna fitar da shi cikin yanayin gwaji kuma mu duba:

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

Neman rubutun kuskuren bai ba da wani sakamako ba, amma don tambayar "mcrouter php"A kan gaba shine matsala mafi tsufa da ba a warware ba na aikin - rashin tallafi memcached binary protocol.

NB: Ƙa'idar ASCII a cikin memcached tana da hankali fiye da na binary, kuma daidaitattun hanyoyin daidaita maɓalli na hashing kawai suna aiki tare da tsarin binary. Amma wannan baya haifar da matsala ga wani takamaiman lamari.

Dabarar tana cikin jaka: duk abin da za ku yi shine canza zuwa ka'idar ASCII kuma komai zai yi aiki .... Duk da haka, a wannan yanayin, al'adar neman amsoshi a ciki takardun shaida akan php.net ya buga muguwar wargi. Ba za ku sami amsar daidai ba a can ... sai dai idan, ba shakka, kun gungura zuwa ƙarshe, inda a cikin sashe "Rubutun gudummawar mai amfani" zai kasance da aminci kuma amsa rashin adalci.

Ee, sunan zaɓi daidai shine memcached.sess_binary_protocol. Dole ne a kashe shi, bayan haka zaman zai fara aiki. Abin da ya rage shi ne sanya akwati tare da mcrouter a cikin kwasfa tare da PHP!

ƙarshe

Don haka, tare da sauye-sauye na ababen more rayuwa kawai mun sami damar magance matsalar: an warware batun tare da juriyar rashin kuskure, kuma an ƙara amincin ajiyar cache. Baya ga fa'idodin bayyane don aikace-aikacen, wannan ya ba da damar motsa jiki yayin aiki akan dandamali: lokacin da duk abubuwan haɗin ke da ajiyar, rayuwar mai gudanarwa ta sauƙaƙa sosai. Haka ne, wannan hanya ma yana da nasa kurakurai, yana iya zama kamar "ƙugiya", amma idan ya adana kuɗi, ya binne matsalar kuma baya haifar da sababbin - me yasa?

PS

Karanta kuma a kan shafinmu:

source: www.habr.com

Add a comment