Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj

L-utenti tagħna jiktbu messaġġi lil xulxin mingħajr ma jkunu jafu għeja.
Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj
Dak huwa pjuttost ħafna. Jekk taħseb biex taqra l-messaġġi kollha tal-utenti kollha, tieħu aktar minn 150 elf sena. Sakemm inti qarrej pjuttost avvanzat u tonfoq mhux aktar minn sekonda fuq kull messaġġ.

B'tali volum ta 'data, huwa kritiku li l-loġika għall-ħażna u l-aċċess tagħha tinbena bl-aħjar mod. Inkella, f'mument wieħed mhux daqshekk meraviljuż, jista 'jidher ċar li kollox dalwaqt se jmur ħażin.

Għalina dan il-mument wasal sena u nofs ilu. Kif wasalna għal dan u x'ġara fl-aħħar - ngħidulkom fl-ordni.

Sfond

Fl-ewwel implimentazzjoni, il-messaġġi VKontakte ħadmu fuq taħlita ta 'backend PHP u MySQL. Din hija soluzzjoni kompletament normali għal websajt ta 'student żgħir. Madankollu, dan is-sit kiber bla kontroll u beda jitlob l-ottimizzazzjoni tal-istrutturi tad-dejta għalih innifsu.

Fl-aħħar tal-2009, inkiteb l-ewwel repożitorju tal-magna tat-test, u fl-2010 ġew trasferiti lilha messaġġi.

Fil-magna tat-test, il-messaġġi kienu maħżuna f'listi - tip ta '"kaxxi tal-posta". Kull lista bħal din hija determinata minn uid - l-utent li jippossjedi dawn il-messaġġi kollha. Messaġġ għandu sett ta’ attributi: identifikatur tal-interlokutur, test, attachments, eċċ. L-identifikatur tal-messaġġ ġewwa l-"kaxxa" huwa local_id, qatt ma jinbidel u huwa assenjat b'mod sekwenzjali għal messaġġi ġodda. Il-"kaxxi" huma indipendenti u mhumiex sinkronizzati ma' xulxin ġewwa l-magna; il-komunikazzjoni bejniethom isseħħ fil-livell PHP. Tista 'tħares lejn l-istruttura tad-data u l-kapaċitajiet tat-test-magna minn ġewwa hawn.
Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj
Dan kien biżżejjed għal korrispondenza bejn żewġ utenti. Aqta x'ġara wara?

F'Mejju 2011, VKontakte introduċa konversazzjonijiet ma 'diversi parteċipanti—multi-chat. Biex naħdmu magħhom, qajjna żewġ clusters ġodda - membri-chats u chat-members. L-ewwel wieħed jaħżen dejta dwar iċ-chats mill-utenti, it-tieni jaħżen dejta dwar l-utenti permezz taċ-chats. Minbarra l-listi nfushom, dan jinkludi, pereżempju, l-utent li stieden u l-ħin li jkunu ġew miżjuda maċ-chat.

"PHP, ejja nibagħtu messaġġ liċ-chat," jgħid l-utent.
"Ejja, {username}," jgħid PHP.
Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj
Hemm żvantaġġi għal din l-iskema. Is-sinkronizzazzjoni għadha r-responsabbiltà tal-PHP. Chats kbar u utenti li fl-istess ħin jibagħtu messaġġi lilhom huma storja perikoluża. Peress li l-istanza tal-magna tat-test tiddependi fuq l-uid, il-parteċipanti taċ-chat jistgħu jirċievu l-istess messaġġ f'ħinijiet differenti. Wieħed jista 'jgħix b'dan jekk il-progress kien għadu. Imma dan mhux se jiġri.

Fl-aħħar tal-2015, nedejna messaġġi komunitarji, u fil-bidu tal-2016, nedejna API għalihom. Bil-miġja ta 'chatbots kbar fil-komunitajiet, kien possibbli li tinsa dwar id-distribuzzjoni uniformi tat-tagħbija.

Bot tajjeb jiġġenera bosta miljuni messaġġi kuljum - anke l-utenti l-aktar li jitkellmu ma jistgħux jiftaħar b'dan. Dan ifisser li xi każijiet ta 'test-engine, li fuqhom għexu bots bħal dawn, bdew ibatu bis-sħiħ.

Il-magni tal-messaġġi fl-2016 huma 100 każ ta' membri taċ-chat u chats tal-membri, u 8000 magna tat-test. Kienu ospitati fuq elf server, kull wieħed b'64 GB ta 'memorja. Bħala l-ewwel miżura ta’ emerġenza, żidna l-memorja b’32 GB oħra. Stmajna t-tbassir. Mingħajr bidliet drastiċi, dan ikun biżżejjed għal madwar sena oħra. Ikollok bżonn jew tikseb il-ħardwer jew tottimizza d-databases infushom.

Minħabba n-natura tal-arkitettura, jagħmel sens biss li jiżdied il-ħardwer f'multipli. Jiġifieri, mill-inqas jirdoppja n-numru ta 'karozzi - ovvjament, din hija triq pjuttost għalja. Aħna se ottimizzaw.

Kunċett ġdid

L-essenza ċentrali tal-approċċ il-ġdid hija ċ-chat. A chat għandha lista ta 'messaġġi li għandhom x'jaqsmu magħha. L-utent għandu lista ta' chats.

Il-minimu meħtieġ huwa żewġ databases ġodda:

  • chat-magna. Dan huwa repożitorju ta' chat vectors. Kull chat għandha vettur ta' messaġġi li għandhom x'jaqsmu magħha. Kull messaġġ għandu test u identifikatur uniku tal-messaġġ ġewwa ċ-chat - chat_local_id.
  • utent-magna. Din hija ħażna ta 'vettori tal-utenti - links għall-utenti. Kull utent għandu vettur ta' peer_id (interlokuturi - utenti oħra, multi-chat jew komunitajiet) u vettur ta' messaġġi. Kull peer_id għandu vettur ta' messaġġi li għandhom x'jaqsmu miegħu. Kull messaġġ għandu chat_local_id u ID tal-messaġġ uniku għal dak l-utent - user_local_id.

Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj
Raggruppamenti ġodda jikkomunikaw bejniethom billi jużaw TCP - dan jiżgura li l-ordni tat-talbiet ma tinbidilx. It-talbiet infushom u l-konfermi għalihom huma rreġistrati fuq il-hard drive - sabiex inkunu nistgħu nirrestawraw l-istat tal-kju fi kwalunkwe ħin wara ħsara jew startjar mill-ġdid tal-magna. Peress li l-magna tal-utent u l-magna taċ-chat huma 4 elf shards kull wieħed, il-kju tat-talba bejn ir-raggruppamenti se jitqassam b'mod ugwali (iżda fir-realtà m'hemm xejn - u jaħdem malajr ħafna).

Il-ħidma mad-disk fid-databases tagħna fil-biċċa l-kbira tal-każijiet hija bbażata fuq kombinazzjoni ta 'ġurnal binarju ta' bidliet (binlog), snapshots statiċi u immaġni parzjali fil-memorja. Il-bidliet matul il-ġurnata jinkitbu f'binlog, u tinħoloq perjodikament stampa tal-istat attwali. Snapshot hija ġabra ta' strutturi ta' dejta ottimizzati għall-iskopijiet tagħna. Tikkonsisti f'header (metaindiċi tal-immaġni) u sett ta' metafiles. L-intestatura hija maħżuna b'mod permanenti fir-RAM u tindika fejn trid tfittex dejta mill-istampa. Kull metafile jinkludi data li x'aktarx tkun meħtieġa f'punti mill-qrib fil-ħin—per eżempju, relatata ma' utent wieħed. Meta tagħmel mistoqsija fuq id-database billi tuża l-header tal-istampa, jinqara l-metafile meħtieġ, u mbagħad jitqiesu l-bidliet fil-binlog li seħħew wara li nħolqot l-istampa. Tista 'taqra aktar dwar il-benefiċċji ta' dan l-approċċ hawn.

Fl-istess ħin, id-dejta fuq il-hard drive innifsu tinbidel darba biss kuljum - tard bil-lejl f'Moska, meta t-tagħbija tkun minima. Grazzi għal dan (li nafu li l-istruttura fuq id-diska hija kostanti matul il-ġurnata), nistgħu nibdlu l-vettori b'arrays ta 'daqs fiss - u minħabba dan, niksbu fil-memorja.

Li tibgħat messaġġ fl-iskema l-ġdida tidher bħal din:

  1. Il-backend PHP jikkuntattja lill-utent-magna b'talba biex jibgħat messaġġ.
  2. user-engine iressaq it-talba lill-istanza mixtieqa tal-magna taċ-chat, li terġa' lura għal user-engine chat_local_id - identifikatur uniku ta' messaġġ ġdid fi ħdan dan iċ-chat. Iċ-chat_engine imbagħad ixandar il-messaġġ lir-riċevituri kollha fiċ-chat.
  3. user-engine jirċievi chat_local_id minn chat-engine u jirritorna user_local_id lil PHP - identifikatur uniku tal-messaġġ għal dan l-utent. Dan l-identifikatur imbagħad jintuża, pereżempju, biex jaħdem b'messaġġi permezz tal-API.

Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj
Iżda minbarra li fil-fatt tibgħat messaġġi, trid timplimenta ftit affarijiet aktar importanti:

  • Is-sottolisti huma, pereżempju, l-aktar messaġġi reċenti li tara meta tiftaħ il-lista tal-konversazzjonijiet. Messaġġi mhux moqrija, messaġġi b'tikketti (“Importanti”, “Spam”, eċċ.).
  • Kompressjoni ta' messaġġi fiċ-chat-engine
  • Caching messaġġi fl-utent-magna
  • Fittex (permezz tad-djalogi kollha u f'wieħed speċifiku).
  • Aġġornament f'ħin reali (Longpolling).
  • Iffrankar tal-istorja biex timplimenta l-caching fuq klijenti mobbli.

Is-sublisti kollha qed jinbidlu malajr strutturi. Biex naħdmu magħhom nużaw Splay siġar. Din l-għażla hija spjegata mill-fatt li fil-quċċata tas-siġra kultant naħżnu segment sħiħ ta 'messaġġi minn snapshot - per eżempju, wara l-indiċjar mill-ġdid ta' kull filgħaxija, is-siġra tikkonsisti f'wiċċ wieħed, li fih il-messaġġi kollha tas-sublista. Is-siġra Splay tagħmilha faċli biex tiddaħħal fin-nofs ta 'vertiċi bħal dan mingħajr ma jkollok għalfejn taħseb dwar l-ibbilanċjar. Barra minn hekk, Splay ma jaħżenx data mhux meħtieġa, li jiffranka l-memorja.

Il-messaġġi jinvolvu ammont kbir ta 'informazzjoni, l-aktar test, li huwa utli biex tkun tista' tikkompressa. Huwa importanti li nistgħu nneħħu l-arkivju b'mod preċiż anki messaġġ individwali wieħed. Użat biex tikkompressa messaġġi Algoritmu Huffman bl-euristika tagħna stess - pereżempju, nafu li fil-messaġġi l-kliem jalternaw ma '"mhux kliem" - spazji, marki tal-punteġġjatura - u niftakru wkoll xi wħud mill-karatteristiċi tal-użu ta' simboli għall-lingwa Russa.

Peress li hemm ħafna inqas utenti minn chats, biex niffrankaw it-talbiet ta 'disk ta' aċċess bl-addoċċ fiċ-chat-engine, aħna nżommu messaġġi fil-cache fl-utent-magna.

It-tfittxija tal-messaġġi hija implimentata bħala mistoqsija djagonali mill-magna tal-utent għall-istanzi kollha tal-magna taċ-chat li fihom chats ta' dan l-utent. Ir-riżultati huma kkombinati fil-magna tal-utent innifsu.

Ukoll, id-dettalji kollha tqiesu, kulma fadal huwa li jaqilbu għal skema ġdida - u preferibbilment mingħajr ma l-utenti jinnutawha.

Migrazzjoni tad-dejta

Għalhekk, għandna magna tat-test li taħżen messaġġi skont l-utent, u żewġ gruppi ta 'membri taċ-chat u chats tal-membri li jaħżnu dejta dwar kmamar multi-chat u l-utenti fihom. Kif timxi minn dan għall-utent-magna l-ġdida u l-magna taċ-chat?

membri-chats fl-iskema l-antika intużaw primarjament għall-ottimizzazzjoni. Aħna malajr ittrasferijna d-dejta meħtieġa minnha lill-membri taċ-chat, u mbagħad ma pparteċipax aktar fil-proċess tal-migrazzjoni.

Kju għall-membri taċ-chat. Jinkludi 100 każ, filwaqt li chat-engine għandu 4 elf. Biex tittrasferixxi d-data, għandek bżonn ġġibha f'konformità - għal dan, il-membri taċ-chat ġew maqsuma fl-istess 4 elf kopja, u mbagħad il-qari tal-binlog tal-membri taċ-chat ġie attivat fil-magna taċ-chat.
Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj
Issa chat-engine jaf dwar multi-chat minn membri taċ-chat, iżda għadu ma jaf xejn dwar djalogi ma' żewġ interlokuturi. Tali djalogi jinsabu fil-magna tat-test b'referenza għall-utenti. Hawnhekk ħadna d-data "head-on": kull istanza tal-magna taċ-chat staqsiet lill-istanzi kollha tal-magna tat-test jekk kellhomx id-djalogu li kien meħtieġ.

Kbir - chat-engine jaf x'chats multi-chat hemm u jaf x'djalogi hemm.
Ikollok bżonn tgħaqqad messaġġi f'chats multi-chat sabiex tispiċċa b'lista ta 'messaġġi f'kull chat. L-ewwel, chat-engine jirkupra minn text-engine il-messaġġi kollha tal-utent minn dan iċ-chat. F'xi każijiet hemm ħafna minnhom (sa mijiet ta 'miljuni), iżda b'eċċezzjonijiet rari ħafna ċ-chat jidħol kompletament fir-RAM. Għandna messaġġi mhux ordnati, kull wieħed f'bosta kopji - wara kollox, huma kollha miġbuda minn każijiet differenti ta' magni tat-test li jikkorrispondu għall-utenti. L-għan huwa li ssolvi l-messaġġi u teħles minn kopji li jieħdu spazju mhux meħtieġ.

Kull messaġġ għandu timestamp li fih il-ħin li fih intbagħat u t-test. Aħna nużaw il-ħin għall-issortjar - aħna npoġġu indikaturi għall-eqdem messaġġi tal-parteċipanti multichat u nqabblu l-hashes mit-test tal-kopji maħsuba, nimxu lejn iż-żieda tat-timestamp. Huwa loġiku li l-kopji se jkollhom l-istess hash u timestamp, iżda fil-prattika dan mhux dejjem ikun il-każ. Kif tiftakar, is-sinkronizzazzjoni fl-iskema l-antika twettqet minn PHP - u f'każijiet rari, il-ħin li jintbagħat l-istess messaġġ kien differenti fost utenti differenti. F'dawn il-każijiet, ħallejna lilna nfusna neditjaw il-timestamp - ġeneralment fi żmien sekonda. It-tieni problema hija l-ordni differenti tal-messaġġi għal riċevituri differenti. F'każijiet bħal dawn, ippermettejna li tinħoloq kopja żejda, b'għażliet ta' ordni differenti għal utenti differenti.

Wara dan, id-dejta dwar il-messaġġi f'multichat tintbagħat lill-magna tal-utent. U hawnhekk tidħol karatteristika spjaċevoli ta 'messaġġi importati. F'operazzjoni normali, messaġġi li jaslu għall-magna huma ordnati strettament f'ordni axxendenti minn user_local_id. Messaġġi importati mill-magna l-antika fil-magna tal-utent tilfu din il-proprjetà utli. Fl-istess ħin, għall-konvenjenza tal-ittestjar, trid tkun tista 'taċċessahom malajr, tfittex xi ħaġa fihom u żżid oħrajn ġodda.

Aħna nużaw struttura speċjali tad-dejta biex naħżnu messaġġi importati.

Jirrappreżenta vettur ta 'daqs Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħajfejn kulhadd Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj - huma differenti u ordnati f'ordni dixxendenti, b'ordni speċjali ta' elementi. F'kull segment b'indiċi Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj elementi huma magħżula. It-tfittxija għal element fi struttura bħal din tieħu ż-żmien Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj permezz Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj tfittxijiet binarji. Iż-żieda ta' element hija ammortizzata fuq Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj.

Allura, aħna dehret kif tittrasferixxi data minn magni qodma għal oħrajn ġodda. Iżda dan il-proċess jieħu diversi jiem - u huwa improbabbli li matul dawn il-jiem l-utenti tagħna se jċedu l-vizzju li jiktbu lil xulxin. Sabiex ma nitilfux messaġġi matul dan iż-żmien, naqilbu għal skema ta’ ħidma li tuża kemm clusters qodma kif ukoll ġodda.

Id-dejta tinkiteb lill-membri taċ-chat u lill-magna tal-utent (u mhux lill-magna tat-test, bħal f'operazzjoni normali skont l-iskema l-antika). user-engine iressaq it-talba għal chat-engine - u hawnhekk l-imġieba tiddependi fuq jekk dan iċ-chat diġà ġiex magħqud jew le. Jekk iċ-chat għadu ma ġiex magħqud, iċ-chat-engine ma jiktebx il-messaġġ għalih innifsu, u l-ipproċessar tiegħu jseħħ biss fit-test-engine. Jekk iċ-chat diġà ġie magħqud f'chat-engine, jirritorna chat_local_id lill-user-engine u jibgħat il-messaġġ lir-riċevituri kollha. user-engine jipproduċi d-data kollha għal text-engine - sabiex jekk jiġri xi ħaġa, aħna dejjem nistgħu nerġgħu lura, wara li d-data attwali kollha fil-magna l-antika. text-engine jirritorna user_local_id, li user-engine jaħżen u jirritorna lill-backend.
Ikteb mill-ġdid id-database tal-messaġġi VKontakte mill-bidu u ħaj
Bħala riżultat, il-proċess ta 'tranżizzjoni jidher bħal dan: aħna nikkonnettjaw clusters vojta tal-magna tal-utent u taċ-chat. chat-engine jaqra l-binlog kollu tal-membri taċ-chat, imbagħad jibda l-proxying skont l-iskema deskritta hawn fuq. Nitrasferixxu d-dejta l-antika u nġibu żewġ gruppi sinkronizzati (qodma u ġodda). Jibqa' biss li taqleb il-qari minn magna tat-test għal magna tal-utent u tiddiżattiva l-proxying.

Sejbiet

Grazzi għall-approċċ il-ġdid, il-metriċi kollha tal-prestazzjoni tal-magni ġew imtejba u l-problemi bil-konsistenza tad-dejta ġew solvuti. Issa nistgħu nimplimentaw malajr karatteristiċi ġodda fil-messaġġi (u diġà bdejna nagħmlu dan - żidna n-numru massimu ta 'parteċipanti taċ-chat, implimentajna tfittxija għal messaġġi mgħoddija, nedejna messaġġi ippinjat u għollejna l-limitu fuq in-numru totali ta' messaġġi għal kull utent) .

Il-bidliet fil-loġika huma tassew enormi. U nixtieq ninnota li dan mhux dejjem ifisser snin sħaħ ta 'żvilupp minn tim enormi u numru kbir ta' linji ta 'kodiċi. chat-engine u user-engine flimkien ma 'l-istejjer addizzjonali kollha bħal Huffman għall-kompressjoni tal-messaġġ, siġar Splay u l-istruttura għall-messaġġi importati hija inqas minn 20 elf linja ta' kodiċi. U nkitbu minn 3 żviluppaturi f'10 xhur biss (madankollu, ta' min iżomm f'moħħu li kollha 3 żviluppatur - champions tad-dinja fil-programmazzjoni sportiva).

Barra minn hekk, minflok irduppjaw in-numru ta' servers, naqqasna n-numru tagħhom bin-nofs - issa l-magna tal-utent u l-magna taċ-chat jgħixu fuq 500 magna fiżika, filwaqt li l-iskema l-ġdida għandha spazju kbir għat-tagħbija. Ffrankajna ħafna flus fuq it-tagħmir - madwar $ 5 miljun + $ 750 elf fis-sena fi spejjeż operattivi.

Aħna nistinkaw biex insibu l-aħjar soluzzjonijiet għall-aktar problemi kumplessi u fuq skala kbira. Għandna ħafna minnhom - u għalhekk qed infittxu żviluppaturi b'talent fid-dipartiment tad-database. Jekk tħobb u taf kif issolvi problemi bħal dawn, għandek għarfien eċċellenti ta 'algoritmi u strutturi tad-dejta, nistednuk tingħaqad mat-tim. Ikkuntattja tagħna HRgħad-dettalji.

Anke jekk din l-istorja mhix dwarek, jekk jogħġbok innota li aħna napprezzaw ir-rakkomandazzjonijiet. Għid lil ħabib dwar postijiet vakanti għall-iżviluppatur, u jekk itemm b'suċċess il-perjodu ta 'prova, inti tirċievi bonus ta' 100 elf rublu.

Sors: www.habr.com

Żid kumment