Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Bonjou, non mwen se Evgeniy. Mwen travay nan enfrastrikti rechèch Yandex.Market. Mwen vle di kominote Habr la sou kwizin anndan Market la - e mwen gen anpil bagay pou m di. Premye a tout, ki jan rechèch la mache travay, pwosesis ak achitekti. Ki jan nou fè fas ak sitiyasyon ijans: sa k ap pase si yon sèvè tonbe? E si gen 100 serveurs konsa?

Ou pral aprann tou kijan nou aplike nouvo fonksyonalite sou yon pakèt sèvè alafwa. Ak ki jan nou teste sèvis konplèks dirèkteman nan pwodiksyon, san yo pa lakòz okenn deranje itilizatè yo. An jeneral, ki jan rechèch mache a ap travay pou tout moun gen yon bon moman.

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Yon ti kras sou nou: ki pwoblèm nou rezoud

Lè ou antre tèks, chèche yon pwodwi pa paramèt, oswa konpare pri nan diferan magazen, tout demann yo voye bay sèvis rechèch la. Search se pi gwo sèvis nan mache a.

Nou trete tout demann rechèch: soti nan sit market.yandex.ru, beru.ru, sèvis Supercheck, Yandex.Advisor, aplikasyon mobil. Nou enkli tou òf pwodwi nan rezilta rechèch sou yandex.ru.

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Pa sèvis rechèch mwen vle di pa sèlman rechèch la tèt li, men tou, yon baz done ak tout òf yo sou mache a. Echèl la se sa a: plis pase yon milya demann rechèch yo trete chak jou. Ak tout bagay ta dwe travay byen vit, san entèripsyon epi toujou pwodwi rezilta a vle.

Ki sa ki: Achitekti mache

Mwen pral yon ti tan dekri achitekti aktyèl la nan mache a. Li ka apeprè dekri nan dyagram ki anba a:
Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe
Ann di yon magazen patnè vin jwenn nou. Li di mwen vle vann yon jwèt: sa a chat sa ki mal ak yon squeaker. Ak yon lòt chat fache san yon squeaker. Epi jis yon chat. Lè sa a, magazen an bezwen prepare òf pou mache rechèch la. Magazen an jenere yon xml espesyal ak òf ak kominike chemen an nan xml sa a atravè koòdone afilye a. Lè sa a, indexer la detanzantan telechaje xml sa a, tcheke pou erè epi sove tout enfòmasyon yo nan yon baz done gwo.

Gen anpil sa yo sove xmls. Yon endèks rechèch kreye nan baz done sa a. Endèks la estoke nan fòma entèn. Apre yo fin kreye endèks la, sèvis Layout la telechaje li sou sèvè rechèch yo.

Kòm yon rezilta, yon chat fache ak yon squeaker parèt nan baz done a, ak endèks chat la parèt sou sèvè a.

Mwen pral di ou ki jan nou fè rechèch pou yon chat nan pati a sou rechèch achitekti.

Achitekti rechèch mache

Nou ap viv nan yon mond nan mikwosèvis: chak demann fèk ap rantre market.yandex.ru lakòz yon anpil nan subqueries, ak plizyè douzèn sèvis yo patisipe nan pwosesis yo. Dyagram nan montre sèlman kèk:

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe
Konplo pwosesis senplifye demann

Chak sèvis gen yon bèl bagay - balans pwòp li yo ak yon non inik:

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Balansè a ban nou pi gwo fleksibilite nan jere sèvis la: ou ka, pou egzanp, fèmen serveurs, ki se souvan obligatwa pou mizajou. Balansè a wè sèvè a pa disponib epi otomatikman redireksyon demann nan lòt sèvè oswa sant done. Lè w ajoute oswa retire yon sèvè, chaj la otomatikman redistribiye ant sèvè yo.

Non inik balans lan pa depann de sant done a. Lè sèvis A fè yon demann bay B, Lè sa a, pa default balansè B redireksyon demann lan nan sant done aktyèl la. Si sèvis la pa disponib oswa pa egziste nan sant done aktyèl la, Lè sa a, demann lan redireksyon nan lòt sant done.

Yon sèl FQDN pou tout sant done pèmèt sèvis A konplètman abstrè de kote yo. Y ap toujou trete demann li nan sèvis B la. Eksepsyon a se ka a lè sèvis la sitiye nan tout sant done.

Men, se pa tout bagay ki tèlman woz ak balans sa a: nou gen yon eleman adisyonèl entèmedyè. Balanse a ka enstab, epi pwoblèm sa a rezoud pa serveurs redondants. Genyen tou yon reta adisyonèl ant sèvis A ak B. Men, nan pratik li se mwens pase 1 ms epi pou pifò sèvis sa a pa kritik.

Fè fas ak inatandi: Balanse Sèvis rechèch ak rezistans

Imajine ke gen yon efondreman: ou bezwen jwenn yon chat ak yon squeaker, men sèvè a aksidan. Oswa 100 serveurs. Ki jan yo soti? Èske nou reyèlman pral kite itilizatè a san yon chat?

Sitiyasyon an fè pè, men nou pare pou li. Mwen pral di ou nan lòd.

Enfrastrikti rechèch la sitiye nan plizyè sant done:

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Lè konsepsyon, nou enkli posibilite pou fèmen yon sant done. Lavi a plen sipriz - pou egzanp, yon ekskavatè ka koupe yon kab anba tè (wi, sa te rive). Kapasite nan sant done ki rete yo ta dwe ase pou kenbe tèt ak chaj pik.

Ann konsidere yon sèl sant done. Chak sant done gen menm konplo operasyon balans lan:

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe
Yon balanse se omwen twa serveurs fizik. Redondans sa a fèt pou fyab. Balanse yo kouri sou HAProx.

Nou te chwazi HAProx akòz pèfòmans segondè li yo, kondisyon resous ki ba ak fonksyonalite lajè. Lojisyèl rechèch nou an kouri andedan chak sèvè.

Chans pou yon sèvè echwe se ba. Men, si ou gen anpil serveurs, chans pou omwen youn ap desann ogmante.

Sa a se sa k ap pase an reyalite: sèvè aksidan. Se poutèt sa, li nesesè toujou ap kontwole estati a nan tout serveurs. Si sèvè a sispann reponn, li otomatikman dekonekte nan trafik. Pou rezon sa a, HAProxy gen yon chèk sante entegre. Li ale nan tout serveurs yon fwa yon dezyèm ak yon demann HTTP "/ping".

Yon lòt karakteristik nan HAProxy: ajan-check pèmèt ou chaje tout sèvè respire. Pou fè sa, HAProxy konekte ak tout sèvè, epi yo retounen pwa yo depann sou chaj aktyèl la soti nan 1 a 100. Se pwa a kalkile ki baze sou kantite demann nan keu la pou tretman ak chaj la sou processeur a.

Koulye a, sou jwenn chat la. Rechèch la rezilta nan demann tankou: /search?text=fache+chat. Pou rechèch la dwe rapid, tout endèks chat la dwe anfòm nan RAM. Menm lekti nan SSD a pa ase vit.

Yon fwa sou yon tan, baz done a òf te piti, ak RAM nan yon sèl sèvè te ase pou li. Kòm baz òf la te grandi, tout bagay pa anfòm ankò nan RAM sa a, epi done yo te divize an de pati: shard 1 ak shard 2.

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe
Men sa toujou rive: nenpòt solisyon, menm yon bon, bay lòt pwoblèm.

Balanse a toujou ale nan nenpòt sèvè. Men, sou machin nan kote demann lan te vini, te gen sèlman mwatye nan endèks la. Rès la te sou lòt serveurs. Se poutèt sa, sèvè a te oblije ale nan kèk machin vwazen. Apre yo fin resevwa done ki soti nan tou de sèvè yo, rezilta yo te konbine ak reklase.

Depi balanse a distribye demann yo respire, tout sèvè yo te angaje nan re-klase, epi yo pa jis voye done.

Pwoblèm lan te rive si yon sèvè vwazen pa t disponib. Solisyon an se te presize plizyè serveurs ak priyorite diferan kòm yon sèvè "vwazen". Premyèman, demann lan te voye bay serveurs yo nan etajè aktyèl la. Si pa te gen okenn repons, demann lan te voye bay tout serveurs nan sant done sa a. E anfen, demann lan te ale nan lòt sant done.
Kòm kantite pwopozisyon te grandi, done yo te divize an kat pati. Men, sa a pa t 'limit la.

Kounye a, yo itilize yon konfigirasyon uit shards. Anplis de sa, pou konsève pou plis memwa, endèks la te divize an yon pati rechèch (ki itilize pou rechèch) ak yon pati snippet (ki pa patisipe nan rechèch la).

Yon sèvè gen enfòmasyon pou yon sèl shard. Se poutèt sa, pou chèche endèks la konplè, ou bezwen rechèch sou uit serveurs ki gen diferan shards.

Sèvè yo gwoupe nan grap. Chak gwoup gen uit motè rechèch ak yon sèvè snippet.

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe
Sèvè snippet la kouri yon baz done kle-valè ak done estatik. Yo bezwen bay dokiman, pou egzanp, yon deskripsyon nan yon chat ak yon squeaker. Done yo espesyalman transfere nan yon sèvè separe pou yo pa chaje memwa nan sèvè rechèch.

Piske idantifikasyon dokiman yo inik sèlman nan yon sèl endèks, yon sitiyasyon ka rive kote pa gen okenn dokiman nan snippets yo. Oke, oswa ke pou yon sèl ID pral gen diferan kontni. Se poutèt sa, nan lòd pou rechèch la travay ak rezilta yo dwe retounen, te gen yon bezwen pou konsistans atravè tout gwoup la. Mwen pral di ou anba a ki jan nou kontwole konsistans.

Rechèch la li menm estriktire jan sa a: yon demann rechèch ka rive nan nenpòt nan uit serveurs yo. Ann di li te vini nan sèvè 1. Sèvè sa a trete tout agiman yo epi li konprann ki sa ak ki jan yo gade pou. Tou depan de demann lan fèk ap rantre, sèvè a ka fè demann adisyonèl nan sèvis ekstèn pou enfòmasyon ki nesesè yo. Yon demann ka swiv pa jiska dis demann nan sèvis ekstèn.

Apre kolekte enfòmasyon ki nesesè yo, yon rechèch kòmanse nan baz done òf la. Pou fè sa, subqueries yo fèt nan tout uit serveurs nan gwoup la.

Yon fwa yo resevwa repons yo, rezilta yo konbine. Nan fen a, plizyè lòt subqueries nan sèvè a snippet ka bezwen jenere rezilta yo.

Rechèch rechèch nan gwoup la sanble: /shard1?text=fache+chat. Anplis de sa, subqueries nan fòm yo toujou ap fèt ant tout sèvè ki nan gwoup la yon fwa yon dezyèm fwa: /estati.

Ankèt /estati detekte yon sitiyasyon kote sèvè a pa disponib.

Li kontwole tou ke vèsyon motè rechèch la ak vèsyon endèks la se menm bagay la sou tout serveurs, otreman pral gen done ki konsistan nan gwoup la.

Malgre lefèt ke yon sèvè snippet trete demann ki soti nan uit motè rechèch, processeur li trè alalejè chaje. Se poutèt sa, kounye a nou transfere done snippet yo nan yon sèvis separe.

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Pou transfere done, nou prezante kle inivèsèl pou dokiman yo. Koulye a, li enposib pou yon sitiyasyon kote kontni ki soti nan yon lòt dokiman retounen lè l sèvi avèk yon sèl kle.

Men, tranzisyon an nan yon lòt achitekti poko fini. Koulye a, nou vle debarase m de sèvè snippet dedye a. Lè sa a, deplase lwen estrikti gwoup la tout ansanm. Sa a pral pèmèt nou kontinye echèl fasil. Yon bonis adisyonèl se ekonomi fè enpòtan.

Epi, koulye a nan istwa pè ak fini kontan. Ann konsidere plizyè ka nan indisponibilite sèvè.

Yon bagay terib rive: yon sèl sèvè pa disponib

Ann di yon sèl sèvè pa disponib. Lè sa a, sèvè ki rete yo nan gwoup la ka kontinye reponn, men rezilta rechèch yo pral enkonplè.

Via chèk estati /estati sèvè vwazen yo konprann ke youn pa disponib. Se poutèt sa, kenbe konplè, tout serveurs nan gwoup la pou chak demann /ping yo kòmanse reponn a balans lan ke yo pa disponib tou. Li sanble ke tout sèvè yo nan gwoup la te mouri (ki se pa vre). Sa a se dezavantaj prensipal la nan konplo gwoup nou an - se poutèt sa nou vle jwenn lwen li.

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Demann ki echwe ak yon erè yo remèt pa balanse a sou lòt serveurs.
Balansè a tou sispann voye trafik itilizatè a sèvè mouri, men li kontinye tcheke estati yo.

Lè sèvè a vin disponib, li kòmanse reponn a /ping. Le pli vit ke repons nòmal nan ping soti nan sèvè mouri kòmanse rive, balanse kòmanse voye trafik itilizatè la. Operasyon Cluster retabli, Hurray.

Menm pi mal: anpil serveurs pa disponib

Yon pati enpòtan nan serveurs yo nan sant done yo koupe. Ki sa yo dwe fè, ki kote yo kouri? Balansè a vin pote sekou ankò. Chak balanse toujou kenbe nan memwa kantite aktyèl la nan sèvè ap viv yo. Li toujou ap kalkile kantite maksimòm trafik ke sant done aktyèl la ka trete.

Lè anpil serveurs nan yon sant done desann, balans lan reyalize ke sant done sa a pa ka trete tout trafik la.

Lè sa a, trafik depase kòmanse ap distribye owaza nan lòt sant done. Tout bagay mache, tout moun kontan.

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Ki jan nou fè li: pibliye degaje

Koulye a, ann pale sou fason nou pibliye chanjman ki fèt nan sèvis la. Isit la nou te pran chemen an nan senplifye pwosesis: woule soti yon nouvo lage se prèske konplètman otomatize.
Lè yon sèten kantite chanjman yo akimile nan pwojè a, yon nouvo lage otomatikman kreye epi bati li yo kòmanse.

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Lè sa a, sèvis la woule soti nan tès, kote estabilite nan operasyon tcheke.

An menm tan an, tès pèfòmans otomatik yo te lanse. Sa a se okipe pa yon sèvis espesyal. Mwen pa pral pale sou li kounye a - deskripsyon li yo merite pou yon atik separe.

Si piblikasyon nan tès la reyisi, piblikasyon lage nan prestable kòmanse otomatikman. Prestable se yon gwoup espesyal kote trafik itilizatè nòmal dirije. Si li retounen yon erè, balanse a fè yon re-demann nan pwodiksyon an.

Nan prestable, tan repons yo mezire ak konpare ak lage anvan an nan pwodiksyon an. Si tout bagay anfòm, Lè sa a, yon moun konekte: tcheke graf yo ak rezilta tès chaj yo ak Lè sa a, kòmanse woule soti nan pwodiksyon an.

Tout pi bon an ale nan itilizatè a: tès A/B

Li pa toujou evidan si chanjman nan yon sèvis pral pote benefis reyèl. Pou mezire itilite chanjman yo, moun te vini ak tès A/B. Mwen pral di w yon ti kras sou ki jan li fonksyone nan rechèch Yandex.Market.

Li tout kòmanse ak ajoute yon nouvo paramèt CGI ki pèmèt nouvo fonksyonalite. Kite paramèt nou an: market_new_functionality=1. Lè sa a, nan kòd la nou pèmèt fonksyonalite sa a si drapo a prezan:

If (cgi.experiments.market_new_functionality) {
// enable new functionality
}

Nouvo fonksyonalite ap woule nan pwodiksyon an.

Pou otomatize tès A/B, gen yon sèvis devwe ki bay enfòmasyon detaye ki dekri isit la. Yon eksperyans kreye nan sèvis la. Se pataje trafik la mete, pou egzanp, 15%. Pousantaj yo fikse pa pou demann, men pou itilizatè yo. Se dire a nan eksperyans la tou endike, pou egzanp, yon semèn.

Plizyè eksperyans ka kouri ansanm. Nan anviwònman yo ou ka presize si entèseksyon ak lòt eksperyans posib.

Kòm yon rezilta, sèvis la otomatikman ajoute yon agiman market_new_functionality=1 a 15% itilizatè yo. Li tou otomatikman kalkile mezi yo chwazi yo. Apre eksperyans la fini, analis yo gade rezilta yo epi tire konklizyon. Dapre rezilta yo, yo pran yon desizyon pou woule nan pwodiksyon oswa rafineman.

Men abil mache a: tès nan pwodiksyon an

Li souvan rive ke ou bezwen teste operasyon an nan yon nouvo fonksyonalite nan pwodiksyon, men ou pa sèten ki jan li pral konpòte nan kondisyon "konba" anba chaj lou.

Gen yon solisyon: drapo nan paramèt CGI yo ka itilize pa sèlman pou tès A/B, men tou pou teste nouvo fonksyonalite.

Nou te fè yon zouti ki pèmèt ou imedyatman chanje konfigirasyon sou dè milye de sèvè san yo pa ekspoze sèvis la nan risk. Li rele Stop Tap. Lide orijinal la se te kapab byen vit enfim kèk fonksyonalite san yon Layout. Lè sa a, zouti a elaji e li te vin pi konplèks.

Dyagram koule sèvis la prezante anba a:

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Valè drapo yo mete atravè API a. Sèvis jesyon an estoke valè sa yo nan baz done a. Tout sèvè ale nan baz done a yon fwa chak dis segonn, ponpe valè drapo yo epi aplike valè sa yo nan chak demann.

Nan tiyo Stop la ou ka mete de kalite valè:

1) Ekspresyon kondisyonèl. Aplike lè youn nan valè yo se vre. Pa egzanp:

{
	"condition":"IS_DC1",
	"value":"3",
}, 
{
	"condition": "CLUSTER==2 and IS_BERU", 
	"value": "4!" 
}

Valè "3" yo pral aplike lè demann lan trete nan kote DC1. Ak valè a se "4" lè demann lan trete sou dezyèm gwoup la pou sit la beru.ru.

2) Valè san kondisyon. Aplike pa default si okenn nan kondisyon yo pa satisfè. Pa egzanp:

valè, valè!

Si yon valè fini ak yon pwen esklamasyon, yo bay li pi gwo priyorite.

Analizeur paramèt CGI analize URL la. Lè sa a, aplike valè yo nan Stop Tap la.

Yo aplike valè ak priyorite sa yo:

  1. Avèk plis priyorite nan Stop Tap la (mak esklamasyon).
  2. Valè a soti nan demann lan.
  3. Valè default soti nan Stop tap.
  4. Valè default nan kòd.

Gen anpil drapo ki endike nan valè kondisyonèl - yo ase pou tout senaryo nou konnen:

  • Sant done.
  • Anviwònman: pwodiksyon, tès, lonbraj.
  • Lokal: mache, beru.
  • Nimewo gwoup la.

Avèk zouti sa a, ou ka pèmèt nouvo fonksyonalite sou yon gwoup sèten nan sèvè (pa egzanp, nan yon sèl sant done) epi teste operasyon an nan fonksyonalite sa a san okenn risk patikilye nan tout sèvis la. Menm si ou te fè yon erè grav yon kote, tout bagay te kòmanse tonbe ak tout sant done a te desann, balanse yo pral redireksyon demann nan lòt sant done. Itilizatè fen yo pap remake anyen.

Si ou remake yon pwoblèm, ou ka imedyatman retounen drapo a nan valè anvan li epi chanjman yo pral woule tounen.

Sèvis sa a tou gen dezavantaj li yo: devlopè yo renmen li anpil e souvan eseye pouse tout chanjman yo nan Stop Tap la. Nou ap eseye konbat move itilizasyon.

Apwòch Stop Tap la ap travay byen lè w deja gen kòd ki estab ki pare pou w lage nan pwodiksyon an. An menm tan an, ou toujou gen dout, epi ou vle tcheke kòd la nan kondisyon "konba".

Sepandan, Stop Tap pa apwopriye pou tès pandan devlopman. Gen yon gwoup separe pou devlopè yo rele "gwoup lonbraj la".

Tès sekrè: Lonbraj Cluster

Demann ki soti nan youn nan grap yo double nan grap lonbraj la. Men, balanse a konplètman inyore repons ki soti nan gwoup sa a. Dyagram nan operasyon li yo prezante anba a.

Ki jan rechèch Yandex.Market travay ak sa k ap pase si youn nan serveurs yo echwe

Nou jwenn yon gwoup tès ki nan kondisyon reyèl "konba". Trafik itilizatè nòmal ale la. Materyèl la nan tou de grap yo se menm bagay la, kidonk pèfòmans ak erè yo ka konpare.

Epi depi balanse a konplètman inyore repons yo, itilizatè fen yo pa pral wè repons ki soti nan gwoup lonbraj la. Se poutèt sa, li pa pè fè yon erè.

Jwenn

Se konsa, ki jan nou te konstwi rechèch mache a?

Pou fè tout bagay ale fèt san pwoblèm, nou separe fonksyonalite nan sèvis separe. Nan fason sa a nou ka echèl sèlman eleman sa yo ke nou bezwen epi fè eleman yo pi senp. Li fasil pou asiyen yon eleman separe nan yon lòt ekip epi pataje responsablite yo pou travay sou li. Ak ekonomi enpòtan nan fè ak apwòch sa a se yon plis evidan.

Gwoup la lonbraj ede nou tou: nou ka devlope sèvis, teste yo nan pwosesis la epi yo pa deranje itilizatè a.

Oke, tès nan pwodiksyon, nan kou. Bezwen chanje konfigirasyon sou dè milye de serveurs? Fasil, sèvi ak Stop Tap la. Nan fason sa a ou ka imedyatman woule yon solisyon konplèks pare yo epi woule tounen nan yon vèsyon ki estab si pwoblèm rive.

Mwen espere ke mwen te kapab montre ki jan nou fè Mache a rapid ak ki estab ak yon baz ki toujou ap grandi nan òf. Ki jan nou rezoud pwoblèm sèvè, fè fas ak yon gwo kantite demann, amelyore fleksibilite nan sèvis la epi fè sa san yo pa entèwonp pwosesis travay yo.

Sous: www.habr.com

Add nouvo kòmantè