ProHoster > Blog > Rianachd > A’ cleachdadh mcrouter gus memcached a sgèileadh gu còmhnard
A’ cleachdadh mcrouter gus memcached a sgèileadh gu còmhnard
Feumaidh leasachadh phròiseactan làn luchd ann an cànan sam bith dòigh-obrach sònraichte agus cleachdadh innealan sònraichte, ach nuair a thig e gu tagraidhean ann am PHP, faodaidh an suidheachadh a bhith cho nas miosa is gum feum thu leasachadh, mar eisimpleir, frithealaiche tagraidh fhèin. Anns an nota seo bruidhnidh sinn mun phian air a bheil sinn eòlach le stòradh seisean sgaoilte agus tasgadh dàta ann am memcached agus mar a dh’ fhuasgail sinn na duilgheadasan sin ann an aon phròiseact “uàrd”.
Is e gaisgeach an tachartais tagradh PHP stèidhichte air frèam symfony 2.3, nach eil idir air a ghabhail a-steach anns na planaichean gnìomhachais airson ùrachadh. A bharrachd air stòradh seisean gu math àbhaisteach, rinn am pròiseact seo làn fheum de poileasaidh “caching everything”. ann am memcached: freagairtean do dh'iarrtasan chun an stòr-dàta agus frithealaichean API, diofar bhrataichean, glasan airson cur an gnìomh còd a shioncronachadh agus mòran a bharrachd. Ann an suidheachadh mar sin, bidh briseadh sìos de memcached a ‘fàs marbhtach do ghnìomhachd an tagraidh. A bharrachd air an sin, bidh call tasgadan a’ leantainn gu droch bhuilean: bidh an DBMS a ’tòiseachadh a’ spreadhadh aig na claisean, bidh seirbheisean API a ’tòiseachadh a’ toirmeasg iarrtasan, msaa. Dh’ fhaodadh gun toir e deichean de mhionaidean gus an suidheachadh a dhèanamh seasmhach, agus rè na h-ùine seo bidh an t-seirbheis gu math slaodach no gu tur gun a bhith ri fhaighinn.
Dh'fheumadh sinn a thoirt seachad an comas an tagradh a sgèileadh gu còmhnard gun mòran oidhirp, i.e. le glè bheag de dh’ atharrachaidhean air a’ chòd stòr agus làn ghnìomhachd air a ghleidheadh. Dèan an tasgadan chan ann a-mhàin an aghaidh fàilligeadh, ach cuideachd feuch ri call dàta bhuaithe a lughdachadh.
Dè tha ceàrr air memcached fhèin?
San fharsaingeachd, tha an leudachadh memcached airson PHP a’ toirt taic do dhàta sgaoilte agus stòradh seisean a-mach às a’ bhogsa. Leigidh an uidheamachd airson prìomh hashing cunbhalach leat dàta a sgaoileadh gu cothromach air mòran de luchd-frithealaidh, a’ dèiligeadh gu h-annasach ri gach iuchair shònraichte gu frithealaiche sònraichte bhon bhuidheann, agus bidh innealan fàilligidh togte a’ dèanamh cinnteach gu bheil cothrom àrd air an t-seirbheis tasgadan (ach, gu mì-fhortanach, gun dàta).
Tha cùisean beagan nas fheàrr le stòradh seisean: faodaidh tu rèiteachadh memcached.sess_number_of_replicas, mar thoradh air an sin thèid an dàta a stòradh air grunn luchd-frithealaidh aig an aon àm, agus ma dh’ fhàillig aon eisimpleir memcached, thèid an dàta a ghluasad bho chàch. Ach, ma thig am frithealaiche air ais air-loidhne gun dàta (mar as trice a thachras às deidh ath-thòiseachadh), thèid cuid de na h-iuchraichean ath-riarachadh na fhàbhar. Gu dearbh bidh seo a’ ciallachadh call dàta seisean, leis nach eil dòigh ann air “a dhol” gu mac-samhail eile gun fhios nach caillear thu.
Tha innealan leabharlainn àbhaisteach ag amas gu sònraichte air chòmhnard sgèileadh: leigidh iad leat an tasgadan àrdachadh gu meudan gigantic agus bheir iad cothrom air bho chòd air aoigheachd air diofar luchd-frithealaidh. Ach, anns an t-suidheachadh againn, chan eil an àireamh de dhàta a tha air a stòradh nas àirde na grunn gigabytes, agus tha coileanadh aon no dhà nodan gu leòr. Mar sin, is dòcha gur e na h-aon innealan àbhaisteach feumail dèanamh cinnteach gu bheil memcached ri fhaighinn fhad ‘s a chumas tu co-dhiù aon eisimpleir tasgadan ann an staid obrach. Ach, cha robh e comasach brath a ghabhail air eadhon an cothrom seo ... An seo is fhiach cuimhneachadh air àrsaidheachd an fhrèam a chaidh a chleachdadh sa phròiseact, agus is e sin as coireach gu robh e do-dhèanta an tagradh a bhith ag obair le cruinneachadh de luchd-frithealaidh. Na dìochuimhnich sinn cuideachd mu chall dàta seisean: bha sùil an neach-ceannach a’ tionndadh bho shuaicheantas mòr luchd-cleachdaidh.
Gu h-iomchaidh bha feum air ath-riochdachadh chlàran ann am memcached agus a’ dol seachad air mac-samhail ann an cùis mearachd no mearachd. Chuidich sinn sinn gus an ro-innleachd seo a chur an gnìomh mcrouter.
mcrouter
Is e seo router memcached air a leasachadh le Facebook gus fuasgladh fhaighinn air na duilgheadasan aige. Bidh e a’ toirt taic don phròtacal teacsa memcached, a tha a’ ceadachadh ionadan memcached sgèile gu cuibhrionn cealgach. Gheibhear tuairisgeul mionaideach air mcrouter ann an an sanas seo. Am measg rudan eile comas-gnìomh farsaing faodaidh e na tha a dhìth oirnn a dhèanamh:
ath-aithris clàr;
dèan tuiteam air ais gu frithealaichean eile sa bhuidheann ma thachras mearachd.
Carson trì lòin? Carson a tha na frithealaichean a-rithist? Feuch an obraich sinn a-mach mar a tha e ag obair.
Anns an rèiteachadh seo, taghaidh mcrouter an t-slighe air an tèid an t-iarrtas a chuir a-steach stèidhichte air an àithne iarrtas. Tha am fear ag innse seo dha OperationSelectorRoute.
Gabh iarrtasan GET chun an neach-làimhseachaidh RandomRoutea bhios air thuaiream a’ taghadh amar no slighe am measg nithean eagrachaidh children. Tha gach eileamaid den raon seo an uair sin na inneal-làimhseachaidh MissFailoverRoute, a thèid tro gach frithealaiche san linne gus am faigh e freagairt le dàta, a thèid a thilleadh chun neach-dèiligidh.
Ma chleachd sinn a-mhàin MissFailoverRoute le cruinneachadh de thrì frithealaichean, thigeadh a h-uile iarrtas an toiseach chun chiad eisimpleir memcached, agus gheibheadh an còrr iarrtasan air stèidh eile nuair nach eil dàta ann. Bheireadh dòigh-obrach mar seo gu buil cus luchd air a’ chiad fhrithealaiche air an liosta, agus mar sin chaidh co-dhùnadh trì amaran a ghineadh le seòlaidhean ann an diofar shreathan agus an taghadh air thuaiream.
Bithear a’ giullachd a h-uile iarrtas eile (agus seo clàr) a’ cleachdadh AllMajorityRoute. Bidh an neach-làimhseachaidh seo a’ cur iarrtasan gu gach frithealaiche san linne agus a’ feitheamh ri freagairtean bho co-dhiù N/2 + 1 dhiubh. Bho chleachdadh AllSyncRoute airson obraichean sgrìobhaidh dh’ fheumadh iad a bhith air an trèigsinn, leis gu bheil feum aig an dòigh seo air deagh fhreagairt bho всех frithealaichean sa bhuidheann - air neo tillidh e SERVER_ERROR. Ged a chuireas mcrouter an dàta ris na caches a tha rim faighinn, bidh an gnìomh PHP ag iarraidh bheir e mearachd air ais agus bheir e fios. AllMajorityRoute chan eil e cho teann agus leigidh e suas ri leth de na h-aonadan a thoirt a-mach à seirbheis às aonais na duilgheadasan a tha air am mìneachadh gu h-àrd.
Prìomh eas-bhuannachd Is e an sgeama seo mura h-eil dàta sam bith san tasgadan, an uairsin airson gach iarrtas bhon neach-dèiligidh N thèid iarrtasan gu memcached a chuir gu bàs - gu do na h-uile seirbhisich anns an linne. Is urrainn dhuinn an àireamh de luchd-frithealaidh ann an amaran a lughdachadh, mar eisimpleir, gu dhà: ag ìobairt earbsachd stòraidh, gheibh sinnоastar nas àirde agus nas lugha de luchd bho iarrtasan gu iuchraichean a tha a dhìth.
NB: Is dòcha gum faigh thu ceanglaichean feumail airson mcrouter ionnsachadh sgrìobhainnean air wiki и cùisean pròiseict (a 'gabhail a-steach feadhainn dùinte), a' riochdachadh taigh-stòir iomlan de dhiofar rèiteachaidhean.
A 'togail agus a' ruith mcrouter
Tha an tagradh againn (agus memcached fhèin) a’ ruith ann an Kubernetes - a rèir sin, tha mcrouter cuideachd suidhichte an sin. Airson co-chruinneachadh container tha sinn a' cleachdadh gaoir, seallaidh an config airson seo mar seo:
NB: Tha na liostaichean a tha air an toirt seachad san artaigil air am foillseachadh anns an stòr flant/mcrouter.
... agus dèan dealbh dheth Clàr stiùiridh. Is e an rud inntinneach nach eil ann ach gineadair config stèidhichte air an àireamh de mhac-samhail (ma tha roghainn nas laconic agus nas eireachdail aig duine, roinn e anns na beachdan):
Bidh sinn ga sgaoileadh a-steach don àrainneachd deuchainn agus a’ sgrùdadh:
# 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 >
Cha tug rannsachadh airson teacsa na mearachd toradh sam bith, ach airson a’ cheist “Luchdaich a-nuas mcrouter php“B’ e an duilgheadas as sine sa phròiseact gun fhuasgladh - dìth taic protocol binary memcached.
NB: Tha am protocol ASCII ann am memcached nas slaodaiche na am fear binary, agus chan obraich dòighean àbhaisteach airson prìomh hashing cunbhalach ach leis a’ phròtacal dà-chànanach. Ach chan eil seo a 'cruthachadh dhuilgheadasan airson cùis shònraichte.
Tha an cleas anns a’ bhaga: chan eil agad ach atharrachadh gu protocol ASCII agus obraichidh a h-uile càil .... Ach, anns a 'chùis seo, an cleachdadh a bhith a' coimhead airson freagairtean a-steach sgrìobhainnean air php.net chluich fealla-dhà cruaidh. Chan fhaigh thu am freagairt ceart an sin ... mura sgrolaich thu chun deireadh, far a bheil san roinn, gu dearbh "Notaichean a chuir an cleachdaiche ris" bithidh dìleas agus freagairt neo-chothromach.
Tha, is e ainm an roghainn cheart memcached.sess_binary_protocol. Feumaidh e a bhith ciorramach, às deidh sin tòisichidh na seiseanan ag obair. Chan eil air fhàgail ach an soitheach le mcrouter a chuir ann am pod le PHP!
co-dhùnadh
Mar sin, le dìreach atharrachaidhean bun-structair bha e comasach dhuinn an duilgheadas fhuasgladh: chaidh a’ chùis le fulangas sgàineadh memcached fhuasgladh, agus chaidh earbsachd stòradh tasgadan àrdachadh. A bharrachd air na buannachdan follaiseach airson an tagraidh, thug seo àite airson gluasad nuair a bha e ag obair air an àrd-ùrlar: nuair a tha tèarmann aig a h-uile pàirt, tha beatha an rianadair air a dhèanamh nas sìmplidhe gu mòr. Tha, tha na h-eas-bhuannachdan aig an dòigh seo cuideachd, is dòcha gum bi e coltach ri “crutch”, ach ma shàbhaileas e airgead, adhlaicidh e an duilgheadas agus nach adhbhraich e feadhainn ùra - carson?