Reekri baz done mesaj VKontakte nan grafouyen epi siviv

Itilizatè nou yo ekri mesaj youn ak lòt san yo pa konnen fatig.
Reekri baz done mesaj VKontakte nan grafouyen epi siviv
Sa se byen anpil. Si ou tabli li tout mesaj tout itilizatè yo, sa ta pran plis pase 150 mil ane. Depi ke ou se yon lektè san patipri avanse epi pase pa plis pase yon segonn nan chak mesaj.

Avèk tankou yon volim nan done, li enpòtan pou lojik pou estoke ak aksè li yo bati optimal. Sinon, nan yon moman ki pa tèlman bèl bagay, li ka vin klè ke tout bagay pral byento ale mal.

Pou nou, moman sa a te rive yon ane edmi de sa. Ki jan nou te rive nan sa a ak sa ki te pase nan fen a - nou di ou nan lòd.

Istorik

Nan premye aplikasyon an, mesaj VKontakte te travay sou yon konbinezon de PHP backend ak MySQL. Sa a se yon solisyon konplètman nòmal pou yon sit entènèt ti elèv. Sepandan, sit sa a te grandi san kontwòl e li te kòmanse mande optimize estrikti done pou tèt li.

Nan fen 2009, premye repozitwa tèks-motè te ekri, ak nan 2010 mesaj yo te transfere nan li.

Nan motè tèks la, mesaj yo te estoke nan lis - yon kalite "bwat lèt". Chak lis sa yo detèmine pa yon uid - itilizatè a ki posede tout mesaj sa yo. Yon mesaj gen yon seri atribi: idantifyan entèrlokuteur, tèks, atachman, ak sou sa. Idantifyan mesaj ki anndan "bwat la" se local_id, li pa janm chanje epi yo asiyen li sekans pou nouvo mesaj. "Bwat" yo endepandan epi yo pa senkronize youn ak lòt andedan motè a; kominikasyon ant yo fèt nan nivo PHP. Ou ka gade estrikti done ak kapasite tèks-motè soti anndan an isit la.
Reekri baz done mesaj VKontakte nan grafouyen epi siviv
Sa a te ase pou korespondans ant de itilizatè. Devine kisa ki te pase apre?

Nan mwa me 2011, VKontakte te entwodui konvèsasyon ak plizyè patisipan-multi-chat. Pou travay avèk yo, nou te ogmante de nouvo gwoup - manm-chat ak chat-manb. Premye a estoke done sou chat pa itilizatè yo, dezyèm nan magazen done sou itilizatè pa chat. Anplis de lis yo tèt yo, sa a gen ladan, pou egzanp, itilizatè a envite ak lè yo te ajoute nan chat la.

"PHP, ann voye yon mesaj nan chat la," itilizatè a di.
"Vini non, {username}," di PHP.
Reekri baz done mesaj VKontakte nan grafouyen epi siviv
Gen dezavantaj nan konplo sa a. Synchronization se toujou responsablite PHP. Gwo chat ak itilizatè ki an menm tan voye mesaj ba yo se yon istwa danjere. Piske egzanp tèks-motè a depann de uid la, patisipan chat yo ka resevwa menm mesaj la nan diferan moman. Yon moun ta ka viv ak sa a si pwogrè te kanpe. Men, sa p ap rive.

Nan fen 2015, nou te lanse mesaj kominotè, e nan kòmansman 2016, nou te lanse yon API pou yo. Avèk avenman gwo chatbots nan kominote yo, li te posib pou bliye menm distribisyon chaj.

Yon bon bot jenere plizyè milyon mesaj pa jou - menm itilizatè ki pi pale yo pa ka vante tèt yo. Sa vle di ke kèk ka tèks-motè, sou ki robo sa yo te viv, yo te kòmanse soufri nan plen.

Motè mesaj an 2016 se 100 ka manm chat ak chat manm, ak 8000 motè tèks. Yo te anime sou mil serveurs, yo chak ak 64 GB memwa. Kòm yon premye mezi ijans, nou ogmante memwa a pa yon lòt 32 GB. Nou te estime prévisions yo. San chanjman radikal, sa a ta ase pou apeprè yon lòt ane. Ou bezwen swa jwenn pyès ki nan konpitè oswa optimize baz done yo tèt yo.

Akòz nati achitekti a, li sèlman fè sans pou ogmante pyès ki nan konpitè an miltip. Sa se, omwen double kantite machin - evidamman, sa a se yon chemen olye chè. Nou pral optimize.

Nouvo konsèp

Sans santral nouvo apwòch la se chat. Yon chat gen yon lis mesaj ki gen rapò ak li. Itilizatè a gen yon lis chat.

Minimòm obligatwa a se de nouvo baz done:

  • chat-motè. Sa a se yon depo vektè chat. Chak chat gen yon vektè mesaj ki gen rapò ak li. Chak mesaj gen yon tèks ak yon idantifyan mesaj inik andedan chat la - chat_local_id.
  • itilizatè-motè. Sa a se yon depo nan vektè itilizatè yo - lyen ki mennen nan itilizatè yo. Chak itilizatè gen yon vektè peer_id (entèrlokuteur - lòt itilizatè, milti-chat oswa kominote) ak yon vektè mesaj. Chak peer_id gen yon vektè mesaj ki gen rapò ak li. Chak mesaj gen yon chat_local_id ak yon ID mesaj inik pou itilizatè sa a - user_local_id.

Reekri baz done mesaj VKontakte nan grafouyen epi siviv
Nouvo grap yo kominike youn ak lòt lè l sèvi avèk TCP - sa a asire ke lòd la nan demann pa chanje. Demann yo tèt yo ak konfimasyon pou yo anrejistre sou kondwi a difisil - pou nou ka retabli eta a nan keu a nenpòt ki lè apre yon echèk oswa rekòmanse nan motè a. Depi itilizatè-motè a ak chat-motè se 4 mil shards chak, keu demann lan ant grap yo pral distribye respire (men an reyalite pa gen okenn nan tout - epi li travay trè vit).

Travay ak disk nan baz done nou yo nan pifò ka yo baze sou yon konbinezon de yon boutèy demi lit binè nan chanjman (binlog), snapshots estatik ak yon imaj pasyèl nan memwa. Chanjman pandan jounen an ekri nan yon binlog, epi yo kreye detanzantan yon snapshot nan eta aktyèl la. Yon snapshot se yon koleksyon estrikti done optimize pou rezon nou yo. Li konsiste de yon header (metaindex nan imaj la) ak yon seri metafichye. Se header la pou tout tan ki estoke nan RAM epi li endike ki kote yo gade pou done ki soti nan snapshot la. Chak metafichye gen ladan done ki gen anpil chans yo dwe bezwen nan pwen fèmen nan tan-pa egzanp, ki gen rapò ak yon sèl itilizatè. Lè w ap chèche baz done a lè l sèvi avèk header snapshot la, yo li metafile ki nesesè yo, epi apre sa yo pran an konsiderasyon chanjman nan binlog ki te fèt apre snapshot la te kreye. Ou ka li plis sou benefis apwòch sa a isit la.

An menm tan an, done yo sou kondwi a difisil chanje sèlman yon fwa pa jou - an reta nan mitan lannwit nan Moskou, lè chaj la se minim. Mèsi a sa a (konnen ke estrikti a sou disk la se konstan pandan tout jounen an), nou ka peye ranplase vektè ak etalaj nan yon gwosè fiks - ak akòz sa a, jwenn nan memwa.

Voye yon mesaj nan nouvo konplo a sanble sa a:

  1. Dèyè PHP a kontakte itilizatè-motè a ak yon demann pou voye yon mesaj.
  2. user-engine proxy demann lan nan egzanp chat-motè vle a, ki retounen nan user-engine chat_local_id - yon idantifyan inik nan yon nouvo mesaj nan chat sa a. Chat_engine a Lè sa a, emisyon mesaj la bay tout moun k ap resevwa nan chat la.
  3. user-engine resevwa chat_local_id nan chat-engine epi retounen user_local_id nan PHP - yon idantifyan mesaj inik pou itilizatè sa a. Lè sa a, idantifyan sa a itilize, pou egzanp, pou travay avèk mesaj atravè API a.

Reekri baz done mesaj VKontakte nan grafouyen epi siviv
Men, anplis aktyèlman voye mesaj, ou bezwen aplike kèk bagay ki pi enpòtan:

  • Soulis yo se, pou egzanp, mesaj ki pi resan ke ou wè lè w ap louvri lis konvèsasyon an. Mesaj ki poko li, mesaj ki gen tag ("Enpòtan", "Spam", elatriye).
  • Konpresyon mesaj nan chat-motè
  • Cache mesaj nan itilizatè-motè
  • Rechèch (atravè tout dyalòg ak nan yon sèl espesifik).
  • Aktyalizasyon an tan reyèl (Longpolling).
  • Ekonomize istwa pou aplike kachèt sou kliyan mobil.

Tout sublists yo ap chanje rapidman estrikti. Pou travay avèk yo nou itilize Splay pye bwa. Chwa sa a eksplike pa lefèt ke nan tèt pye bwa a pafwa nou estoke yon segman antye nan mesaj ki soti nan yon snapshot - pou egzanp, apre reindexing chak swa, pye bwa a konsiste de yon sèl tèt, ki gen tout mesaj yo nan sublist la. Pye bwa a Splay fè li fasil insert nan mitan an nan yon somè konsa san yo pa bezwen reflechi sou balanse. Anplis de sa, Splay pa estoke done ki pa nesesè, ki sove nou memwa.

Mesaj yo enplike yon gwo kantite enfòmasyon, sitou tèks, ki itil pou kapab konpresyon. Li enpòtan pou nou ka byen dezachiv menm yon sèl mesaj endividyèl. Yo itilize pou konprese mesaj yo Algorithm Huffman ak euristik pwòp nou yo - pou egzanp, nou konnen ke nan mesaj mo altène ak "ki pa mo" - espas, mak ponktiyasyon - epi nou sonje tou kèk nan sengularite yo nan sèvi ak senbòl pou lang Ris la.

Kòm gen anpil mwens itilizatè pase chat, pou konsève pou demann disk aksè o aza nan chat-engine, nou kache mesaj nan itilizatè-motè.

Rechèch mesaj aplike kòm yon rechèch dyagonal soti nan itilizatè-motè nan tout ka chat-motè ki genyen chat itilizatè sa a. Rezilta yo konbine nan itilizatè-motè a tèt li.

Oke, tout detay yo te pran an kont, tout sa ki rete se chanje nan yon nouvo konplo - e de preferans san itilizatè yo remake li.

Done migrasyon

Se konsa, nou gen yon tèks-motè ki magazen mesaj pa itilizatè, ak de gwoup chat-manm ak manm-chat ki estoke done sou chanm milti-chat ak itilizatè yo ki ladan yo. Ki jan yo deplase soti nan sa a nan nouvo itilizatè-motè a ak chat-motè?

manm-chat nan konplo a fin vye granmoun yo te itilize prensipalman pou optimize. Nou byen vit transfere done ki nesesè yo soti nan li nan chat-manm, epi Lè sa a, li pa patisipe ankò nan pwosesis migrasyon an.

Keu pou manm chat yo. Li gen ladan 100 ka, pandan y ap chat-motè gen 4 mil. Pou transfere done yo, ou bezwen pote li an konfòmite - pou sa a, chat-manm yo te divize an menm 4 mil kopi yo, ak Lè sa a, lekti nan chat-manm binlog la te pèmèt nan chat-motè a.
Reekri baz done mesaj VKontakte nan grafouyen epi siviv
Koulye a, chat-engine konnen sou milti-chat soti nan chat-manm, men li poko konnen anyen sou dyalòg ak de entèrlokuteur. Dyalòg sa yo sitiye nan motè tèks la ak referans a itilizatè yo. Isit la nou te pran done yo "tèt-sou": chak egzanp chat-motè mande tout ka tèks-motè si yo te gen dyalòg li te bezwen an.

Gwo - chat-engine konnen ki chat milti-chat ki genyen epi li konnen ki sa dyalòg ki genyen.
Ou bezwen konbine mesaj nan chat milti-chat pou ke ou fini ak yon lis mesaj nan chak chat. Premyèman, chat-engine rekipere nan tèks-motè tout mesaj itilizatè ki soti nan chat sa a. Nan kèk ka gen anpil nan yo (jiska dè santèn de milyon), men ak eksepsyon ki ra anpil chat la adapte antyèman nan RAM. Nou gen mesaj ki pa bay lòd, yo chak nan plizyè kopi - apre yo tout, yo tout rale soti nan diferan ka tèks-motè ki koresponn ak itilizatè yo. Objektif la se sòt mesaj epi debarase m de kopi ki pran espas ki pa nesesè.

Chak mesaj gen yon timestamp ki genyen lè li te voye a ak tèks. Nou itilize tan pou klasman - nou mete endikasyon sou pi ansyen mesaj patisipan multichat yo epi konpare hash soti nan tèks la nan kopi entansyon yo, deplase nan direksyon pou ogmante timestamp la. Li lojik ke kopi yo pral gen menm hash ak timestamp, men nan pratik sa a se pa toujou ka a. Kòm ou sonje, senkronizasyon nan konplo a fin vye granmoun te pote soti nan PHP - ak nan ka ki ra, tan an voye menm mesaj la diferan nan mitan itilizatè diferan. Nan ka sa yo, nou pèmèt tèt nou modifye timestamp la - anjeneral nan yon segonn. Dezyèm pwoblèm nan se lòd la diferan nan mesaj pou moun ki resevwa diferan. Nan ka sa yo, nou pèmèt yon kopi siplemantè yo dwe kreye, ak opsyon kòmande diferan pou itilizatè diferan.

Apre sa, done sou mesaj nan multichat yo voye bay itilizatè-motè a. Ak isit la vini yon karakteristik dezagreyab nan mesaj enpòte. Nan operasyon nòmal, mesaj ki vini nan motè a yo bay lòd estrikteman nan lòd monte pa user_local_id. Mesaj enpòte soti nan ansyen motè a nan itilizatè-motè a pèdi pwopriyete itil sa a. An menm tan an, pou konvenyans nan tès, ou bezwen kapab byen vit jwenn aksè nan yo, gade pou yon bagay nan yo epi ajoute nouvo.

Nou itilize yon estrikti done espesyal pou estoke mesaj enpòte.

Li reprezante yon vektè nan gwosè Reekri baz done mesaj VKontakte nan grafouyen epi sivivkote tout moun ye Reekri baz done mesaj VKontakte nan grafouyen epi siviv - yo diferan epi yo bay lòd nan lòd desandan, ak yon lòd espesyal nan eleman. Nan chak segman ak endis Reekri baz done mesaj VKontakte nan grafouyen epi siviv eleman yo klase. Chèche yon eleman nan yon estrikti konsa pran tan Reekri baz done mesaj VKontakte nan grafouyen epi siviv nan Reekri baz done mesaj VKontakte nan grafouyen epi siviv rechèch binè. Se adisyon a nan yon eleman amortize sou Reekri baz done mesaj VKontakte nan grafouyen epi siviv.

Se konsa, nou kalkile konnen ki jan yo transfere done ki soti nan ansyen motè nan nouvo. Men, pwosesis sa a pran plizyè jou - epi li se fasil ke pandan jou sa yo itilizatè nou yo pral abandone abitid pou yo ekri youn ak lòt. Pou nou pa pèdi mesaj pandan tan sa a, nou chanje nan yon konplo travay ki itilize tou de ansyen ak nouvo gwoup.

Done yo ekri nan chat-manm yo ak itilizatè-motè (epi yo pa nan tèks-motè, tankou nan operasyon nòmal selon konplo a fin vye granmoun). itilizatè-motè proxy demann lan nan chat-motè - e isit la konpòtman an depann de si chat sa a te deja fizyone oswa ou pa. Si chat la poko fizyone, chat-motè a pa ekri mesaj la nan tèt li, ak pwosesis li fèt sèlman nan tèks-motè a. Si chat la te deja fizyone nan chat-engine, li retounen chat_local_id nan user-engine epi voye mesaj la bay tout moun ki resevwa yo. itilizatè-motè proxy tout done nan tèks-motè - pou ke si yon bagay rive, nou ka toujou woule tounen, gen tout done aktyèl yo nan ansyen motè a. text-engine retounen user_local_id, ki itilizatè-motè sere epi retounen nan backend la.
Reekri baz done mesaj VKontakte nan grafouyen epi siviv
Kòm yon rezilta, pwosesis tranzisyon an sanble sa a: nou konekte itilizatè-motè vid ak gwoup chat-motè. chat-engine li tout binlog chat-manm yo, Lè sa a, proxy kòmanse dapre konplo ki dekri pi wo a. Nou transfere ansyen done yo epi jwenn de gwoup senkronize (ansyen ak nouvo). Tout sa ki rete se chanje lekti soti nan tèks-motè nan itilizatè-motè ak enfim proxy.

Jwenn

Mèsi a nouvo apwòch la, tout mezi pèfòmans motè yo te amelyore ak pwoblèm ak konsistans done yo te rezoud. Koulye a, nou ka byen vit aplike nouvo karakteristik nan mesaj (e nou deja kòmanse fè sa - nou ogmante kantite maksimòm patisipan chat, aplike yon rechèch pou voye mesaj, te lanse mesaj kole ak ogmante limit la sou kantite total mesaj pou chak itilizatè) .

Chanjman yo nan lojik yo vrèman menmen. Apre sa, mwen ta renmen sonje ke sa a pa toujou vle di ane antye nan devlopman pa yon ekip gwo ak myriads nan liy nan kòd. chat-motè ak itilizatè-motè ansanm ak tout istwa adisyonèl tankou Huffman pou konpresyon mesaj, pye bwa Splay ak estrikti pou mesaj enpòte se mwens pase 20 mil liy nan kòd. Epi yo te ekri pa 3 devlopè nan jis 10 mwa (sepandan, li vo kenbe nan tèt ou ke tout twa pwomotè - chanpyon mondyal nan pwogram espò).

Anplis, olye pou yo double kantite serveurs, nou redwi kantite yo a mwatye - kounye a itilizatè-motè a ak chat-motè ap viv sou 500 machin fizik, pandan y ap nouvo konplo a gen yon gwo espas pou chaj. Nou te sove anpil lajan sou ekipman - anviwon $5 milyon + $750 mil pa ane nan depans fonksyònman.

Nou fè efò pou jwenn pi bon solisyon pou pwoblèm ki pi konplèks ak gwo echèl. Nou gen anpil nan yo - e se poutèt sa nou ap chèche pou devlopè talan nan depatman baz done a. Si ou renmen ak konnen ki jan yo rezoud pwoblèm sa yo, gen yon konesans ekselan nan algoritm ak estrikti done, nou envite ou rantre nan ekip la. Kontakte nou HRpou detay.

Menm si istwa sa a pa sou ou, tanpri sonje ke nou apresye rekòmandasyon yo. Pale yon zanmi sou pòs vid pwomotè, epi si li konplete avèk siksè peryòd pwobasyon an, ou pral resevwa yon bonis nan 100 mil rubles.

Sous: www.habr.com

Add nouvo kòmantè