Ke hoʻohana ʻana i ka mcrouter e hoʻonui i ka memcached ma ke alo
ʻO ka hoʻomohala ʻana i nā papahana haʻahaʻa kiʻekiʻe ma kekahi ʻōlelo e koi i kahi ala kūikawā a me ka hoʻohana ʻana i nā mea hana kūikawā, akā i ka wā e pili ana i nā noi ma PHP, hiki ke hoʻonui ʻia ke kūlana a pono ʻoe e hoʻomohala, no ka laʻana, kikowaena noi ponoi. Ma kēia memo, e kamaʻilio mākou e pili ana i ka ʻeha maʻamau me ka mālama ʻana i ka hālāwai a me ka cache data ma memcached a pehea mākou i hoʻoponopono ai i kēia mau pilikia ma kahi papahana "ward".
ʻO ka hero o ka hanana he palapala PHP e pili ana i ka symfony 2.3 framework, ʻaʻole i hoʻokomo ʻia i nā hoʻolālā ʻoihana e hoʻonui. Ma waho aʻe o ka mālama ʻana i ka wā maʻamau, ua hoʻohana piha kēia papahana "caching mea a pau" kulekele i memcached: pane i nā noi i ka waihona a me nā kikowaena API, nā hae like ʻole, nā laka no ka synchronizing code execution a me nā mea hou aku. I kēlā kūlana, lilo ka haʻihaʻi o memcached i mea make i ka hana o ka noi. Eia kekahi, ʻo ka nalowale o ka cache e alakaʻi i nā hopena koʻikoʻi: hoʻomaka ka DBMS e haki i nā seams, hoʻomaka nā lawelawe API e pāpā i nā noi, etc. ʻO ka hoʻokūpaʻa ʻana i ke kūlana he ʻumi mau minuke, a i kēia manawa e lohi nui a loaʻa ʻole paha ka lawelawe.
Pono mākou e hoʻolako ka hiki ke hoʻonui i ka palapala noi me ka hoʻoikaika liʻiliʻi, i.e. me nā hoʻololi liʻiliʻi i ke code kumu a mālama ʻia nā hana piha. E ho'āʻo e hōʻemi i ka nalowale o ka ʻikepili mai ia mea.
He aha ka hewa me ka memcached iā ia iho?
Ma keʻano laulā, kākoʻo ka hoʻonui memcached no PHP i ka ʻikepili i hāʻawi ʻia a me ka waiho ʻana o ka hālāwai ma waho o ka pahu. ʻO ka mīkini no ka hashing kī mau e hiki ai iā ʻoe ke puʻunaue like i ka ʻikepili ma nā kikowaena he nui, e kamaʻilio kūʻokoʻa i kēlā me kēia kī kikoʻī i kahi kikowaena kikoʻī mai ka hui, a me nā mea hana failover i kūkulu ʻia e hōʻoia i ka loaʻa kiʻekiʻe o ka lawelawe caching (akā, ʻaʻole naʻe, ʻaʻohe ʻikepili).
ʻOi aku ka maikaʻi o nā mea me ka waiho ʻana o ka manawa: hiki iā ʻoe ke hoʻonohonoho memcached.sess_number_of_replicas, ma muli o ia mea e mālama ʻia ai ka ʻikepili ma nā kikowaena he nui i ka manawa hoʻokahi, a i ka hopena o ka hāʻule ʻole o hoʻokahi laʻana memcached, e hoʻoili ʻia ka ʻikepili mai nā poʻe ʻē aʻe. Eia nō naʻe, inā hoʻi mai ke kikowaena pūnaewele me ka ʻole o ka ʻikepili (e like me ka hana maʻamau ma hope o ka hoʻomaka hou ʻana), e hāʻawi hou ʻia kekahi o nā kī i kona makemake. ʻOiaʻiʻo e manaʻo kēia poho o ka ikepili kau, no ka mea, ʻaʻohe ala e "hele" i kahi kope ʻē aʻe i ka wā i hala.
ʻO nā mea hana hale waihona puke maʻamau ke kuhikuhi nui ʻia paepae scaling: ʻae lākou iā ʻoe e hoʻonui i ka cache i nā nui nui a hāʻawi i ke komo iā ia mai nā code i hoʻokipa ʻia ma nā kikowaena like ʻole. Eia nō naʻe, i ko mākou kūlana, ʻaʻole i ʻoi aku ka nui o ka ʻikepili i mālama ʻia ma mua o nā gigabytes, a ua lawa ka hana o hoʻokahi a ʻelua paha nodes. No laila, ʻo nā mea hana maʻamau pono wale nō e hiki ke hōʻoia i ka loaʻa ʻana o ka memcached me ka mālama ʻana i hoʻokahi hiʻohiʻona cache ma ke kūlana hana. Eia nō naʻe, ʻaʻole hiki ke hoʻohana i kēia manawa kūpono ... Eia ka mea kūpono e hoʻomanaʻo i ka wā kahiko o ka framework i hoʻohana ʻia i ka papahana, ʻo ia ke kumu i hiki ʻole ai ke kiʻi i ka noi e hana me kahi wai o nā kikowaena. Mai poina hoʻi e pili ana i ka nalowale ʻana o ka ʻikepili o ka hālāwai: ʻōniʻi ka maka o ka mea kūʻai mai ka logout nui o nā mea hoʻohana.
ʻO ke kūpono i koi ʻia ka hoʻopili hou ʻana o nā moʻolelo ma memcached a me ke kaʻe ʻana i nā replika ina he kuhi hewa. Ua kōkua iā mākou e hoʻokō i kēia hoʻolālā mcrouter.
mcrouter
He mea hoʻokele memcached kēia i hoʻomohala ʻia e Facebook e hoʻoponopono i kona mau pilikia. Kākoʻo ia i ka protocol text memcached, i hiki ai nā mea hoʻonohonoho memcached scale i na mea pupule. Hiki ke ʻike ʻia kahi wehewehe kikoʻī o ka mcrouter ma keia hoolaha. Ma waena o nā mea ʻē aʻe hana ākea hiki iā ia ke hana i nā mea e pono ai mākou:
e hoʻopili i ka moʻolelo;
e hoʻihoʻi i nā kikowaena ʻē aʻe o ka hui inā loaʻa kahi hewa.
No ke aha ʻekolu mau loko? No ke aha i hana hou ʻia ai nā kikowaena? E noʻonoʻo kākou pehea e hana ai.
Ma kēia hoʻonohonoho, koho ʻo mcrouter i ke ala e hoʻouna ʻia ai ka noi ma muli o ke kauoha noi. 'Ōlelo ke kanaka iā ia i kēia OperationSelectorRoute.
E hele nā noi GET i ka mea lawelawe RandomRouteka mea e koho wale i ka loko a i ʻole ke ala ma waena o nā mea hoʻonohonoho children. ʻO kēlā me kēia ʻāpana o kēia ʻano he mea lawelawe MissFailoverRoute, e hele i kēlā me kēia kikowaena i loko o ka loko wai a loaʻa iā ia kahi pane me ka ʻikepili, e hoʻihoʻi ʻia i ka mea kūʻai aku.
Inā mākou i hoʻohana wale MissFailoverRoute me ka loko o ʻekolu mau kikowaena, a laila e hele mua nā noi a pau i ka manawa memcached mua, a ʻo ke koena e loaʻa nā noi ma ke koena i ka wā ʻaʻohe ʻikepili. ʻO ia ala e alakaʻi ai i kaumaha nui ma ke kikowaena mua o ka papa inoa, no laila ua hoʻoholo ʻia e hoʻohua i ʻekolu mau loko me nā helu wahi ma nā ʻano ʻokoʻa like ʻole a koho maʻamau iā lākou.
Hoʻohana ʻia nā noi ʻē aʻe a pau (a he moʻolelo kēia). AllMajorityRoute. Hoʻouna kēia mea lawelawe i nā noi i nā kikowaena āpau i ka loko wai a kali i nā pane mai ka liʻiliʻi N/2 + 1 o lākou. Mai ka hoʻohana ʻana AllSyncRoute no ka mea, ua haʻalele ʻia nā hana kākau, no ka mea pono kēia ʻano i ka pane maikaʻi mai o nā mea a pau nā kikowaena i ka hui - i ʻole e hoʻi mai SERVER_ERROR. ʻOiai e hoʻohui ʻo mcrouter i ka ʻikepili i nā cache i loaʻa, ʻo ke kāhea ʻana i ka hana PHP e hoʻihoʻi i kahi hewa a e hoʻopuka i ka leka hoʻomaopopo. AllMajorityRoute ʻAʻole koʻikoʻi loa a hiki i ka hapalua o nā ʻāpana ke lawe ʻia mai ka lawelawe me ka ʻole o nā pilikia i hōʻike ʻia ma luna.
ʻO ka hemahema nui ʻO kēia hoʻolālā inā ʻaʻohe ʻikepili i loko o ka cache, a laila no kēlā me kēia noi mai ka mea kūʻai aku N noi i memcached e hoʻokō maoli ʻia - i i nā mea a pau nā kikowaena i loko o ka loko. Hiki iā mākou ke hōʻemi i ka helu o nā kikowaena i loko o nā loko, no ka laʻana, i ʻelua: e kaumaha ana i ka hilinaʻi mālama, loaʻa iā mākouоʻoi aku ka wikiwiki a me ka liʻiliʻi o ka ukana mai nā noi i nā kī i nalowale.
NB: Loaʻa paha iā ʻoe nā loulou pono no ke aʻo ʻana i ka mcrouter palapala ma wiki и pilikia papahana (me nā mea i pani ʻia), e hōʻike ana i kahi hale kūʻai holoʻokoʻa o nā hoʻonohonoho like ʻole.
Ke kūkulu ʻana a me ka holo ʻana i ka mcrouter
Ke holo nei kā mākou noi (a me ka memcached iā ia iho) ma Kubernetes - no laila, aia nō ka mcrouter ma laila. No ka mea hui pahu hoʻohana mākou werf, ka config e like me kēia:
NB: Ua paʻi ʻia nā papa inoa i hāʻawi ʻia ma ka ʻatikala ma ka waihona flant/mcrouter.
... a kiʻi i waho Papa kuhi helm. ʻO ka mea hoihoi, aia wale nō kahi config generator e pili ana i ka helu o nā replicas (inā loaʻa i kekahi ke koho laconic a nani, e kaʻana like i nā manaʻo):
Hoʻopili mākou iā ia i loko o ke kaiapuni hoʻāʻo a nānā:
# 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 >
ʻAʻole i loaʻa nā hopena i ka ʻimi ʻana i ka kikokikona o ka hewa, akā no ka nīnau "mcrouter php"Ma ke alo ka pilikia mua loa o ka papahana - nele i ke kākoʻo protocol binary memcached.
NB: ʻOi aku ka lohi o ka protocol ASCII ma memcached ma mua o ka binary, a ʻo ke ʻano maʻamau o ka hashing kī paʻa e hana wale me ka protocol binary. Akā ʻaʻole kēia e hana i nā pilikia no kahi hihia kikoʻī.
Aia ka hoʻopunipuni i loko o ka ʻeke: ʻo ka mea wale nō āu e hana ai, e hoʻololi i ka protocol ASCII a e hana nā mea a pau.... Eia naʻe, i kēia hihia, ʻo ka maʻa o ka ʻimi ʻana i nā pane ma palapala ma php.net hoʻokani ʻino ʻino. ʻAʻole ʻoe e ʻike i ka pane pololei ma laila ... ke ʻole, ʻoiaʻiʻo, e ʻōwili ʻoe i ka hopena, ma kahi o ka ʻāpana "Memo i hāʻawi ʻia e ka mea hoʻohana" e malama pono a unfairly downvoted pane.
ʻAe, ʻo ka inoa koho kūpono memcached.sess_binary_protocol. Pono e hoʻopau ʻia, a laila e hoʻomaka nā hana. ʻO nā mea a pau e waiho ana i ka ipu me ka mcrouter i loko o kahi pod me PHP!
hopena
No laila, me nā hoʻololi ʻenehana wale nō i hiki iā mākou ke hoʻoponopono i ka pilikia: ua hoʻoholo ʻia ka pilikia me ka hoʻomanawanui hewa memcached, a ua hoʻonui ʻia ka hilinaʻi o ka mālama huna. Ma waho aʻe o nā pono kūpono no ka noi, hāʻawi kēia i kahi lumi no ka hana ʻana i ka wā e hana ai ma luna o ke kahua: inā loaʻa nā ʻāpana āpau i kahi mālama, ua maʻalahi loa ke ola o ka luna hoʻomalu. ʻAe, loaʻa i kēia ʻano nā drawbacks, ʻano like paha ia me ka "crutch", akā inā mālama ia i ke kālā, kanu i ka pilikia a ʻaʻole hoʻi i nā mea hou - no ke aha?