Ma te whakamahi i te mcrouter hei tauine i te memcached whakapae

Ma te whakamahi i te mcrouter hei tauine i te memcached whakapae

Ko te whakawhanake i nga kaupapa kawenga nui i roto i tetahi reo me whai huarahi motuhake me te whakamahi i nga taputapu motuhake, engari ka tae mai ki nga tono i roto i te PHP, ka tino kaha ake te ahuatanga ka hiahia koe ki te whakawhanake, hei tauira, ake tūmau tono. I roto i tenei tuhipoka ka korero tatou mo te mamae e mohio ana ki te tohatoha o te waahi rokiroki me te keteroki raraunga i roto i te memcached me pehea te whakaoti i enei raruraru i roto i te kaupapa "paari" kotahi.

Ko te toa o te kaupapa he tono PHP i runga i te anga symfony 2.3, kaore rawa i whakauruhia ki nga mahere pakihi hei whakahou. I tua atu i te rokiroki waahi paerewa, i whakamahia katoatia e tenei kaupapa "Keteroki katoa" kaupapa here i roto i te memcached: nga whakautu ki nga tono ki te papaaarangi me nga kaitoro API, nga momo haki, nga kati mo te tukutahi i nga mahi waehere me te maha atu. I roto i tenei ahuatanga, ko te pakaru o te memcached ka mate ki te mahi o te tono. I tua atu, ko te ngaro o te keteroki ka arahi ki nga hua kino: ka tiimata te DBMS ki te pakaru i nga hiku, ka tiimata nga ratonga API ki te aukati i nga tono, me era atu. Ko te whakau i te ahuatanga ka roa pea te tekau meneti, a i tenei wa ka tino puhoi te ratonga, karekau ranei e waatea.

I hiahia matou ki te whakarato te kaha ki te awhi whakapae i te tono me te iti o te kaha, i.e. me te iti o nga huringa ki te waehere puna me nga mahi katoa ka tiakina. Hangaia te keteroki kia kaua e aukati noa i nga rahunga, engari me ngana ano ki te whakaiti i te ngaronga raraunga mai i a ia.

He aha te he ki te memcached ano?

I te nuinga o te waa, ko te toronga memcached mo PHP e tautoko ana i nga raraunga tohatoha me te rokiroki waahi i waho o te pouaka. Ko te tikanga mo te hashing matua riterite ka taea e koe te tohatoha raraunga ki runga i nga kaitoro maha, me te whakatika motuhake ki ia taviri motuhake ki tetahi tūmau motuhake mai i te roopu, me nga taputapu failover kua hangaia hei whakarite kia nui te waatea o te ratonga keteroki (engari, he kino, kore raraunga).

He pai ake nga mea me te rokiroki waahi: ka taea e koe te whirihora memcached.sess_number_of_replicas, na te mea ka penapenahia nga raraunga ki runga i nga kaitoro maha i te wa kotahi, a ki te kore tetahi tauira memcached, ka whakawhitia nga raraunga mai i etahi atu. Heoi, ki te hoki mai te tūmau ki runga ipurangi me te kore raraunga (penei i te nuinga o te waa i muri i te whakaara ano), ka tohatohahia etahi o nga kii hei painga. I roto i te meka ka tikanga tenei ngaronga o nga raraunga huihuinga, i te mea kaore he huarahi ki te "haere" ki tetahi atu tauira mena ka ngaro.

Ko nga taputapu whare pukapuka paerewa e whai ana i te nuinga whakapae tauine: ka taea e koe te whakanui ake i te keteroki ki nga rahi nui me te whai waahi mai i nga waehere e whakahaerehia ana i runga i nga kaitoro rereke. Heoi, i roto i to maatau ahuatanga, ko te nui o nga raraunga penapena kaore e nui ake i te maha o nga gigabytes, a he tino nui te mahinga o te kotahi, e rua ranei. No reira, ko nga taputapu paerewa whai hua anake ko te whakapumau i te watea o te memcached i te wa e mau tonu ana tetahi tauira keteroki i roto i nga ahuatanga mahi. Heoi, kaore i taea te whakamahi i tenei waahi ... I konei he mea pai kia maumahara ki te tawhito o te angamahi i whakamahia i roto i te kaupapa, na reira i kore ai e taea te tono ki te mahi me te puna o nga kaitoro. Kaua hoki e wareware ki te ngaro o nga raraunga o te huihuinga: ka tiimata te kanohi o te kaihoko mai i te whakaputanga nui o nga kaiwhakamahi.

Ko te tikanga i hiahiatia te tukurua o nga rekoata i roto i nga kape me te kape i nga kape ina he he, he pohehe ranei. I awhina ia matou ki te whakatinana i tenei rautaki mcrouter.

mcrouter

He pouara memcached tenei i whakawhanakehia e Facebook hei whakaoti i ona raru. E tautoko ana i te kawa kuputuhi memcached, e taea ai tauine nga whakaurunga memcached ki nga wahanga porangi. He whakamaarama taipitopito mo te mcrouter ka kitea i roto tenei panui. I roto i era atu mea mahi whanui ka taea e ia te mahi i nga mea e hiahiatia ana e tatou:

  • tukurua rekoata;
  • hoki ki etahi atu tūmau i roto i te roopu mena ka puta he hapa.

Haere ki raro ki te pakihi!

whirihoranga mcrouter

Ka haere tika ahau ki te whirihora:

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

He aha nga puna e toru? He aha i tukuruatia ai nga tūmau? Kia mohio tatou me pehea te mahi.

  • I tenei whirihoranga, ka kowhiria e te mcrouter te ara e tukuna ai te tono i runga i te tono tono. Ka korerotia e te tangata tenei ki a ia OperationSelectorRoute.
  • Haere nga tono GET ki te kaihautu RandomRouteka kowhiri matapōkeretia he puna wai, he ara ranei i waenga i nga taonga hurangi children. Ko ia huānga o tenei huinga he kaihautu MissFailoverRoute, ka haere ma ia tūmau i roto i te poka wai tae noa ki te whiwhi urupare me nga raraunga, ka whakahokia ki te kiritaki.
  • Mena i whakamahia e matou anake MissFailoverRoute me te puna kaukau e toru nga kaitoro, katahi ka tae mai nga tono katoa ki te tauira memcached tuatahi, a ko te toenga ka whiwhi tono i runga i te toenga karekau he raraunga. Ko te huarahi penei ka arahi he nui te kawenga i runga i te tūmau tuatahi i te rārangi, no reira ka whakatauhia kia toru nga puna wai me nga wahitau i roto i nga raupapa rereke ka kowhiria matapōkeretia.
  • Ko etahi atu tono katoa (a he rekoata tenei) ka tukatukahia ma te whakamahi AllMajorityRoute. Ka tukuna e tenei kaihautu nga tono ki nga kaitoro katoa i roto i te poka wai ka tatari mo nga whakautu mai i te iti rawa N/2 + 1 o ratou. Mai i te whakamahi AllSyncRoute no te mea me whakarere nga mahi tuhi, na te mea ko tenei tikanga me whai whakautu pai mai i всех tūmau i roto i te roopu - ki te kore ka hoki mai SERVER_ERROR. Ahakoa ka taapirihia e te mcrouter nga raraunga ki nga keteroki e waatea ana, ko te mahi PHP karanga ka whakahokia he hapa a ka whakaputa panui. AllMajorityRoute ehara i te mea tino kaha, ka whakaaetia kia neke atu ki te haurua o nga waeine ki waho o te ratonga me te kore nga raru e whakaahuatia ana i runga ake nei.

Ko te ngoikoretanga matua Ko tenei kaupapa mena karekau he raraunga kei roto i te keteroki, katahi ka mahia mo ia tono mai i te kiritaki N tono ki te memcached - ki ki te katoa tūmau i roto i te poka wai. Ka taea e tatou te whakaiti i te maha o nga kaitoro i roto i nga puna, hei tauira, ki te rua: te patu i te pono o te rokiroki, ka whiwhi tatouоteitei ake te tere me te iti ake o te kawenga mai i nga tono ki nga taviri ngaro.

NB: Ka kitea pea he hononga whaihua mo te ako mcrouter tuhinga i runga wiki и take kaupapa (tae atu ki nga mea kati), e tohu ana i te katoa o nga whare taonga o nga momo whirihoranga.

Te hanga me te whakahaere mcrouter

Ko ta maatau tono (me te memcached ano) ka rere ki Kubernetes - na reira, kei reira ano te mcrouter. Mo hui ipu whakamahi tatou werf, ka penei te ahua o te whirihora:

NB: Ko nga rarangi i homai i roto i te tuhinga ka whakaputaina i roto i te putunga 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)

... ka tuhia ki waho Tūtohi helm. Ko te mea whakamere ko te mea he kaihanga whirihora noa i runga i te maha o nga tauira (mehemea he pai ake te kowhiringa laconic me te huatau, tohaina ki nga korero):

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

Ka hurihia e matou ki te taiao whakamatautau ka tirotirohia:

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

Ko te rapu i te tuhinga o te hapa kaore he hua, engari mo te patai "mcrouter php"I mua ko te raruraru tawhito rawa atu o te kaupapa - te kore tautoko kawa-rua memcached.

NB: He puhoi ake te kawa ASCII i roto i te memcached i te kawa-rua, a ko nga tikanga paerewa o te hashing matua riterite ka mahi anake me te kawa rua. Engari kaore tenei e hanga raruraru mo tetahi keehi motuhake.

Ko te mahi tinihanga kei roto i te putea: ko nga mea katoa hei mahi maau ko te huri ki te kawa ASCII ka mahi nga mea katoa.... Heoi, i roto i tenei take, te peu o te rapu whakautu i roto i tuhinga kei php.net whakatangihia he kata nanakia. Kaore e kitea e koe te whakautu tika i reira ... mena ka panuku koe ki te mutunga, kei hea te waahanga "Kaiwhakamahi tuhipoka takoha" ka pono me whakautu pooti kore tika.

Ae, ko te ingoa whiringa tika memcached.sess_binary_protocol. Me whakakorehia, ka mutu ka timata nga waahi ki te mahi. Ko nga mea e toe ana ko te tuku i te ipu me te mcrouter ki roto i te putea me te PHP!

mutunga

No reira, na nga huringa hangahanga noa i taea e matou te whakatau i te raru: kua whakatauhia te take ki te whakakoromaki i te hapa memcached, kua piki ake te pono o te rokiroki keteroki. I tua atu i nga painga e kitea ana mo te tono, he waahi tenei mo te mahi i te wa e mahi ana i runga i te turanga: ina he rahui nga waahanga katoa, ka tino ngawari te oranga o te kaiwhakahaere. Ae, he kino ano tenei tikanga, he rite te ahua ki te "karaka", engari mena ka penapena moni, ka huna i te raru kaore e puta he mea hou - he aha?

PS

Pānuihia hoki i runga i ta maatau blog:

Source: will.com

Tāpiri i te kōrero