FAQ sou achitekti ak travay VKontakte

Istwa kreyasyon VKontakte se sou Wikipedya, Pavel li menm te di l. Sanble tout moun konnen li deja. Konsènan entèn yo, achitekti ak estrikti sit la sou HighLoad++ Pavel te di m 'an 2010. Anpil serveurs te koule depi lè sa a, kidonk nou pral mete ajou enfòmasyon yo: nou pral diseke li, retire anndan yo, peze li, epi gade nan aparèy la VK nan yon pwen de vi teknik.

FAQ sou achitekti ak travay VKontakte

Alexey Akulovich (AterCattus) devlopè backend nan ekip VKontakte. Transkripsyon rapò sa a se yon repons kolektif pou kesyon yo poze souvan sou operasyon platfòm la, enfrastrikti, sèvè ak entèraksyon ant yo, men se pa sou devlopman, sètadi. sou fè. Separeman, sou baz done ak sa VK genyen olye de sa, sou kolekte mòso bwa ak siveyans tout pwojè a kòm yon antye. Detay anba koupe a.



Pou plis pase kat ane mwen te fè fas ak tout kalite travay ki gen rapò ak backend la.

  • Telechaje, estoke, trete, distribye medya: videyo, difizyon ap viv, odyo, foto, dokiman.
  • Enfrastrikti, platfòm, siveyans pwomotè, mòso bwa, kachèt rejyonal, CDN, pwotokòl RPC propriétaires.
  • Entegrasyon ak sèvis ekstèn: notifikasyon pouse, analiz lyen ekstèn, RSS feed.
  • Ede kòlèg yo ak plizyè kesyon, repons yo mande pou plonje nan kòd enkoni.

Pandan tan sa a, mwen te gen yon men nan anpil eleman nan sit la. Mwen vle pataje eksperyans sa a.

Achitekti jeneral

Tout bagay, kòm dabitid, kòmanse ak yon sèvè oswa yon gwoup serveurs ki aksepte demann.

Sèvè devan

Sèvè devan an aksepte demann atravè HTTPS, RTMP ak WSS.

T - sa yo se demann pou vèsyon prensipal yo ak mobil sit la: vk.com ak m.vk.com, ak lòt kliyan ofisyèl ak ofisyèl nan API nou an: kliyan mobil, mesaje. Nou gen yon resepsyon RTMP-trafik pou emisyon Live ak sèvè devan separe ak WSS-koneksyon pou API Streaming.

Pou HTTPS ak WSS sou serveurs li vo nginx. Pou emisyon RTMP, nou fèk chanje nan pwòp solisyon nou an kive, men li depase limit rapò a. Pou tolerans fòt, serveurs sa yo fè piblisite adrès IP komen yo epi yo aji an gwoup pou si gen yon pwoblèm sou youn nan serveurs yo, demann itilizatè yo pa pèdi. Pou HTTPS ak WSS, menm sèvè sa yo ankripte trafik yo nan lòd yo pran yon pati nan chaj CPU a sou tèt yo.

Nou pa pral pale plis sou WSS ak RTMP, men sèlman sou demann HTTPS estanda, ki anjeneral ki asosye ak yon pwojè entènèt.

backend

Dèyè devan an anjeneral gen serveurs backend. Yo trete demann ke sèvè devan an resevwa nan men kliyan yo.

Li kPHP serveurs, kote HTTP demon an ap kouri, paske HTTPS deja dechifre. kPHP se yon sèvè ki kouri sou modèl prefork: kòmanse yon pwosesis mèt, yon pakèt moun pwosesis timoun, pase sockets koute yo epi yo trete demann yo. Nan ka sa a, pwosesis yo pa rekòmanse ant chak demann ki soti nan itilizatè a, men tou senpleman retabli eta yo nan eta orijinal zewo-valè - demann apre demann, olye pou yo rekòmanse.

Distribisyon chaj

Tout backend nou yo se pa yon gwo pisin machin ki ka trete nenpòt demann. Nou yo divize an gwoup separe: jeneral, mobil, api, videyo, staging... Pwoblèm nan sou yon gwoup separe de machin pa pral afekte tout lòt moun. Nan ka ta gen pwoblèm ak videyo, itilizatè a ki koute mizik pa pral menm konnen sou pwoblèm yo. Ki backend pou voye demann lan deside pa nginx sou devan dapre konfigirasyon an.

Koleksyon metrik ak rebalansman

Pou konprann konbyen machin nou bezwen genyen nan chak gwoup, nou pa konte sou QPS. Backends yo diferan, yo gen diferan demann, chak demann gen yon konpleksite diferan nan kalkile QPS. Se poutèt sa nou nou opere ak konsèp nan chaj sou sèvè a kòm yon antye - sou CPU a ak perf.

Nou gen dè milye de serveurs sa yo. Chak sèvè fizik kouri yon gwoup kPHP pou resikle tout nwayo yo (paske kPHP se yon sèl fil).

Sèvè kontni

CS oswa Content Server se yon depo. CS se yon sèvè ki estoke fichye epi tou li trete dosye ki telechaje yo ak tout kalite travay synchronous background ke entèfas entènèt prensipal la bay li.

Nou gen dè dizèn de milye de serveurs fizik ki estoke dosye. Itilizatè yo renmen telechaje fichye yo, epi nou renmen sere yo epi pataje yo. Kèk nan serveurs sa yo fèmen pa serveurs espesyal pu/pp.

pu/pp

Si ou louvri tab rezo a nan VK, ou te wè pu/pp.

FAQ sou achitekti ak travay VKontakte

Ki sa ki pu/pp? Si nou fèmen yon sèvè apre lòt, Lè sa a, gen de opsyon pou telechaje ak telechaje yon dosye sou sèvè a ki te fèmen: dirèkteman nan http://cs100500.userapi.com/path oswa atravè sèvè entèmedyè - http://pu.vk.com/c100500/path.

Pu se non istorik pou telechaje foto, ak pp se foto proxy. Sa vle di, yon sèvè se pou telechaje foto, ak yon lòt se pou telechaje. Koulye a, pa sèlman foto yo chaje, men non an te konsève.

Serveurs sa yo mete fen nan sesyon HTTPS yoyo retire chaj la processeur nan depo a. Epitou, depi dosye itilizatè yo trete sou serveurs sa yo, enfòmasyon yo mwens sansib ki estoke sou machin sa yo, pi bon an. Pou egzanp, kle cryptage HTTPS.

Depi machin yo fèmen pa lòt machin nou yo, nou ka peye pa ba yo "blan" IP ekstèn, ak bay "gri". Fason sa a nou te sove sou pisin IP ak garanti pou pwoteje machin yo soti deyò aksè - pa gen tou senpleman IP pou antre nan li.

Rezilyans sou IP pataje. An tèm de tolerans fòt, konplo a travay menm jan an - plizyè serveurs fizik gen yon IP fizik komen, ak pyès ki nan konpitè devan yo chwazi ki kote yo voye demann lan. Mwen pral pale sou lòt opsyon pita.

Pwen kontwovèsyal la se ke nan ka sa a kliyan an kenbe mwens koneksyon. Si gen menm IP pou plizyè machin - ak menm lame a: pu.vk.com oswa pp.vk.com, navigatè kliyan an gen yon limit sou kantite demann similtane nan yon sèl lame. Men, nan tan an nan HTTP/2 omniprésente, mwen kwè ke sa a pa enpòtan ankò.

Dezavantaj nan evidan nan konplo a se ke li gen ponpe tout trafik, ki ale nan depo a, atravè yon lòt sèvè. Piske nou ponpe trafik atravè machin, nou pa ka ankò ponpe trafik lou, pa egzanp, videyo, lè l sèvi avèk menm schema. Nou transmèt li dirèkteman - yon koneksyon dirèk separe pou depo separe espesyalman pou videyo. Nou transmèt kontni pi lejè atravè yon prokurasyon.

Sa pa gen lontan nou te resevwa yon vèsyon amelyore nan proxy. Koulye a, mwen pral di ou ki jan yo diferan de sa yo òdinè ak poukisa sa nesesè.

Solèy

Nan mwa septanm 2017, Oracle, ki te deja achte Sun, revoke yon gwo kantite anplwaye Sun. Nou ka di ke nan moman sa a konpayi an sispann egziste. Lè yo te chwazi yon non pou nouvo sistèm nan, administratè nou yo te deside rann omaj sou memwa konpayi sa a epi yo te rele nouvo sistèm nan Sun. Nan mitan nou nou tou senpleman rele li "solèy".

FAQ sou achitekti ak travay VKontakte

pp te gen kèk pwoblèm. Yon IP pou chak gwoup - kachèt inefikas. Plizyè serveurs fizik pataje yon adrès IP komen, epi pa gen okenn fason pou kontwole ki sèvè demann lan pral ale. Se poutèt sa, si itilizatè diferan vini pou menm dosye a, Lè sa a, si gen yon kachèt sou serveurs sa yo, dosye a fini nan kachèt chak sèvè. Sa a se yon konplo trè efikas, men pa gen anyen ka fè.

An konsekans - nou pa kapab shard kontni, paske nou pa ka chwazi yon sèvè espesifik pou gwoup sa a - yo gen yon IP komen. Epitou pou kèk rezon entèn nou genyen li pa t posib pou yo enstale serveurs sa yo nan rejyon yo. Yo te kanpe sèlman nan Saint Petersburg.

Avèk solèy yo, nou chanje sistèm seleksyon an. Kounye a nou genyen anycast routage: routage dinamik, anycast, oto-tcheke demon. Chak sèvè gen pwòp IP endividyèl li yo, men yon subnet komen. Tout se configuré nan yon fason ke si yon sèvè echwe, trafik la gaye atravè lòt sèvè yo nan menm gwoup la otomatikman. Koulye a, li posib yo chwazi yon sèvè espesifik, pa gen okenn kachèt redondants, ak fyab pa te afekte.

Sipò pou pwa. Koulye a, nou ka peye pou enstale machin ki gen diferan pouvwa jan sa nesesè, epi tou, nan ka ta gen pwoblèm tanporè, chanje pwa yo nan "solèy yo" k ap travay diminye chaj la sou yo, pou yo "repoze" epi yo kòmanse travay ankò.

Sharding pa idantifikasyon kontni. Yon bagay komik sou sharding: anjeneral nou shard kontni pou itilizatè diferan ale nan menm dosye a atravè menm "solèy la" pou yo gen yon kachèt komen.

Nou fèk lanse aplikasyon "Clover". Sa a se yon egzamen sou entènèt nan yon emisyon an dirèk, kote animatè a poze kesyon ak itilizatè yo reponn an tan reyèl, chwazi opsyon. Aplikasyon an gen yon chat kote itilizatè yo ka chat. Ka ansanm konekte ak emisyon an plis pase 100 mil moun. Yo tout ekri mesaj ke yo voye bay tout patisipan yo, ak yon avatar vini ansanm ak mesaj la. Si 100 mil moun vini pou yon sèl avatar nan yon sèl "solèy", Lè sa a, li ka pafwa woule dèyè yon nwaj.

Yo nan lòd yo kenbe tèt ak pete nan demann pou menm dosye a, se pou yon sèten kalite kontni ke nou vire sou yon konplo estipid ki gaye dosye atravè tout "solèy" ki disponib nan rejyon an.

Solèy soti anndan an

Ranvèse proxy sou nginx, kachèt swa nan RAM oswa sou vit Optane / NVMe disk. Egzanp: http://sun4-2.userapi.com/c100500/path — yon lyen ki mennen nan "solèy la", ki sitiye nan katriyèm rejyon an, dezyèm gwoup sèvè a. Li fèmen dosye chemen an, ki fizikman kouche sou sèvè 100500.

Cache

Nou ajoute yon lòt ne nan konplo achitekti nou an - anviwònman an kachèt.

FAQ sou achitekti ak travay VKontakte

Anba a se dyagram nan layout kachèt rejyonal yo, gen anviwon 20 ladan yo. Sa yo se kote yo kote kachèt ak "solèy" yo sitiye, ki ka kachèt trafik nan tèt yo.

FAQ sou achitekti ak travay VKontakte

Sa a se kachèt kontni miltimedya; pa gen okenn done itilizatè ki estoke isit la - jis mizik, videyo, foto.

Pou detèmine rejyon itilizatè a, nou nou kolekte prefiks rezo BGP yo anonse nan rejyon yo. Nan ka a nan repli, nou gen tou analize baz done a geoip si nou pa t 'kapab jwenn IP a pa prefiks. Nou detèmine rejyon an pa IP itilizatè a. Nan kòd la, nou ka gade youn oswa plizyè rejyon itilizatè a - pwen sa yo kote li pi pre jeyografikman.

Kouman li travay?

Nou konte popilarite dosye pa rejyon an. Gen yon nimewo nan kachèt rejyonal la kote itilizatè a sitiye, ak yon idantifyan fichye - nou pran pè sa a ak enkreman Rating a ak chak download.

An menm tan an, move lespri yo - sèvis nan rejyon yo - de tan zan tan vini nan API a epi yo di: "Mwen se tankou yon kachèt, ban m 'yon lis dosye ki pi popilè nan rejyon mwen an ki poko sou mwen. ” API a delivre yon pakèt fichye ki klase dapre evalyasyon, demon an telechaje yo, mennen yo nan rejyon yo epi delivre dosye yo soti nan la. Sa a se diferans fondamantal ant pu/pp ak Sun nan kachèt: yo bay dosye a nan tèt yo imedyatman, menm si fichye sa a pa nan kachèt la, ak kachèt la premye telechaje fichye a nan tèt li, epi Lè sa a, kòmanse remèt li.

Nan ka sa a nou jwenn kontni pi pre itilizatè yo ak gaye chaj rezo a. Pou egzanp, sèlman nan kachèt Moskou a nou distribye plis pase 1 Tbit / s pandan lè pik yo.

Men, gen pwoblèm - serveurs kachèt yo pa kawotchou. Pou kontni super popilè, pafwa pa gen ase rezo pou yon sèvè separe. Sèvè kachèt nou yo se 40-50 Gbit/s, men gen kontni ki konplètman bouche yon kanal konsa. N ap avanse nan direksyon pou enplemante depo plis pase yon kopi dosye popilè nan rejyon an. Mwen espere ke nou pral aplike li nan fen ane a.

Nou te gade achitekti jeneral la.

  • Sèvè devan ki aksepte demann.
  • Backends ki trete demann yo.
  • Depo ki fèmen pa de kalite proxy.
  • Kachèt rejyonal yo.

Kisa ki manke nan dyagram sa a? Natirèlman, baz done yo nan ki nou estoke done.

Baz done oswa motè

Nou rele yo pa baz done, men motè - Motè, paske nou pratikman pa gen baz done nan sans jeneralman aksepte.

FAQ sou achitekti ak travay VKontakte

Sa a se yon mezi nesesè. Sa te rive paske nan 2008-2009, lè VK te gen yon kwasans eksplozif nan popilarite, pwojè a te travay antyèman sou MySQL ak Memcache e te gen pwoblèm. MySQL te renmen fè aksidan ak fichye koripsyon, apre sa li pa ta refè, ak Memcache piti piti degrade nan pèfòmans epi yo te dwe rekòmanse.

Li sanble ke pwojè a de pli zan pli popilè te gen depo ki pèsistan, ki koripsyon done, ak yon kachèt, ki ralanti. Nan kondisyon sa yo, li difisil pou devlope yon pwojè k ap grandi. Li te deside eseye reekri bagay ki enpòtan ke pwojè a te konsantre sou pwòp bisiklèt nou yo.

Solisyon an te reyisi. Te gen yon opòtinite pou fè sa, osi byen ke yon nesesite ekstrèm, paske lòt fason pou eskalade pa t egziste nan moman sa a. Pa te gen yon pakèt baz done, NoSQL pa t egziste ankò, te gen sèlman MySQL, Memcache, PostrgreSQL - e se li.

Operasyon inivèsèl. Devlopman an te dirije pa ekip nou an nan devlopè C ak tout bagay te fè nan yon fason ki konsistan. Kèlkeswa motè a, yo tout te gen apeprè menm fòma fichye ekri sou disk, menm paramèt lansman, trete siyal yo nan menm fason an, epi yo te konpòte apeprè menm bagay la tou nan ka ta gen sitiyasyon kwen ak pwoblèm. Avèk kwasans motè yo, li se pratik pou administratè yo opere sistèm nan - pa gen okenn zou ki bezwen kenbe, epi yo dwe re-aprann ki jan yo opere chak nouvo baz done twazyèm pati, ki te fè li posib byen vit ak fasilman ogmante kantite yo.

Kalite motè yo

Ekip la te ekri byen kèk motè. Men kèk nan yo: zanmi, sijesyon, imaj, ipdb, lèt, lis, mòso bwa, memcached, meowdb, nouvèl, nostradamus, foto, playlists, pmemcached, sandbox, rechèch, depo, renmen, travay, ...

Pou chak travay ki mande yon estrikti done espesifik oswa trete demann atipik, ekip C a ekri yon nouvo motè. Poukisa.

Nou gen yon motè separe memcached, ki se menm jan ak yon sèl regilye, men ak yon pakèt moun sou kado, epi ki pa ralanti. Pa ClickHouse, men li travay tou. Disponib separeman pmemcached - Eske memcached ki pèsistan, ki kapab tou estoke done sou disk, anplis, pase adapte nan RAM, se konsa yo pa pèdi done lè rekòmanse. Gen divès kalite motè pou travay endividyèl yo: ke moun kap kriye, lis, ansanm - tout bagay ke pwojè nou an mande.

Grap

Soti nan yon pèspektiv kòd, pa gen okenn bezwen panse a motè oswa baz done kòm pwosesis, antite, oswa ka. Kòd la travay espesyalman ak grap, ak gwoup motè - yon kalite pou chak gwoup. Ann di gen yon gwoup memcached - se jis yon gwoup machin.

Kòd la pa bezwen konnen kote fizik, gwosè, oswa kantite serveurs ditou. Li ale nan gwoup la lè l sèvi avèk yon idantifyan sèten.

Pou sa a travay, ou bezwen ajoute yon lòt antite ki sitiye ant kòd la ak motè yo - prokurasyon.

prokurasyon RPC

Prokurasyon konekte otobis, sou ki prèske tout sit la kouri. An menm tan nou genyen pa gen dekouvèt sèvis — Olye de sa, gen yon konfigirasyon pou proxy sa a, ki konnen ki kote tout grap yo ak tout shards nan grap sa a. Sa a se sa admin fè.

Pwogramè yo pa pran swen ditou konbyen, ki kote ak sa li koute - yo jis ale nan gwoup la. Sa pèmèt nou anpil. Lè w ap resevwa yon demann, prokurasyon an redireksyon demann lan, konnen ki kote - li detèmine sa a tèt li.

FAQ sou achitekti ak travay VKontakte

Nan ka sa a, proxy se yon pwen pwoteksyon kont echèk sèvis. Si kèk motè ralanti oswa aksidan, Lè sa a, prokurasyon an konprann sa a epi reponn kòmsadwa nan bò kliyan an. Sa a pèmèt ou retire timeout la - kòd la pa tann pou motè a reponn, men li konprann ke li pa ap travay epi li bezwen konpòte yon fason diferan. Kòd la dwe prepare pou lefèt ke baz done yo pa toujou travay.

Enplemantasyon espesifik

Pafwa nou toujou reyèlman vle gen kèk kalite solisyon ki pa estanda kòm yon motè. An menm tan an, li te deside pa sèvi ak rpc-proxy pare nou an, ki te kreye espesyalman pou motè nou yo, men fè yon prokurasyon separe pou travay la.

Pou MySQL, ke nou toujou genyen isit la epi gen, nou itilize db-proxy, ak pou ClickHouse - Kittenhouse.

Li travay jeneralman tankou sa a. Gen yon sèvè sèten, li kouri kPHP, Go, Python - an jeneral, nenpòt kòd ki ka itilize pwotokòl RPC nou an. Kòd la kouri lokalman sou yon prokurasyon RPC - chak sèvè kote kòd la sitiye kouri pwòp proxy lokal li yo. Sou demann, proxy a konprann ki kote pou ale.

FAQ sou achitekti ak travay VKontakte

Si yon motè vle ale nan yon lòt, menm si li se yon vwazen, li ale nan yon proxy, paske vwazen an ka nan yon lòt sant done. Motè a pa ta dwe konte sou konnen ki kote anyen lòt pase tèt li - sa a se solisyon estanda nou an. Men, nan kou, gen eksepsyon :)

Yon egzanp yon TL-scheme selon ki tout motè opere.

memcache.not_found                                = memcache.Value;
memcache.strvalue	value:string flags:int = memcache.Value;
memcache.addOrIncr key:string flags:int delay:int value:long = memcache.Value;

tasks.task
    fields_mask:#
    flags:int
    tag:%(Vector int)
    data:string
    id:fields_mask.0?long
    retries:fields_mask.1?int
    scheduled_time:fields_mask.2?int
    deadline:fields_mask.3?int
    = tasks.Task;
 
tasks.addTask type_name:string queue_id:%(Vector int) task:%tasks.Task = Long;

Sa a se yon pwotokòl binè, ki pi pre analòg la se protobuf. Chema a preskri jaden opsyonèl, kalite konplèks - ekstansyon nan eskalye entegre, ak demann. Tout bagay ap mache dapre pwotokòl sa a.

RPC sou TL sou TCP/UDP... UDP?

Nou gen yon pwotokòl RPC pou egzekite demann motè ki kouri sou tèt konplo TL la. Tout bagay sa yo ap travay sou yon koneksyon TCP/UDP. TCP se konprann, men poukisa nou bezwen UDP souvan?

UDP ede evite pwoblèm nan nan yon nimewo gwo koneksyon ant serveurs. Si chak sèvè gen yon prokurasyon RPC epi, an jeneral, li ka ale nan nenpòt motè, Lè sa a, gen dè dizèn de milye de koneksyon TCP pou chak sèvè. Gen yon chaj, men li pa itil. Nan ka UDP pwoblèm sa a pa egziste.

Pa gen lanmen TCP redondants. Sa a se yon pwoblèm tipik: lè yon nouvo motè oswa yon nouvo sèvè te lanse, anpil koneksyon TCP yo etabli an menm tan. Pou ti demann ki lejè, pou egzanp, chaj UDP, tout kominikasyon ant kòd la ak motè a se de pake UDP: youn vole nan yon direksyon, dezyèm lan nan lòt la. Yon vwayaj wonn - ak kòd la te resevwa yon repons nan men motè a san yo pa yon lanmen.

Wi, li tout jis ap travay ak yon ti pousantaj pèt pake. Pwotokòl la gen sipò pou retransmèt ak timeout, men si nou pèdi anpil, nou pral jwenn prèske TCP, ki pa pwofitab. Nou pa kondwi UDP atravè oseyan.

Nou gen dè milye de serveurs sa yo, ak konplo a se menm bagay la: yon pake motè enstale sou chak sèvè fizik. Yo sitou yon sèl-threaded kouri pi vit ke posib san yo pa bloke, epi yo sharded kòm solisyon sèl-threaded. An menm tan an, nou pa gen anyen ki pi serye pase motè sa yo, epi yo peye anpil atansyon sou depo done ki pèsistan.

Depo done ki pèsistan

Motè ekri binlogs. Yon binlog se yon dosye nan fen kote yo ajoute yon evènman pou yon chanjman nan eta oswa done yo. Nan solisyon diferan yo rele li yon fason diferan: log binè, WAL, AOF, men prensip la se menm bagay la.

Pou anpeche motè a re-li tout binlog la pandan plizyè ane lè rekòmanse, motè yo ekri snapshots - eta aktyèl la. Si sa nesesè, yo li nan li an premye, epi answit fini li nan binlog la. Tout binlog yo ekri nan menm fòma binè - dapre konplo TL la, pou administratè yo ka administre yo egalman lè l sèvi avèk zouti yo. Pa gen okenn bezwen sa yo pou snapshots. Gen yon header jeneral ki endike ki moun ki snapshot se int, majik nan motè a, ak ki kò ki pa enpòtan pou nenpòt moun. Sa a se yon pwoblèm ak motè a ki anrejistre snapshot la.

Mwen pral byen vit dekri prensip la nan operasyon. Gen yon sèvè sou ki motè a kouri. Li louvri yon nouvo binlog vid pou ekri epi li ekri yon evènman pou chanje li.

FAQ sou achitekti ak travay VKontakte

Nan kèk pwen, li swa deside pran yon snapshot tèt li, oswa li resevwa yon siyal. Sèvè a kreye yon nouvo dosye, ekri tout eta li ladan l, ajoute gwosè binlog aktyèl la - konpanse - nan fen fichye a, epi li kontinye ekri pi lwen. Yon nouvo binlog pa kreye.

FAQ sou achitekti ak travay VKontakte

Nan kèk pwen, lè motè a rekòmanse, pral gen tou de yon binlog ak yon snapshot sou disk la. Motè a li tout snapshot la ak ogmante eta li nan yon sèten pwen.

FAQ sou achitekti ak travay VKontakte

Li pozisyon ki te nan moman an te kreye snapshot la ak gwosè binlog la.

FAQ sou achitekti ak travay VKontakte

Li nan fen binlog la pou jwenn eta aktyèl la epi kontinye ekri plis evènman yo. Sa a se yon konplo senp; tout motè nou yo travay dapre li.

Replikasyon done

Kòm yon rezilta, replikasyon done nan nou an ki baze sou deklarasyon — nou ekri nan binlog la pa nenpòt chanjman paj, men savwa demann chanjman. Trè menm jan ak sa ki vini sou rezo a, sèlman yon ti kras modifye.

Se menm konplo a itilize pa sèlman pou replikasyon, men tou pou kreye sovgad. Nou gen yon motè - yon mèt ekri ki ekri nan binlog la. Nan nenpòt lòt kote kote admin yo mete l kanpe, binlog sa a kopye, epi se li - nou gen yon backup.

FAQ sou achitekti ak travay VKontakte

Si sa nesesè lekti kopiPou diminye chaj lekti CPU a, se motè lekti a tou senpleman lanse, ki li nan fen binlog la epi egzekite kòmandman sa yo lokalman.

Lag la isit la se piti anpil, epi li posib pou chèche konnen konbyen kopi a lag dèyè mèt la.

Done sharding nan prokurasyon RPC

Ki jan sharding travay? Ki jan prokurasyon an konprann ki shard cluster pou voye? Kòd la pa di: "Voye pou 15 shards!" - non, sa a se fè pa prokurasyon an.

Konplo ki pi senp lan se firstint - premye nimewo nan demann lan.

get(photo100_500) => 100 % N.

Sa a se yon egzanp pou yon senp pwotokòl tèks memcached, men, nan kou, demann yo ka konplèks ak estriktire. Egzanp la pran premye nimewo nan rechèch la ak rès la lè divize pa gwosè gwoup la.

Sa a se itil lè nou vle gen done lokalite nan yon sèl antite. Ann di 100 se yon ID itilizatè oswa gwoup, epi nou vle tout done yo nan yon antite yo dwe sou yon sèl shard pou demann konplèks.

Si nou pa pran swen kijan demann yo gaye atravè gwoup la, gen yon lòt opsyon - hache tout shard la.

hash(photo100_500) => 3539886280 % N

Nou jwenn tou hash la, rès divizyon an ak nimewo shard la.

Tou de opsyon sa yo travay sèlman si nou prepare pou lefèt ke lè nou ogmante gwosè gwoup la, nou pral divize li oswa ogmante li pa plizyè fwa. Pou egzanp, nou te gen 16 shards, nou pa gen ase, nou vle plis - nou ka san danje jwenn 32 ​​san D '. Si nou vle ogmante pa miltip, pral gen D ', paske nou pa yo pral kapab byen divize tout bagay san pèt. Opsyon sa yo itil, men se pa toujou.

Si nou bezwen ajoute oswa retire yon kantite abitrè nan serveurs, nou itilize Hashing konsistan sou bag la a la Ketama. Men, an menm tan an, nou konplètman pèdi lokalite done yo; nou dwe rantre demann lan nan gwoup la pou chak moso retounen pwòp ti repons li yo, ak Lè sa a, rantre repons yo nan prokurasyon an.

Gen demann super-espesifik. Li sanble sa a: RPC proxy resevwa demann lan, detèmine ki gwoup pou ale nan epi detèmine shard la. Lè sa a, gen swa mèt ekri, oswa, si gwoup la gen sipò kopi, li voye nan yon kopi sou demann. Proxy a fè tout bagay sa yo.

FAQ sou achitekti ak travay VKontakte

Logs

Nou ekri mòso bwa nan plizyè fason. Yon sèl ki pi evidan ak senp se ekri mòso bwa nan memcache.

ring-buffer: prefix.idx = line

Gen yon prefiks kle - non an nan boutèy la, yon liy, epi gen gwosè a nan boutèy sa a - kantite liy. Nou pran yon nimewo o aza soti nan 0 a kantite liy mwens 1. Kle a nan memcache se yon prefiks konkatenasyon ak nimewo o aza sa a. Nou sove liy boutèy la ak tan aktyèl la nan valè a.

Lè li nesesè li mòso bwa, nou pote soti Multi Get tout kle yo, klase pa tan, epi konsa jwenn yon boutèy demi lit pwodiksyon an tan reyèl. Se konplo a itilize lè ou bezwen debug yon bagay nan pwodiksyon an tan reyèl, san yo pa kraze anyen, san yo pa sispann oswa pèmèt trafik nan lòt machin, men boutèy demi lit sa a pa dire lontan.

Pou depo serye nan mòso bwa nou gen yon motè mòso bwa-motè. Sa a se jisteman poukisa li te kreye epi li se lajman ki itilize nan yon gwo kantite grap. Pi gwo gwoup mwen konnen nan magazen 600 TB mòso bwa chaje.

Motè a trè fin vye granmoun, gen grap ki deja 6-7 ane fin vye granmoun. Gen pwoblèm ak li ke nou ap eseye rezoud, pou egzanp, nou te kòmanse aktivman itilize ClickHouse nan magazen mòso bwa.

Kolekte mòso bwa nan ClickHouse

Dyagram sa a montre kijan nou antre nan motè nou yo.

FAQ sou achitekti ak travay VKontakte

Gen kòd ki ale lokalman atravè RPC nan RPC-proxy la, epi li konprann ki kote yo ale nan motè a. Si nou vle ekri mòso bwa nan ClickHouse, nou bezwen chanje de pati nan konplo sa a:

  • ranplase kèk motè ak ClickHouse;
  • ranplase prokurasyon RPC a, ki pa ka jwenn aksè nan ClickHouse, ak kèk solisyon ki kapab, ak atravè RPC.

Motè a senp - nou ranplase li ak yon sèvè oswa yon gwoup sèvè ak ClickHouse.

Ak pou ale nan ClickHouse, nou te fè KittenHouse. Si nou ale dirèkteman de KittenHouse pou ClickHouse, li p'ap fè fas. Menm san demann, li ajoute soti nan koneksyon HTTP nan yon gwo kantite machin. Pou konplo a travay, sou yon sèvè ak ClickHouse prokurasyon ranvèse lokal yo ogmante, ki ekri nan yon fason ke li ka kenbe tèt ak volim ki nesesè nan koneksyon. Li kapab tou tampon done nan tèt li relativman fiable.

FAQ sou achitekti ak travay VKontakte

Pafwa nou pa vle aplike konplo RPC a nan solisyon ki pa estanda, pou egzanp, nan nginx. Se poutèt sa, KittenHouse gen kapasite pou resevwa mòso bwa atravè UDP.

FAQ sou achitekti ak travay VKontakte

Si moun k ap voye a ak moun k ap resevwa mòso bwa yo travay sou menm machin nan, lè sa a, pwobabilite pou pèdi yon pake UDP nan lame lokal la se byen ba. Kòm yon konpwomi ant bezwen pou aplike RPC nan yon solisyon twazyèm pati ak fyab, nou tou senpleman itilize UDP voye. Nou pou retourn lo sa scheme pli tar.

Siveyans

Nou gen de kalite mòso bwa: sa yo kolekte pa administratè sou sèvè yo ak sa yo ekri pa devlopè nan kòd. Yo koresponn ak de kalite mezi: sistèm ak pwodwi.

Metri sistèm

Li travay sou tout serveurs nou yo netdata, ki kolekte estatistik epi voye yo bay Graphite Kabòn. Se poutèt sa, ClickHouse yo itilize kòm yon sistèm depo, epi yo pa Whisper, pou egzanp. Si sa nesesè, ou ka li dirèkteman nan ClickHouse, oswa itilize grafana pou metrik, graf ak rapò. Kòm devlopè, nou gen ase aksè a Netdata ak Grafana.

Paramèt pwodwi yo

Pou konvenyans, nou te ekri anpil bagay. Pou egzanp, gen yon seri fonksyon òdinè ki pèmèt ou ekri konte, valè UniqueCounts nan estatistik, ki voye yon kote pi lwen.

statlogsCountEvent   ( ‘stat_name’,            $key1, $key2, …)
statlogsUniqueCount ( ‘stat_name’, $uid,    $key1, $key2, …)
statlogsValuetEvent  ( ‘stat_name’, $value, $key1, $key2, …)

$stats = statlogsStatData($params)

Imedyatman, nou ka itilize klasman ak gwoupman filtè epi fè tout sa nou vle soti nan estatistik - bati graf, konfigirasyon Watchdogs.

Nou ekri anpil anpil mezi kantite evènman yo soti nan 600 milya dola a 1 billions pa jou. Sepandan, nou vle kenbe yo omwen yon koup de anepou konprann tandans nan metrik. Mete tout bagay ansanm se yon gwo pwoblèm ke nou poko rezoud. Mwen pral di w kouman li te travay pou kèk ane ki sot pase yo.

Nou gen fonksyon ki ekri mezi sa yo nan memcache lokal yodiminye kantite antre yo. Yon fwa nan yon kout peryòd de tan lokalman te lanse stats-demon kolekte tout dosye. Apre sa, move lespri a melanje mezi yo nan de kouch serveurs mòso bwa-pèseptè, ki rasanble estatistik ki soti nan yon pakèt machin nou yo pou kouch dèyè yo pa mouri.

FAQ sou achitekti ak travay VKontakte

Si sa nesesè, nou ka ekri dirèkteman nan mòso bwa pèseptè.

FAQ sou achitekti ak travay VKontakte

Men, ekri nan kòd dirèkteman nan pèseptè, contournement stas-daemom, se yon solisyon mal évolutive paske li ogmante chaj la sou pèseptè a. Solisyon an apwopriye sèlman si pou kèk rezon nou pa ka ogmante memcache stats-daemon sou machin nan, oswa li te fè aksidan epi nou ale dirèkteman.

Apre sa, mòso bwa-pèseptè rantre estatistik nan meowDB - sa a se baz done nou an, ki ka tou magazen mesures.

FAQ sou achitekti ak travay VKontakte

Lè sa a, nou ka fè seleksyon binè "tou pre-SQL" nan kòd la.

FAQ sou achitekti ak travay VKontakte

Eksperyans lan

Nan ete 2018 la, nou te gen yon Hackathon entèn, e lide a te vini pou eseye ranplase pati wouj dyagram nan ak yon bagay ki ta ka estoke mezi nan ClickHouse. Nou gen mòso bwa sou ClickHouse - poukisa pa eseye li?

FAQ sou achitekti ak travay VKontakte

Nou te gen yon konplo ki te ekri mòso bwa atravè KittenHouse.

FAQ sou achitekti ak travay VKontakte

Nou te deside ajoute yon lòt "*House" nan dyagram nan, ki pral resevwa egzakteman mezi yo nan fòma kòm kòd nou an ekri yo atravè UDP. Lè sa a, *House sa a vire yo nan foure, tankou mòso bwa, ki KittenHouse konprann. Li ka parfe delivre mòso bwa sa yo nan ClickHouse, ki ta dwe kapab li yo.

FAQ sou achitekti ak travay VKontakte

Konplo a ak memcache, stats-daemon ak mòso bwa-pèseptè baz done ranplase ak yon sèl sa a.

FAQ sou achitekti ak travay VKontakte

Konplo a ak memcache, stats-daemon ak mòso bwa-pèseptè baz done ranplase ak yon sèl sa a.

  • Gen yon dispatch soti nan kòd isit la, ki ekri lokalman nan StatsHouse.
  • StatsHouse ekri mezi UDP, ki deja konvèti an insert SQL, nan KittenHouse an pakèt.
  • KittenHouse voye yo bay ClickHouse.
  • Si nou vle li yo, Lè sa a, nou li yo kontoune StatsHouse - dirèkteman nan ClickHouse lè l sèvi avèk SQL regilye.

Èske li toujou yon eksperyans, men nou renmen ki jan li vire soti. Si nou ranje pwoblèm yo ak konplo a, Lè sa a, petèt nou pral chanje a li konplètman. Pèsonèlman, mwen espere sa.

Scheme pa sove fè. Mwens serveurs yo bezwen, lokal stats-daemons ak journaux-pèseptè yo pa nesesè, men ClickHouse mande pou yon sèvè pi gwo pase sa yo ki nan konplo aktyèl la. Mwens serveurs yo bezwen, men yo dwe pi chè ak pi pwisan.

Deplwaye

Premyèman, ann gade nan deplwaman PHP. Nou ap devlope nan ale: itilize GitLab и TeamCity pou deplwaman. Branch devlopman yo fizyone nan branch mèt la, soti nan mèt la pou tès yo fizyone nan staging, ak soti nan etap nan pwodiksyon an.

Anvan deplwaman, yo pran branch pwodiksyon aktyèl la ak youn anvan an, epi yo konsidere dosye diff nan yo - chanjman: kreye, efase, chanje. Chanjman sa a anrejistre nan binlog nan yon motè copyfast espesyal, ki ka byen vit replike chanjman nan tout flòt sèvè nou an. Sa ki itilize isit la pa kopye dirèkteman, men replikasyon tripotay, lè yon sèvè voye chanjman bay vwazen ki pi pre li yo, sa yo bay vwazen yo, ak sou sa. Sa a pèmèt ou mete ajou kòd la nan plizyè dizèn ak inite segonn atravè tout flòt la. Lè chanjman an rive nan kopi lokal la, li aplike plak sa yo sou li sistèm dosye lokal yo. Rollback tou te pote soti selon konplo a menm.

Nou menm tou nou deplwaye kPHP anpil epi li gen pwòp devlopman li tou ale dapre dyagram ki anwo a. Depi sa HTTP sèvè binè, Lè sa a, nou pa ka pwodwi diff - lage binè a peze dè santèn de MB. Se poutèt sa, gen yon lòt opsyon isit la - vèsyon an ekri binlog copyfast. Avèk chak bati li ogmante, ak pandan rollback li ogmante tou. Version replike sou serveurs. Copyfasts lokal yo wè ke yon nouvo vèsyon te antre nan binlog la, ak pa menm replikasyon tripotay yo pran dènye vèsyon binè a pou tèt yo, san yo pa fatige sèvè mèt nou an, men ak anpil atansyon gaye chaj la atravè rezo a. Sa ki swiv relansman grasyeuz pou nouvo vèsyon an.

Pou motè nou yo, ki se esansyèlman binè tou, konplo a sanble anpil:

  • git mèt branch;
  • binè nan .deb;
  • vèsyon an ekri nan binlog copyfast;
  • replike sou sèvè;
  • sèvè a rale yon .dep fre;
  • dpkg -mwen;
  • grasyeuz relansman nan nouvo vèsyon.

Diferans lan se ke binè nou an pake nan achiv yo .deb, ak lè ponpe deyò yo dpkg -mwen yo mete sou sistèm nan. Poukisa kPHP deplwaye kòm yon binè, epi motè yo deplwaye kòm dpkg? Sa te rive konsa. Li travay - pa manyen li.

Lyen itil:

Alexey Akulovich se youn nan moun ki, kòm yon pati nan Komite Pwogram nan, ede PHP Larisi sou Me 17th pral vin pi gwo evènman an pou devlopè PHP nan dènye tan yo. Gade sa yon PC fre nou genyen, kisa moun kap pale (De nan yo ap devlope debaz PHP!) - sanble tankou yon bagay ou pa ka rate si ou ekri PHP.

Sous: www.habr.com

Add nouvo kòmantè