FAQ sa arkitektura ug buhat sa VKontakte

Ang kasaysayan sa paglalang sa VKontakte anaa sa Wikipedia; kini gisulti ni Pavel mismo. Morag nakaila na ang tanan kaniya. Mahitungod sa internals, arkitektura ug istruktura sa site sa HighLoad++ Pavel niingon nako balik 2010. Daghang mga server ang nag-leak sukad niadto, mao nga among i-update ang impormasyon: among i-dissect kini, kuhaa ang sulod, timbangon kini, ug tan-awon ang VK device gikan sa teknikal nga punto sa panglantaw.

FAQ sa arkitektura ug buhat sa VKontakte

Alexey Akulovich (AterCattus) backend developer sa VKontakte team. Ang transcript sa kini nga taho usa ka kolektibo nga tubag sa kanunay nga gipangutana nga mga pangutana bahin sa operasyon sa plataporma, imprastraktura, mga server ug interaksyon tali kanila, apan dili bahin sa kalamboan, nga mao mahitungod sa puthaw. Sa tinuud, bahin sa mga database ug kung unsa ang naa sa VK, bahin sa pagkolekta sa mga troso ug pag-monitor sa tibuuk nga proyekto sa kinatibuk-an. Mga detalye ubos sa pagputol.



Sulod sa kapin sa upat ka tuig ako nag-atubang sa tanang matang sa mga buluhaton nga may kalabutan sa backend.

  • Pag-upload, pagtipig, pagproseso, pag-apod-apod sa media: video, live streaming, audio, litrato, dokumento.
  • Imprastraktura, plataporma, pag-monitor sa developer, mga troso, mga cache sa rehiyon, CDN, proprietary RPC protocol.
  • Paghiusa sa mga serbisyo sa gawas: mga pahibalo sa pagduso, pag-parse sa eksternal nga link, RSS feed.
  • Pagtabang sa mga kauban sa lainlaing mga pangutana, ang mga tubag nga nanginahanglan pag-diving sa wala mailhi nga code.

Atol niini nga panahon, ako adunay usa ka kamot sa daghang mga sangkap sa site. Gusto nakong ipaambit kini nga kasinatian.

General nga arkitektura

Ang tanan, sama sa naandan, magsugod sa usa ka server o grupo sa mga server nga modawat sa mga hangyo.

Front server

Ang front server modawat sa mga hangyo pinaagi sa HTTPS, RTMP ug WSS.

https - kini ang mga hangyo alang sa panguna ug mobile nga bersyon sa web sa site: vk.com ug m.vk.com, ug uban pang opisyal ug dili opisyal nga mga kliyente sa among API: mga kliyente sa mobile, mga mensahero. Naa miy reception RTMP-trapiko alang sa Live nga mga sibya nga adunay lahi nga mga server sa atubangan ug WSS- mga koneksyon alang sa Streaming API.

Alang sa HTTPS ug WSS sa mga server takus kini nginx. Alang sa mga sibya sa RTMP, bag-ohay lang mibalhin sa among kaugalingon nga solusyon kive, apan lapas kini sa kasangkaran sa taho. Alang sa pagtugot sa sayup, kini nga mga server nag-anunsyo sa kasagaran nga mga adres sa IP ug molihok sa mga grupo aron kung adunay problema sa usa sa mga server, ang mga hangyo sa gumagamit dili mawala. Alang sa HTTPS ug WSS, kining parehas nga mga server nag-encrypt sa trapiko aron makuha ang bahin sa load sa CPU sa ilang kaugalingon.

Dili na kami maghisgot og dugang mahitungod sa WSS ug RTMP, apan mahitungod lamang sa standard nga mga hangyo sa HTTPS, nga kasagaran nalangkit sa usa ka proyekto sa web.

Backend

Sa luyo sa atubangan kasagaran adunay mga backend server. Giproseso nila ang mga hangyo nga madawat sa front server gikan sa mga kliyente.

kini mga server sa kPHP, diin ang HTTP daemon nagdagan, tungod kay ang HTTPS na-decrypted na. Ang kPHP usa ka server nga nagdagan prefork nga mga modelo: Nagsugod sa usa ka master nga proseso, usa ka hugpong sa mga proseso sa bata, gipasa ang mga socket sa pagpaminaw kanila ug giproseso nila ang ilang mga hangyo. Sa kini nga kaso, ang mga proseso wala gi-restart tali sa matag hangyo gikan sa user, apan i-reset lang ang ilang estado sa orihinal nga zero-value nga estado - hangyo human sa hangyo, imbes nga magsugod pag-usab.

Pag-apod-apod sa load

Ang tanan namon nga mga backend dili usa ka dako nga pool sa mga makina nga makaproseso sa bisan unsang hangyo. Kami kanila gibahin ngadto sa lain nga mga grupo: general, mobile, api, video, staging... Ang problema sa bulag nga grupo sa mga makina dili makaapekto sa tanan. Kung adunay mga problema sa video, ang tiggamit nga naminaw sa musika dili gani mahibal-an bahin sa mga problema. Hain nga backend nga ipadala ang hangyo gidesisyonan sa nginx sa atubangan sumala sa config.

Pagkolekta ug pagbalanse sa metric

Aron masabtan kung pila ka mga awto ang kinahanglan namon sa matag grupo, kami ayaw pagsalig sa QPS. Ang mga backend managlahi, sila adunay lain-laing mga hangyo, ang matag hangyo adunay lahi nga pagkakomplikado sa pagkalkula sa QPS. Mao nga kami naglihok kami uban ang konsepto sa load sa server sa kinatibuk-an - sa CPU ug perf.

Adunay kami libu-libo nga ingon nga mga server. Ang matag pisikal nga server nagpadagan sa usa ka grupo sa kPHP aron i-recycle ang tanan nga mga cores (tungod kay ang kPHP usa ka sinulud).

Server sa sulud

Ang CS o Content Server usa ka storage. Ang CS usa ka server nga nagtipig sa mga file ug nagproseso usab sa mga gi-upload nga mga file ug tanan nga mga lahi sa background nga magkadungan nga mga buluhaton nga gihatag sa panguna nga web frontend niini.

Kami adunay napulo ka libo nga pisikal nga mga server nga nagtipig sa mga file. Ang mga tiggamit ganahan nga mag-upload og mga file, ug ganahan mi nga tipigan ug ipaambit kini. Ang uban niini nga mga server gisirhan sa mga espesyal nga pu/pp server.

pu/pp

Kung giablihan nimo ang tab sa network sa VK, nakita nimo ang pu/pp.

FAQ sa arkitektura ug buhat sa VKontakte

Unsa ang pu/pp? Kung gisirado namon ang usa ka server pagkahuman sa lain, adunay duha nga kapilian sa pag-upload ug pag-download sa usa ka file sa server nga sirado: direkta pinaagi sa http://cs100500.userapi.com/path o pinaagi sa intermediate server - http://pu.vk.com/c100500/path.

Ang Pu mao ang makasaysayan nga ngalan alang sa pag-upload sa litrato, ug ang pp usa ka proxy sa litrato. Kana mao, ang usa ka server alang sa pag-upload sa mga litrato, ug ang lain alang sa pag-upload. Karon dili lamang mga litrato ang gi-load, apan ang ngalan gipreserbar.

Kini nga mga server tapuson ang mga sesyon sa HTTPSaron makuha ang processor load gikan sa storage. Usab, tungod kay ang mga file sa user giproseso niini nga mga server, ang dili kaayo sensitibo nga impormasyon nga gitipigan niini nga mga makina, mas maayo. Pananglitan, ang mga yawe sa pag-encrypt sa HTTPS.

Tungod kay ang mga makina gisirhan sa among uban nga mga makina, mahimo namon nga dili hatagan sila og "puti" nga mga eksternal nga IP, ug paghatag ug "gray". Niining paagiha nakatipig kami sa IP pool ug gigarantiyahan nga mapanalipdan ang mga makina gikan sa gawas nga pag-access - wala’y IP nga makasulod niini.

Kalig-on sa gipaambit nga mga IP. Sa mga termino sa pagtugot sa sayup, ang laraw parehas nga nagtrabaho - daghang mga pisikal nga server adunay usa ka sagad nga pisikal nga IP, ug ang hardware sa ilang atubangan nagpili kung asa ipadala ang hangyo. Maghisgot ko bahin sa ubang mga kapilian sa ulahi.

Ang kontrobersyal nga punto mao nga sa kini nga kaso ang kliyente nagtipig gamay nga koneksyon. Kung adunay parehas nga IP alang sa daghang mga makina - nga adunay parehas nga host: pu.vk.com o pp.vk.com, ang browser sa kliyente adunay limitasyon sa gidaghanon sa dungan nga mga hangyo sa usa ka host. Apan sa panahon sa ubiquitous HTTP/2, ako nagtuo nga kini dili na kaayo importante.

Ang klaro nga disbentaha sa laraw mao nga kinahanglan kini bomba ang tanan nga trapiko, nga moadto sa storage, pinaagi sa laing server. Tungod kay kami nagbomba sa trapiko pinaagi sa mga makina, dili pa kami makabomba sa bug-at nga trapiko, pananglitan, video, gamit ang samang laraw. Gipadala namo kini direkta - usa ka bulag nga direktang koneksyon alang sa lain nga mga storage ilabi na alang sa video. Nagpadala kami og mas gaan nga sulod pinaagi sa proxy.

Dili pa lang dugay nakakuha kami usa ka gipaayo nga bersyon sa proxy. Karon isulti ko kanimo kung giunsa sila lahi sa mga ordinaryo ug kung ngano nga kini kinahanglan.

adlaw

Niadtong Septembre 2017, ang Oracle, nga kaniadto nagpalit sa Sun, gitangtang ang daghang mga empleyado sa Sun. Mahimo natong isulti nga niining higayona ang kompanya wala na maglungtad. Kung nagpili usa ka ngalan alang sa bag-ong sistema, ang among mga administrador nakahukom nga maghatag pasidungog sa panumduman sa kini nga kompanya ug ginganlan ang bag-ong sistema nga Sun. Taliwala sa atong kaugalingon, gitawag lang nato siya nga "mga adlaw".

FAQ sa arkitektura ug buhat sa VKontakte

pp adunay pipila ka mga problema. Usa ka IP matag grupo - dili epektibo nga cache. Daghang mga pisikal nga server ang nag-ambit sa usa ka sagad nga IP address, ug wala’y paagi aron makontrol kung asa nga server ang hangyo moadto. Busa, kung ang lainlaing mga tiggamit moabut alang sa parehas nga file, kung adunay usa ka cache sa kini nga mga server, ang file matapos sa cache sa matag server. Kini usa ka dili maayo nga laraw, apan wala’y mahimo.

Tungod niini- dili nato mabungkag ang sulod, tungod kay dili kami makapili usa ka piho nga server para sa kini nga grupo - sila adunay usa ka komon nga IP. Alang usab sa pipila ka mga internal nga hinungdan nga naa kami dili posible nga i-install ang ingon nga mga server sa mga rehiyon. Nagbarug lamang sila sa St. Petersburg.

Uban sa mga adlaw, among giusab ang sistema sa pagpili. Karon naa mi anycast routing: dinamikong routing, anycast, self-check daemon. Ang matag server adunay kaugalingong indibidwal nga IP, apan usa ka komon nga subnet. Ang tanan gi-configure sa paagi nga kung mapakyas ang usa ka server, awtomatiko nga mikaylap ang trapiko sa ubang mga server sa parehas nga grupo. Karon posible nga makapili usa ka piho nga server, walay sobra nga caching, ug ang pagkakasaligan wala maapektuhan.

Pagsuporta sa timbang. Karon mahimo na namon nga i-install ang mga makina nga lainlain ang gahum kung kinahanglan, ug usab, kung adunay mga temporaryo nga problema, usba ang mga gibug-aton sa nagtrabaho nga "mga adlaw" aron makunhuran ang karga niini, aron sila "makapahulay" ug magsugod sa pagtrabaho pag-usab.

Sharding pinaagi sa content id. Usa ka kataw-anan nga butang bahin sa sharding: kasagaran namong shard nga sulud aron ang lainlaing mga tiggamit moadto sa parehas nga file pinaagi sa parehas nga "adlaw" aron sila adunay usa ka sagad nga cache.

Bag-o lang namon gilusad ang "Clover" nga aplikasyon. Kini usa ka online nga quiz sa usa ka live broadcast, diin ang host nangutana ug ang mga tiggamit motubag sa tinuud nga oras, pagpili sa mga kapilian. Ang app adunay chat diin ang mga tiggamit mahimong makig-chat. Mahimong dungan nga makonektar sa sibya labaw pa sa 100 ka libo ka mga tawo. Tanan sila nagsulat og mga mensahe nga gipadala sa tanan nga mga partisipante, ug usa ka avatar ang kauban sa mensahe. Kung ang 100 ka libo nga mga tawo moabut alang sa usa ka avatar sa usa ka "adlaw", nan kini usahay magligid sa luyo sa usa ka panganod.

Aron makasugakod sa mga pagbuto sa mga hangyo alang sa parehas nga file, kini alang sa usa ka matang sa sulud nga among gipalihok ang usa ka binuang nga laraw nga nagpakaylap sa mga file sa tanan nga magamit nga "mga adlaw" sa rehiyon.

Adlaw gikan sa sulod

Reverse proxy sa nginx, cache sa RAM o sa paspas nga Optane/NVMe disks. Pananglitan: http://sun4-2.userapi.com/c100500/path — usa ka link sa "adlaw", nga nahimutang sa ikaupat nga rehiyon, ang ikaduha nga grupo sa server. Gisirado niini ang path file, nga pisikal nga nahimutang sa server 100500.

tabon

Nagdugang kami og usa pa ka node sa among laraw sa arkitektura - ang caching environment.

FAQ sa arkitektura ug buhat sa VKontakte

Sa ubos mao ang layout diagram rehiyonal nga mga cache, adunay mga 20 kanila. Kini ang mga lugar diin nahimutang ang mga cache ug "mga adlaw", nga mahimong magtago sa trapiko pinaagi sa ilang kaugalingon.

FAQ sa arkitektura ug buhat sa VKontakte

Kini mao ang pag-cache sa multimedia nga sulod; walay data sa user nga gitipigan dinhi - musika lang, video, mga litrato.

Aron mahibal-an ang rehiyon sa tiggamit, kami gikolekta namo ang mga prefix sa BGP network nga gipahibalo sa mga rehiyon. Sa kaso sa fallback, kinahanglan usab natong i-parse ang geoip database kung dili nato makit-an ang IP pinaagi sa mga prefix. Gitino namo ang rehiyon pinaagi sa IP sa user. Sa code, mahimo natong tan-awon ang usa o daghan pa nga mga rehiyon sa user - kadtong mga punto diin siya labing duol sa geograpiya.

Unsang paagi kini sa trabaho?

Giihap namo ang pagkapopular sa mga file sa rehiyon. Adunay ubay-ubay nga rehiyonal nga cache diin nahimutang ang user, ug usa ka file identifier - among gikuha kini nga pares ug gidugangan ang rating sa matag pag-download.

Sa parehas nga oras, ang mga demonyo - mga serbisyo sa mga rehiyon - matag karon ug unya moabut sa API ug moingon: "Ako usa ka cache, hatagi ako usa ka lista sa labing inila nga mga file sa akong rehiyon nga wala pa nako. ” Ang API naghatud sa usa ka hugpong sa mga file nga gisunud sa rating, gi-download kini sa daemon, gidala kini sa mga rehiyon ug gihatud ang mga file gikan didto. Kini ang sukaranang kalainan tali sa pu/pp ug Sun gikan sa mga cache: ilang gihatag ang file pinaagi sa ilang kaugalingon diha-diha dayon, bisan kung kini nga file wala sa cache, ug ang cache una nga nag-download sa file sa iyang kaugalingon, ug dayon nagsugod sa paghatag niini pagbalik.

Sa kini nga kaso atong makuha sulod nga mas duol sa mga tiggamit ug pagsabwag sa load sa network. Pananglitan, gikan lamang sa cache sa Moscow kami nag-apod-apod og labaw sa 1 Tbit/s sa mga oras sa peak.

Apan adunay mga problema - Ang mga cache server dili goma. Para sa super popular nga content, usahay walay igong network para sa bulag nga server. Ang among mga cache server kay 40-50 Gbit/s, apan adunay sulod nga bug-os nga nakabara sa maong channel. Naglihok kami padulong sa pagpatuman sa pagtipig sa labaw sa usa ka kopya sa mga sikat nga file sa rehiyon. Manghinaut ko nga ato kining ipatuman sa katapusan sa tuig.

Gitan-aw namon ang kinatibuk-ang arkitektura.

  • Front servers nga modawat sa mga hangyo.
  • Nag-backend sa mga hangyo sa proseso.
  • Mga storage nga gisirado sa duha ka matang sa mga proxy.
  • Mga rehiyonal nga cache.

Unsa ang kulang niini nga diagram? Siyempre, ang mga database diin kami nagtipig sa datos.

Mga database o makina

Gitawag namo sila dili mga database, apan mga makina - Mga makina, tungod kay halos wala kami'y mga database sa kasagarang gidawat nga diwa.

FAQ sa arkitektura ug buhat sa VKontakte

Kini usa ka kinahanglanon nga lakang. Nahitabo kini tungod kay kaniadtong 2008-2009, kung ang VK adunay kusog nga pagtubo sa pagkapopular, ang proyekto hingpit nga nagtrabaho sa MySQL ug Memcache ug adunay mga problema. Gusto sa MySQL ang pag-crash ug pagdaot sa mga file, pagkahuman dili na kini mabawi, ug ang Memcache hinayhinay nga nadaot ang pasundayag ug kinahanglan nga i-restart.

Kini nahimo nga ang labi ka sikat nga proyekto adunay padayon nga pagtipig, nga makadaot sa datos, ug usa ka cache, nga hinay. Sa ingon nga mga kahimtang, lisud ang paghimo sa usa ka nagtubo nga proyekto. Nadesisyonan nga sulayan nga isulat pag-usab ang mga kritikal nga butang nga gipunting sa proyekto sa among kaugalingon nga mga bisikleta.

Nagmalampuson ang solusyon. Adunay usa ka oportunidad sa pagbuhat niini, ingon man usab sa usa ka hilabihan nga panginahanglan, tungod kay ang ubang mga paagi sa scaling wala maglungtad niadtong panahona. Wala’y daghang mga database, wala pa ang NoSQL, adunay ra MySQL, Memcache, PostrgreSQL - ug mao na.

Universal nga operasyon. Ang kalamboan gipangulohan sa among team sa C developers ug ang tanan gihimo sa makanunayon nga paagi. Bisan unsa pa ang makina, silang tanan adunay gibana-bana nga parehas nga format sa file nga gisulat sa disk, parehas nga mga parameter sa paglansad, giproseso nga mga signal sa parehas nga paagi, ug naglihok nga parehas sa kaso sa mga sitwasyon sa sulud ug mga problema. Uban sa pagtubo sa mga makina, kini mao ang sayon ​​alang sa mga administrador sa pag-operate sa sistema - walay zoo nga kinahanglan nga mamentinar, ug sila kinahanglan nga makakat-on pag-usab kon sa unsang paagi sa pag-operate sa matag bag-o nga ikatulo nga-partido database, nga naghimo niini nga posible nga sa madali ug sayon ​​nga pagdugang. ilang numero.

Mga matang sa mga makina

Ang team nagsulat og pipila ka mga makina. Ania ang pipila lang niini: higala, mga pahiwatig, imahe, ipdb, mga sulat, mga lista, mga troso, memcached, meowdb, balita, nostradamus, litrato, mga playlist, pmemcached, sandbox, pagpangita, pagtipig, gusto, mga buluhaton, ...

Alang sa matag buluhaton nga nanginahanglan usa ka piho nga istruktura sa datos o nagproseso sa dili tipikal nga mga hangyo, ang C team nagsulat usa ka bag-ong makina. Ngano dili.

Naa mi bulag nga makina nagmcached, nga susama sa usa ka regular, apan adunay usa ka hugpong sa mga maayong butang, ug nga dili mohinay. Dili ClickHouse, apan kini usab nagtrabaho. Anaa nga gilain pmemcached Mao ba padayon nga memcached, nga mahimo usab nga magtipig data sa disk, dugang pa, kay sa mohaum sa RAM, aron dili mawad-an sa data sa diha nga restarting. Adunay lainlaing mga makina alang sa indibidwal nga mga buluhaton: pila, lista, set - tanan nga gikinahanglan sa among proyekto.

Mga pundok

Gikan sa perspektibo sa code, dili kinahanglan nga hunahunaon ang mga makina o database ingon mga proseso, entidad, o mga higayon. Ang code naglihok ilabi na sa mga cluster, nga adunay mga grupo sa mga makina - usa ka klase kada cluster. Ingnon ta nga adunay memcached cluster - usa ra kini ka grupo sa mga makina.

Ang code dili kinahanglan nga mahibal-an ang pisikal nga lokasyon, gidak-on, o gidaghanon sa mga server. Moadto siya sa cluster gamit ang usa ka piho nga identifier.

Aron kini molihok, kinahanglan nimo nga idugang ang usa pa nga entidad nga nahimutang taliwala sa code ug sa mga makina - proxy.

RPC proxy

proxy nagkonektar nga bus, diin halos ang tibuok site midagan. Sa samang higayon naa mi walay service discovery — Hinunoa, adunay usa ka config alang niini nga proxy, nga nahibal-an ang lokasyon sa tanan nga mga cluster ug tanan nga mga shards niini nga cluster. Mao ni ang gibuhat sa mga admin.

Ang mga programmer wala'y pagtagad kung pila, asa ug unsa ang gasto - moadto lang sila sa cluster. Kini nagtugot kanato sa daghan. Kung nakadawat usa ka hangyo, gi-redirect sa proxy ang hangyo, nahibal-an kung diin - kini mismo ang nagtino niini.

FAQ sa arkitektura ug buhat sa VKontakte

Sa kini nga kaso, ang proxy usa ka punto sa pagpanalipod batok sa pagkapakyas sa serbisyo. Kung ang pipila ka makina mohinay o mag-crash, nan ang proxy nakasabut niini ug motubag sumala sa bahin sa kliyente. Gitugotan ka niini nga tangtangon ang timeout - ang code wala maghulat sa pagtubag sa makina, apan nakasabut nga wala kini molihok ug kinahanglan nga molihok sa usa ka paagi nga lahi. Ang code kinahanglan nga andam alang sa kamatuoran nga ang mga database dili kanunay molihok.

Piho nga mga pagpatuman

Usahay gusto gihapon nato nga adunay usa ka matang sa dili standard nga solusyon isip usa ka makina. Sa parehas nga oras, nakahukom nga dili gamiton ang among andam nga rpc-proxy, nga gimugna alang sa among mga makina, apan aron maghimo usa ka lahi nga proxy alang sa buluhaton.

Para sa MySQL, nga ania pa dinhi ug didto, gigamit namo ang db-proxy, ug para sa ClickHouse - Balay sa kuting.

Kasagaran kini molihok sama niini. Adunay usa ka piho nga server, kini nagpadagan sa kPHP, Go, Python - sa kinatibuk-an, bisan unsang code nga magamit sa among RPC protocol. Ang code nagdagan sa lokal sa usa ka RPC proxy - ang matag server diin ang code nahimutang nagpadagan sa kaugalingon nga lokal nga proxy. Sa hangyo, ang proxy nakasabut kung asa moadto.

FAQ sa arkitektura ug buhat sa VKontakte

Kung ang usa ka makina gusto nga moadto sa lain, bisan kung kini silingan, kini moagi sa usa ka proxy, tungod kay ang silingan mahimong naa sa lain nga sentro sa datos. Ang makina kinahanglan dili magsalig sa pagkahibalo sa lokasyon sa bisan unsang butang gawas sa iyang kaugalingon - kini ang among sumbanan nga solusyon. Apan siyempre adunay mga eksepsiyon :)

Usa ka pananglitan sa usa ka TL-scheme sumala sa kung diin ang tanan nga mga makina naglihok.

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;

Kini usa ka binary protocol, ang labing duol nga analogue niini protobuf. Ang schema naghulagway sa opsyonal nga mga natad, komplikadong mga matang - mga extension sa mga built-in nga scalar, ug mga pangutana. Ang tanan molihok sumala sa kini nga protocol.

RPC sa TL sa TCP/UDP... UDP?

Adunay kami usa ka protocol sa RPC alang sa pagpatuman sa mga hangyo sa makina nga nagdagan sa ibabaw sa laraw sa TL. Kining tanan naglihok pinaagi sa koneksyon sa TCP/UDP. Ang TCP masabtan, apan nganong kinahanglan nato kanunay ang UDP?

Nakatabang ang UDP paglikay sa problema sa usa ka dako nga gidaghanon sa mga koneksyon tali sa mga server. Kung ang matag server adunay usa ka RPC proxy ug, sa kinatibuk-an, kini mahimong moadto sa bisan unsang makina, nan adunay napulo ka libo nga mga koneksyon sa TCP matag server. Adunay usa ka karga, apan kini walay kapuslanan. Sa kaso sa UDP kini nga problema wala maglungtad.

Walay sobra nga TCP handshake. Kini usa ka kasagaran nga problema: kung ang usa ka bag-ong makina o usa ka bag-ong server gilansad, daghang mga koneksyon sa TCP ang natukod dayon. Alang sa gagmay nga gaan nga mga hangyo, pananglitan, UDP payload, ang tanan nga komunikasyon tali sa code ug sa makina duha ka UDP packet: ang usa molupad sa usa ka direksyon, ang ikaduha sa lain. Usa ka round trip - ug ang code nakadawat og tubag gikan sa makina nga walay paglamano.

Oo, kini ang tanan nagtrabaho lang nga adunay gamay kaayo nga porsyento sa pagkawala sa pakete. Ang protocol adunay suporta alang sa retransmits ug timeouts, apan kon kita mawad-an og daghan, kita makakuha og hapit TCP, nga dili kita. Wala kami nagmaneho sa UDP tabok sa kadagatan.

Kami adunay liboan sa ingon nga mga server, ug ang laraw parehas: usa ka pakete sa mga makina ang na-install sa matag pisikal nga server. Kasagaran sila single-threaded aron modagan sa labing madali nga mahimo nga walay pagbabag, ug gi-sharded isip single-threaded nga mga solusyon. Sa parehas nga oras, wala kami mas kasaligan kaysa sa kini nga mga makina, ug daghang pagtagad ang gihatag sa padayon nga pagtipig sa datos.

Nagpadayon nga pagtipig sa datos

Ang mga makina nagsulat sa mga binlog. Ang binlog usa ka file sa katapusan diin ang usa ka panghitabo alang sa pagbag-o sa estado o data gidugang. Sa lainlaing mga solusyon gitawag kini nga lahi: binary log, Pagdula, AOF, pero pareho ra ang prinsipyo.

Aron mapugngan ang makina sa pagbasa pag-usab sa tibuok binlog sulod sa daghang katuigan sa dihang mag-restart, ang mga makina magsulat snapshot - kasamtangan nga kahimtang. Kon gikinahanglan, basahon una nila kini, ug dayon tapuson ang pagbasa gikan sa binlog. Ang tanan nga binlog gisulat sa parehas nga binary nga pormat - sumala sa laraw sa TL, aron ang mga admin makapangalagad kanila nga parehas gamit ang ilang mga himan. Wala'y ingon nga panginahanglan alang sa mga snapshot. Adunay usa ka kinatibuk-ang ulohan nga nagpaila kung kinsang snapshot ang int, salamangka sa makina, ug kung unsang lawas ang dili hinungdanon sa bisan kinsa. Kini usa ka problema sa makina nga nagrekord sa snapshot.

Dali nakong ihulagway ang prinsipyo sa operasyon. Adunay usa ka server diin ang makina nagdagan. Giablihan niya ang usa ka bag-ong walay sulod nga binlog alang sa pagsulat ug nagsulat usa ka panghitabo alang sa pagbag-o niini.

FAQ sa arkitektura ug buhat sa VKontakte

Sa usa ka punto, siya makahukom sa pagkuha sa usa ka snapshot sa iyang kaugalingon, o siya makadawat og usa ka signal. Ang server nagmugna og bag-ong file, isulat ang tibuok nga estado niini, idugang ang kasamtangan nga gidak-on sa binlog - offset - ngadto sa katapusan sa file, ug nagpadayon sa pagsulat sa dugang. Usa ka bag-ong binlog wala gihimo.

FAQ sa arkitektura ug buhat sa VKontakte

Sa usa ka punto, kung ang makina gi-restart, adunay usa ka binlog ug usa ka snapshot sa disk. Gibasa sa makina ang tibuok snapshot ug gipataas ang estado niini sa usa ka punto.

FAQ sa arkitektura ug buhat sa VKontakte

Gibasa ang posisyon sa panahon nga gihimo ang snapshot ug ang gidak-on sa binlog.

FAQ sa arkitektura ug buhat sa VKontakte

Gibasa ang katapusan sa binlog aron makuha ang kasamtangan nga kahimtang ug nagpadayon sa pagsulat sa dugang nga mga panghitabo. Kini usa ka yano nga laraw; ang tanan namon nga mga makina nagtrabaho sumala niini.

Replikasyon sa datos

Ingon usa ka sangputanan, ang pagkopya sa datos sa among gibase sa pamahayag — nagsulat kami sa binlog dili bisan unsang mga pagbag-o sa panid, apan mao pagbag-o sa mga hangyo. Sama kaayo sa kung unsa ang moabut sa network, gamay ra nga giusab.

Ang parehas nga laraw gigamit dili lamang alang sa pagkopya, kondili usab sa paghimo og mga backup. Kami adunay makina - usa ka master sa pagsulat nga nagsulat sa binlog. Sa bisan asa nga lugar diin gipahimutang kini sa mga admin, kini nga binlog gikopya, ug mao kana - kami adunay backup.

FAQ sa arkitektura ug buhat sa VKontakte

Kung kinahanglan nimo replika sa pagbasaAron makunhuran ang load sa pagbasa sa CPU, ang makina sa pagbasa yano nga gilunsad, nga nagbasa sa katapusan sa binlog ug nagpatuman niini nga mga mando sa lokal.

Ang lag dinhi gamay ra kaayo, ug posible nga mahibal-an kung pila ang nahabilin sa replika sa luyo sa agalon.

Data sharding sa RPC proxy

Giunsa pagtrabaho ang sharding? Giunsa pagsabot sa proxy kung asa nga cluster shard ipadala? Ang code wala mag-ingon: "Ipadala alang sa 15 ka shards!" - dili, kini gibuhat sa proxy.

Ang pinakasimple nga laraw mao ang una — ang unang numero sa hangyo.

get(photo100_500) => 100 % N.

Kini usa ka pananglitan alang sa usa ka yano nga memcached text protocol, apan, siyempre, ang mga pangutana mahimong komplikado ug istruktura. Ang pananglitan nagkuha sa unang numero sa pangutana ug ang nahibilin kung gibahin sa gidak-on sa cluster.

Mapuslanon kini kung gusto namon nga adunay lokalidad sa datos sa usa ka entidad. Ingnon ta nga ang 100 usa ka user o group ID, ug gusto namo nga ang tanang datos sa usa ka entidad anaa sa usa ka shard para sa komplikadong mga pangutana.

Kung dili kami magtagad kung giunsa ang pagkaylap sa mga hangyo sa cluster, adunay lain nga kapilian - pag-hashing sa tibuok shard.

hash(photo100_500) => 3539886280 % N

Nakuha usab namo ang hash, ang nahibilin sa division ug ang shard number.

Ang duha niini nga mga kapilian molihok lamang kung kita andam alang sa kamatuoran nga kung ang pagdugang sa gidak-on sa kumpol atong bahinon kini o dugangan kini sa daghang mga higayon. Pananglitan, kami adunay 16 ka shards, wala kami igo, gusto namon labi pa - luwas nga makuha namon ang 32 nga wala’y downtime. Kung gusto namon nga madugangan ang dili daghang, adunay downtime, tungod kay dili kami makahimo sa tukma nga pagbahin sa tanan nga wala’y mga kapildihan. Kini nga mga kapilian mapuslanon, apan dili kanunay.

Kung kinahanglan namon nga idugang o tangtangon ang usa ka arbitraryong gidaghanon sa mga server, among gigamit Ang makanunayon nga pag-hash sa singsing a la Ketama. Apan sa samang higayon, bug-os natong mawad-an ang lokalidad sa datos; kinahanglan natong iusa ang hangyo sa cluster aron ang matag piraso mobalik sa kaugalingong gamay nga tubag, ug dayon i-merge ang mga tubag sa proxy.

Adunay mga super-specific nga mga hangyo. Ingon niini: Gidawat sa proxy sa RPC ang hangyo, gitino kung unsang cluster ang adtoan ug gitino ang shard. Unya adunay mga masters sa pagsulat, o, kung ang cluster adunay suporta sa replika, ipadala kini sa usa ka kopya kung gipangayo. Gihimo sa proxy kining tanan.

FAQ sa arkitektura ug buhat sa VKontakte

Mga troso

Gisulat namon ang mga troso sa daghang mga paagi. Ang labing klaro ug yano mao ang pagsulat og mga log sa memcache.

ring-buffer: prefix.idx = line

Adunay usa ka yawe nga prefix - ang ngalan sa log, usa ka linya, ug adunay gidak-on niini nga log - ang gidaghanon sa mga linya. Nagkuha kami ug random nga numero gikan sa 0 hangtod sa gidaghanon sa mga linya minus 1. Ang yawe sa memcache usa ka prefix nga gidugtong niining random nga numero. Gitipigan namon ang linya sa log ug ang karon nga oras sa kantidad.

Kung gikinahanglan ang pagbasa sa mga troso, among gipatuman Daghang Pagkuha tanan nga mga yawe, gisunod sa oras, ug sa ingon makakuha usa ka log sa produksiyon sa tinuud nga oras. Ang laraw gigamit kung kinahanglan nimo nga i-debug ang usa ka butang sa produksiyon sa tinuud nga oras, nga wala’y paglapas sa bisan unsang butang, nga wala’y paghunong o pagtugot sa trapiko sa ubang mga makina, apan kini nga log dili magdugay.

Alang sa kasaligan nga pagtipig sa mga troso kami adunay makina log-engine. Kini mao ang tukma ngano nga kini gibuhat ug kaylap nga gigamit sa usa ka dako nga gidaghanon sa mga clusters. Ang pinakadako nga cluster nga akong nahibal-an sa mga tindahan sa 600 TB sa mga packed logs.

Karaan na kaayo ang makina, naay mga cluster nga 6-7 years old na. Adunay mga problema niini nga among gisulayan nga sulbaron, pananglitan, nagsugod kami sa aktibong paggamit sa ClickHouse sa pagtipig sa mga troso.

Pagkolekta og mga troso sa ClickHouse

Kini nga diagram nagpakita kung giunsa nato paglakaw sa atong mga makina.

FAQ sa arkitektura ug buhat sa VKontakte

Adunay code nga moadto sa lokal pinaagi sa RPC ngadto sa RPC-proxy, ug kini nakasabut kung asa moadto sa makina. Kung gusto namon magsulat og mga troso sa ClickHouse, kinahanglan namon nga usbon ang duha ka bahin sa kini nga laraw:

  • ilisan ang pipila ka makina sa ClickHouse;
  • ilisan ang RPC proxy, nga dili maka-access sa ClickHouse, nga adunay pipila ka solusyon nga mahimo, ug pinaagi sa RPC.

Ang makina yano ra - gipulihan namon kini sa usa ka server o usa ka kumpol sa mga server nga adunay ClickHouse.

Ug aron makaadto sa ClickHouse, among gibuhat Balay sa Kuting. Kon kita moadto direkta gikan sa KittenHouse ngadto sa ClickHouse, kini dili makasagubang. Bisan kung wala’y mga hangyo, nagdugang kini gikan sa mga koneksyon sa HTTP sa daghang mga makina. Aron molihok ang laraw, sa usa ka server nga adunay ClickHouse gipataas ang lokal nga reverse proxy, nga gisulat sa paagi nga kini makasugakod sa gikinahanglan nga gidaghanon sa mga koneksyon. Mahimo usab kini nga buffer data sa sulod sa iyang kaugalingon nga medyo kasaligan.

FAQ sa arkitektura ug buhat sa VKontakte

Usahay dili namo gusto nga ipatuman ang RPC scheme sa dili standard nga mga solusyon, pananglitan, sa nginx. Busa, ang KittenHouse adunay katakus nga makadawat mga troso pinaagi sa UDP.

FAQ sa arkitektura ug buhat sa VKontakte

Kung ang nagpadala ug nakadawat sa mga troso nagtrabaho sa parehas nga makina, nan ang posibilidad nga mawala ang usa ka pakete sa UDP sa sulod sa lokal nga host gamay ra. Isip usa ka pagkompromiso tali sa panginahanglan sa pagpatuman sa RPC sa usa ka ikatulo nga partido nga solusyon ug kasaligan, gigamit lang namo ang pagpadala sa UDP. Balikan nato kini nga laraw sa ulahi.

Pagbantay

Duna miy duha ka matang sa mga log: kadtong gikolekta sa mga administrador sa ilang mga server ug kadtong gisulat sa mga developers gikan sa code. Sila katumbas sa duha ka matang sa metrics: sistema ug produkto.

Mga sukatan sa sistema

Naglihok kini sa tanan namong mga server netdata, nga nagkolekta sa mga estadistika ug gipadala kini sa Graphite nga Carbon. Busa, ang ClickHouse gigamit isip usa ka sistema sa pagtipig, ug dili Whisper, pananglitan. Kung gikinahanglan, direkta ka nga makabasa gikan sa ClickHouse, o magamit grafana para sa metrics, graphs ug reports. Isip mga developers, aduna kami igong access sa Netdata ug Grafana.

Mga sukatan sa produkto

Alang sa kasayon, nagsulat kami og daghang mga butang. Pananglitan, adunay usa ka hugpong sa mga ordinaryo nga mga gimbuhaton nga nagtugot kanimo sa pagsulat sa mga Count, UniqueCounts nga mga kantidad sa mga estadistika, nga gipadala sa usa ka lugar nga labi pa.

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

$stats = statlogsStatData($params)

Pagkahuman, mahimo namong gamiton ang paghan-ay ug pag-grupo sa mga filter ug buhaton ang tanan nga gusto namon gikan sa estadistika - paghimo og mga graph, i-configure ang mga Watchdog.

Kami nagsulat kaayo daghang metrics ang gidaghanon sa mga panghitabo gikan sa 600 bilyon ngadto sa 1 trilyon kada adlaw. Bisan pa, gusto namon nga huptan sila labing menos duha ka tuigaron masabtan ang mga uso sa metrics. Ang paghiusa sa tanan usa ka dakong problema nga wala pa namo masulbad. Isulti ko kanimo kung giunsa kini nagtrabaho sa miaging pipila ka tuig.

Kami adunay mga gimbuhaton nga nagsulat niini nga mga sukatan sa lokal nga memcachearon maminusan ang gidaghanon sa mga entri. Kausa sa hamubo nga panahon gilusad sa lokal stats-daemon nagkolekta sa tanan nga mga rekord. Sunod, gihiusa sa demonyo ang mga sukatan sa duha ka layer sa mga server mga tigkolekta sa troso, nga nag-aggregate sa mga estadistika gikan sa usa ka hugpong sa atong mga makina aron ang layer sa likod niini dili mamatay.

FAQ sa arkitektura ug buhat sa VKontakte

Kung gikinahanglan, makasulat kami direkta sa mga tigkolekta sa troso.

FAQ sa arkitektura ug buhat sa VKontakte

Apan ang pagsulat gikan sa kodigo direkta ngadto sa mga kolektor, nga nag-bypass sa stas-daemom, usa ka dili maayo nga scalable nga solusyon tungod kay kini nagdugang sa load sa kolektor. Ang solusyon angay lamang kung tungod sa pipila ka rason dili nato mapataas ang memcache stats-daemon sa makina, o kini nahagsa ug diretso mi.

Sunod, ang mga tigkolekta sa troso naghiusa sa mga estadistika meowDB - kini ang among database, nga mahimo usab nga magtipig sa mga sukatan.

FAQ sa arkitektura ug buhat sa VKontakte

Dayon makahimo kita og binary “near-SQL” nga mga pagpili gikan sa code.

FAQ sa arkitektura ug buhat sa VKontakte

Pag-eksperimento

Sa ting-init sa 2018, kami adunay usa ka internal nga hackathon, ug ang ideya mitungha aron pagsulay sa pag-ilis sa pula nga bahin sa diagram sa usa ka butang nga makatipig sa mga sukatan sa ClickHouse. Kami adunay mga troso sa ClickHouse - nganong dili kini sulayan?

FAQ sa arkitektura ug buhat sa VKontakte

Kami adunay laraw nga nagsulat og mga troso pinaagi sa KittenHouse.

FAQ sa arkitektura ug buhat sa VKontakte

Nakahukom mi idugang ang laing “*Balay” sa dayagram, nga makadawat sa eksakto nga mga sukatan sa format samtang ang among code nagsulat niini pinaagi sa UDP. Unya kini nga *Balay gihimo kini nga mga insert, sama sa mga troso, nga nasabtan sa KittenHouse. Hingpit niyang mahatud kini nga mga troso sa ClickHouse, nga kinahanglan nga makabasa niini.

FAQ sa arkitektura ug buhat sa VKontakte

Ang laraw nga adunay memcache, stats-daemon ug logs-collectors database gipulihan niini.

FAQ sa arkitektura ug buhat sa VKontakte

Ang laraw nga adunay memcache, stats-daemon ug logs-collectors database gipulihan niini.

  • Adunay usa ka dispatch gikan sa code dinhi, nga gisulat sa lokal sa StatsHouse.
  • Gisulat sa StatsHouse ang mga sukatan sa UDP, nabag-o na sa mga pagsulud sa SQL, sa KittenHouse sa mga batch.
  • Gipadala sila sa KittenHouse sa ClickHouse.
  • Kung gusto namon nga basahon kini, dayon among basahon kini nga nag-bypass sa StatsHouse - direkta gikan sa ClickHouse gamit ang regular nga SQL.

Mao ra gihapon eksperimento, pero ganahan mi kung unsa ni. Kung atong ayuhon ang mga problema sa laraw, nan tingali kita mobalhin niini sa hingpit. Sa personal, naglaum ko.

Ang laraw dili makaluwas sa puthaw. Diyutay nga mga server ang gikinahanglan, ang mga lokal nga stats-daemon ug mga log-collectors dili kinahanglan, apan ang ClickHouse nagkinahanglan og mas dako nga server kay sa anaa sa kasamtangan nga laraw. Diyutay nga mga server ang gikinahanglan, apan kini kinahanglan nga mas mahal ug mas gamhanan.

Ipakaylap

Una, atong tan-awon ang PHP deployment. Nag-develop kami sa git: gamita GitLab и TeamCity alang sa deployment. Ang mga sanga sa pag-uswag gihiusa ngadto sa master branch, gikan sa master alang sa pagsulay sila gihiusa ngadto sa staging, ug gikan sa stage ngadto sa produksyon.

Sa wala pa i-deploy, ang kasamtangan nga sanga sa produksiyon ug ang nauna gikuha, ug ang mga diff file gikonsiderar sa kanila - mga pagbag-o: gibuhat, gitangtang, gibag-o. Kini nga pagbag-o girekord sa binlog sa usa ka espesyal nga copyfast nga makina, nga dali nga makakopya sa mga pagbag-o sa among tibuuk nga armada sa server. Ang gigamit dinhi dili direkta nga pagkopya, apan replikasyon sa tsismis, sa diha nga ang usa ka server nagpadala ug mga kausaban ngadto sa iyang mga suod nga silingan, kadtong ngadto sa ilang mga silingan, ug uban pa. Gitugotan ka niini nga i-update ang code sa napulo ug mga yunit sa mga segundo sa tibuuk nga armada. Kung ang pagbag-o moabut sa lokal nga replika, kini magamit kini nga mga patch sa niini lokal nga sistema sa file. Ang rollback gihimo usab sumala sa parehas nga laraw.

Daghan usab ang among gipakatap nga kPHP ug aduna usab kini kaugalingong kalamboan sa git sumala sa dayagram sa ibabaw. Sukad niini Binary sa HTTP server, unya dili kami makahimo og diff - ang release binary motimbang og gatusan ka MB. Busa, adunay lain nga kapilian dinhi - ang bersyon gisulat sa binlog copyfast. Sa matag pagtukod kini nagdugang, ug sa panahon sa rollback kini usab nagdugang. Bersyon gisundog sa mga server. Nakita sa mga lokal nga copyfast nga usa ka bag-ong bersyon ang nakasulod sa binlog, ug pinaagi sa parehas nga pagkopya sa tsismis ilang gikuha ang pinakabag-o nga bersyon sa binary alang sa ilang kaugalingon, nga wala gikapoy ang among master server, apan mabinantayon nga gipakaylap ang load sa network. Unsa ang mosunod nindot nga paglusad pag-usab alang sa bag-ong bersyon.

Alang sa among mga makina, nga hinungdanon usab nga binary, ang laraw parehas kaayo:

  • git master branch;
  • binary sa .deb;
  • ang bersyon gisulat sa binlog copyfast;
  • gisundog sa mga server;
  • ang server mokuha ug bag-ong .dep;
  • dpkg -i;
  • nindot nga paglusad pag-usab sa bag-ong bersyon.

Ang kalainan mao nga ang among binary giputos sa mga archive .deb, ug sa dihang nagbomba sila dpkg -i gibutang sa sistema. Ngano nga ang kPHP gi-deploy ingon usa ka binary, ug ang mga makina gi-deploy ingon dpkg? Ingon niana ang nahitabo. Kini molihok - ayaw paghikap niini.

Mapuslanon nga sumpay:

Si Alexey Akulovich usa sa mga, isip bahin sa Komite sa Programa, nagtabang PHP Russia sa Mayo 17 mahimong ang pinakadako nga panghitabo sa bag-ohay nga mga panahon alang sa PHP developers. Tan-awa kung unsa ka cool nga PC ang naa namo, unsa mga mamumulong (duha niini nag-develop sa PHP core!) - morag butang nga dili nimo makalimtan kung imong isulat ang PHP.

Source: www.habr.com

Idugang sa usa ka comment