NewSQL = NoSQL+ACID

NewSQL = NoSQL+ACID
Sa ftit ilu, Odnoklassniki ħażen madwar 50 TB ta 'dejta pproċessata f'ħin reali f'SQL Server. Għal volum bħal dan, huwa kważi impossibbli li jiġi pprovdut aċċess veloċi u affidabbli, u anke ċentru tad-dejta tolleranti għall-fallimenti bl-użu ta 'DBMS SQL. Tipikament, f'każijiet bħal dawn, tintuża waħda mill-ħażniet NoSQL, iżda mhux kollox jista 'jiġi trasferit għal NoSQL: xi entitajiet jeħtieġu garanziji ta' tranżazzjoni ACID.

Dan wassalna għall-użu ta 'ħażna NewSQL, jiġifieri, DBMS li jipprovdi tolleranza għall-ħsarat, iskalabbiltà u prestazzjoni ta' sistemi NoSQL, iżda fl-istess ħin iżomm il-garanziji ACID familjari għal sistemi klassiċi. Hemm ftit sistemi industrijali li jaħdmu ta 'din il-klassi l-ġdida, għalhekk implimentajna sistema bħal din aħna stess u poġġiha f'operazzjoni kummerċjali.

Kif taħdem u x'ġara - aqra taħt il-qatgħa.

Illum, l-udjenza ta 'kull xahar ta' Odnoklassniki hija aktar minn 70 miljun viżitatur uniku. Aħna Aħna qegħdin fl-ewwel ħamsa l-akbar netwerks soċjali fid-dinja, u fost l-għoxrin sit li fuqhom l-utenti jqattgħu l-aktar ħin. L-infrastruttura OK tieħu ħsieb tagħbijiet għoljin ħafna: aktar minn miljun talba HTTP/sek kull faċċata. Partijiet minn flotta ta 'server ta' aktar minn biċċa 8000 jinsabu qrib xulxin - f'erba 'ċentri tad-dejta ta' Moska, li jippermetti latency tan-netwerk ta 'inqas minn 1 ms bejniethom.

Ilna nużaw Cassandra mill-2010, u nibdew bil-verżjoni 0.6. Illum hemm diversi tużżani clusters fl-operat. L-iktar cluster mgħaġġel jipproċessa aktar minn 4 miljun operazzjoni kull sekonda, u l-akbar jaħżen 260 TB.

Madankollu, dawn huma kollha clusters NoSQL ordinarji użati għall-ħażna kkoordinat dgħajjef data. Ridna nissostitwixxu l-ħażna konsistenti ewlenija, Microsoft SQL Server, li ilha tintuża sa mit-twaqqif ta 'Odnoklassniki. Il-ħażna kienet tikkonsisti f'aktar minn 300 magna SQL Server Standard Edition, li kien fihom 50 TB ta 'data - entitajiet kummerċjali. Din id-dejta hija modifikata bħala parti mit-tranżazzjonijiet ACID u teħtieġ konsistenza għolja.

Biex tqassam id-dejta fuq in-nodi ta 'SQL Server, użajna kemm vertikali kif ukoll orizzontali qsim (sharding). Storikament, użajna skema sempliċi ta 'sharding tad-dejta: kull entità kienet assoċjata ma' token - funzjoni tal-ID tal-entità. Entitajiet bl-istess token tpoġġew fuq l-istess server SQL. Ir-relazzjoni master-dettall ġiet implimentata sabiex it-tokens tar-rekords prinċipali u tat-tfal dejjem jaqblu u kienu jinsabu fuq l-istess server. F'netwerk soċjali, kważi r-rekords kollha huma ġġenerati f'isem l-utent - li jfisser li d-dejta kollha tal-utent f'subsistema funzjonali waħda hija maħżuna fuq server wieħed. Jiġifieri, tranżazzjoni kummerċjali kważi dejjem kienet tinvolvi tabelli minn server SQL wieħed, li għamilha possibbli li tiġi żgurata l-konsistenza tad-dejta bl-użu ta’ tranżazzjonijiet ACID lokali, mingħajr il-ħtieġa li jintużaw bil-mod u mhux affidabbli transazzjonijiet ACID imqassma.

Grazzi għal sharding u biex tħaffef l-SQL:

  • Aħna ma nużawx restrizzjonijiet ta 'ċavetta Barranija, peress li meta titqassam l-ID tal-entità tista' tkun tinsab fuq server ieħor.
  • Aħna ma nużawx proċeduri maħżuna u triggers minħabba t-tagħbija addizzjonali fuq is-CPU tad-DBMS.
  • Aħna ma nużawx JOINs minħabba dak kollu ta 'hawn fuq u ħafna qari każwali minn disk.
  • Barra minn tranżazzjoni, nużaw il-livell ta' iżolament Read Uncommitted biex innaqqsu l-imblokk.
  • Aħna nwettqu biss tranżazzjonijiet qosra (b'medja iqsar minn 100 ms).
  • Aħna ma nużawx UPDATE u DELETE b'ħafna ringieli minħabba n-numru kbir ta' deadlocks - naġġornaw rekord wieħed biss kull darba.
  • Aħna dejjem inwettqu mistoqsijiet biss fuq l-indiċi - mistoqsija bi pjan sħiħ ta 'skannjar ta' tabella għalina tfisser tagħbija żejda tad-database u tikkawża li tfalli.

Dawn il-passi ppermettewna nagħsru l-prestazzjoni kważi massima mis-servers SQL. Madankollu, il-problemi saru aktar u aktar numerużi. Ejja nħarsu lejhom.

Problemi bl-SQL

  • Peress li użajna sharding miktuba minnha nfisha, iż-żieda ta 'shards ġodda saret manwalment mill-amministraturi. Dan iż-żmien kollu, repliki ta' data skalabbli ma kinux qed jagħtu servizz għal talbiet.
  • Hekk kif in-numru ta 'rekords fit-tabella jikber, il-veloċità tal-inserzjoni u l-modifika tonqos; meta żżid indiċijiet ma' tabella eżistenti, il-veloċità tonqos b'fattur; il-ħolqien u l-ħolqien mill-ġdid ta 'indiċi jseħħu ma' ħin ta' waqfien.
  • Li jkollok ammont żgħir ta 'Windows għal SQL Server fil-produzzjoni jagħmel il-ġestjoni tal-infrastruttura diffiċli

Iżda l-problema ewlenija hija

tolleranza għall-ħsarat

Is-server klassiku SQL għandu tolleranza fqira għall-ħsarat. Ejja ngħidu li għandek server tad-database wieħed biss, u jonqos darba kull tliet snin. Matul dan iż-żmien is-sit jinżel għal 20 minuta, li huwa aċċettabbli. Jekk għandek 64 servers, allura s-sit jinżel darba kull tliet ġimgħat. U jekk għandek 200 server, allura s-sit ma jaħdimx kull ġimgħa. Din hija problema.

X'jista' jsir biex tittejjeb it-tolleranza tal-ħsarat ta' server SQL? Il-Wikipedija tistidinna nibnu cluster disponibbli ħafna: fejn f'każ ta 'falliment ta' xi wieħed mill-komponenti hemm wieħed backup.

Dan jeħtieġ flotta ta 'tagħmir għali: duplikazzjonijiet numerużi, fibra ottika, ħażna kondiviża, u l-inklużjoni ta' riżerva ma taħdimx b'mod affidabbli: madwar 10% ta 'swiċċijiet jispiċċaw bil-falliment tan-node backup bħal ferrovija wara n-nodu prinċipali.

Iżda l-iżvantaġġ ewlieni ta 'tali cluster disponibbli ħafna huwa żero disponibbiltà jekk iċ-ċentru tad-dejta li jinsab fih ifalli. Odnoklassniki għandha erba 'ċentri tad-dejta, u għandna bżonn niżguraw l-operat f'każ ta' falliment sħiħ f'wieħed minnhom.

Għal dan nistgħu nużaw Multi-Master replikazzjoni mibnija fis-SQL Server. Din is-soluzzjoni tiswa ħafna aktar minħabba l-ispiża tas-softwer u tbati minn problemi magħrufa bir-replikazzjoni - dewmien imprevedibbli tat-tranżazzjonijiet b'replikazzjoni sinkronika u dewmien fl-applikazzjoni ta 'repliki (u, bħala riżultat, modifiki mitlufa) b'replikazzjoni asinkronika. L-impliċita riżoluzzjoni manwali tal-kunflitti jagħmel din l-għażla kompletament inapplikabbli għalina.

Dawn il-problemi kollha kienu jeħtieġu soluzzjoni radikali, u bdejna nanalizzawhom fid-dettall. Hawnhekk irridu niffamiljarizzaw ruħhom ma 'dak li SQL Server prinċipalment jagħmel - transazzjonijiet.

Transazzjoni sempliċi

Ejja nikkunsidraw l-aktar transazzjoni sempliċi, mil-lat ta 'programmatur SQL applikat: iż-żieda ta' ritratt ma 'album. Albums u ritratti huma maħżuna fi pjanċi differenti. L-album għandu kontur tar-ritratti pubbliku. Imbagħad tranżazzjoni bħal din hija maqsuma fil-passi li ġejjin:

  1. Nibblukkaw l-album biċ-ċavetta.
  2. Oħloq entrata fit-tabella tar-ritratti.
  3. Jekk ir-ritratt għandu status pubbliku, imbagħad żid kontur tar-ritratti pubbliċi mal-album, aġġorna r-rekord u ikkommetti t-tranżazzjoni.

Jew fil-psewdocode:

TX.start("Albums", id);
Album album = albums.lock(id);
Photo photo = photos.create(…);

if (photo.status == PUBLIC ) {
    album.incPublicPhotosCount();
}
album.update();

TX.commit();

Naraw li l-aktar xenarju komuni għal tranżazzjoni kummerċjali huwa li taqra d-dejta mid-database fil-memorja tas-server tal-applikazzjoni, tibdel xi ħaġa u ssalva l-valuri l-ġodda lura fid-database. Normalment fi tranżazzjoni bħal din naġġornaw diversi entitajiet, diversi tabelli.

Meta tesegwixxi tranżazzjoni, tista' sseħħ modifika konkorrenti tal-istess dejta minn sistema oħra. Pereżempju, Antispam jista 'jiddeċiedi li l-utent huwa b'xi mod suspettuż u għalhekk ir-ritratti kollha tal-utent m'għandhomx jibqgħu pubbliċi, jeħtieġ li jintbagħtu għall-moderazzjoni, li jfisser li tinbidel photo.status għal xi valur ieħor u titfi l-counters korrispondenti. Ovvjament, jekk din l-operazzjoni sseħħ mingħajr garanziji ta 'atomiċità ta' applikazzjoni u iżolament ta 'modifiki li jikkompetu, bħal f' ACID, allura r-riżultat mhux se jkun dak li huwa meħtieġ - jew il-counter tar-ritratti se juri l-valur ħażin, jew ir-ritratti mhux kollha jintbagħtu għall-moderazzjoni.

Ħafna kodiċi simili, li jimmanipulaw diversi entitajiet kummerċjali fi tranżazzjoni waħda, inkitbu matul l-eżistenza kollha ta 'Odnoklassniki. Ibbażat fuq l-esperjenza tal-migrazzjoni lejn NoSQL minn Konsistenza Eventwali Aħna nafu li l-akbar sfida (u l-investiment fil-ħin) tiġi mill-iżvilupp tal-kodiċi biex tinżamm il-konsistenza tad-dejta. Għalhekk, ikkunsidrajna r-rekwiżit ewlieni għall-ħażna l-ġdida bħala dispożizzjoni għal tranżazzjonijiet ACID reali għal-loġika tal-applikazzjoni.

Rekwiżiti oħra, mhux inqas importanti, kienu:

  • Jekk iċ-ċentru tad-dejta jfalli, kemm il-qari kif ukoll il-kitba fil-ħażna l-ġdida għandhom ikunu disponibbli.
  • Iż-żamma tal-veloċità tal-iżvilupp attwali. Jiġifieri, meta taħdem ma 'repożitorju ġdid, l-ammont ta' kodiċi għandu jkun bejn wieħed u ieħor l-istess; m'għandux ikun hemm bżonn li żżid xi ħaġa mar-repożitorju, tiżviluppa algoritmi biex isolvu l-kunflitti, iż-żamma ta 'indiċi sekondarji, eċċ.
  • Il-veloċità tal-ħażna l-ġdida kellha tkun pjuttost għolja, kemm meta taqra d-dejta kif ukoll meta tipproċessa tranżazzjonijiet, li effettivament fisser li soluzzjonijiet akkademikament rigorużi, universali, iżda bil-mod, bħal, pereżempju, ma kinux applikabbli impenji f'żewġ fażijiet.
  • Skalar awtomatiku fuq il-fly.
  • Bl-użu ta 'servers irħas regolari, mingħajr il-ħtieġa li tixtri hardware eżotiku.
  • Possibbiltà ta 'żvilupp tal-ħażna mill-iżviluppaturi tal-kumpanija. Fi kliem ieħor, ingħatat prijorità lil soluzzjonijiet proprjetarji jew open source, preferibbilment f'Java.

Deċiżjonijiet, deċiżjonijiet

Meta analizzat is-soluzzjonijiet possibbli, wasalna għal żewġ għażliet ta 'arkitettura possibbli:

L-ewwel huwa li tieħu kwalunkwe server SQL u timplimenta t-tolleranza tal-ħsarat meħtieġa, il-mekkaniżmu ta 'skala, il-cluster ta' failover, ir-riżoluzzjoni tal-kunflitt u t-tranżazzjonijiet ACID distribwiti, affidabbli u veloċi. Aħna kklassifikajna din l-għażla bħala mhux trivjali ħafna u li teħtieġ ħafna xogħol.

It-tieni għażla hija li tieħu ħażna NoSQL lesta b'iskala implimentata, cluster ta' failover, riżoluzzjoni ta 'kunflitt, u timplimenta tranżazzjonijiet u SQL lilek innifsek. L-ewwel daqqa t'għajn, anke l-kompitu li timplimenta SQL, biex ma nsemmux tranżazzjonijiet ACID, tidher qisha kompitu li se jieħu s-snin. Imma mbagħad indunajna li s-sett tal-karatteristiċi SQL li nużaw fil-prattika huwa 'l bogħod mill-ANSI SQL daqs Cassandra CQL bogħod minn ANSI SQL. Meta nħarsu aktar mill-qrib lejn CQL, indunajna li kien pjuttost qrib dak li kellna bżonn.

Cassandra u CQL

Allura, x'inhu interessanti dwar Cassandra, liema kapaċitajiet għandha?

L-ewwelnett, hawnhekk tista 'toħloq tabelli li jappoġġaw diversi tipi ta' dejta; tista 'tagħmel SELECT jew UPDATE fuq iċ-ċavetta primarja.

CREATE TABLE photos (id bigint KEY, owner bigint,…);
SELECT * FROM photos WHERE id=?;
UPDATE photos SET … WHERE id=?;

Biex tiżgura l-konsistenza tad-dejta tar-replika, tuża Cassandra approċċ tal-kworum. Fl-aktar każ sempliċi, dan ifisser li meta tliet repliki tal-istess ringiela jitqiegħdu fuq nodi differenti tal-cluster, il-kitba titqies bħala suċċess jekk il-maġġoranza tan-nodi (jiġifieri tnejn minn tlieta) ikkonfermaw is-suċċess ta’ din l-operazzjoni ta’ kitba. . Id-dejta tar-ringiela titqies konsistenti jekk, waqt il-qari, il-maġġoranza tan-nodi ġew mistħarrġa u kkonfermawhom. Għalhekk, bi tliet repliki, il-konsistenza tad-dejta sħiħa u immedjata hija garantita jekk node wieħed ifalli. Dan l-approċċ ippermetta li nimplimentaw skema saħansitra aktar affidabbli: dejjem ibgħat it-talbiet lit-tliet repliki kollha, nistennew tweġiba mit-tnejn l-aktar mgħaġġla. Ir-rispons tard tat-tielet replika jintrema f'dan il-każ. Nodu li jkun tard biex jirrispondu jista 'jkollu problemi serji - brejkijiet, ġbir ta' żibel fil-JVM, reklamazzjoni diretta tal-memorja fil-kernel tal-Linux, ħsara fil-hardware, skonnessjoni min-netwerk. Madankollu, dan ma jaffettwa bl-ebda mod l-operazzjonijiet jew id-dejta tal-klijent.

L-approċċ meta nikkuntattjaw tliet nodi u nirċievu tweġiba minn tnejn jissejjaħ spekulazzjoni: tintbagħat talba għal repliki żejda anki qabel ma “taqa’”.

Benefiċċju ieħor ta 'Cassandra huwa Batchlog, mekkaniżmu li jiżgura li lott ta' bidliet li tagħmel jew jiġu applikati bis-sħiħ jew ma jiġux applikati xejn. Dan jippermettilna nsolvu A fl-AĊIDU - atomiċità barra mill-kaxxa.

L-eqreb ħaġa għat-tranżazzjonijiet f'Cassandra huma l-hekk imsejħa "tranżazzjonijiet ħfief". Iżda huma 'l bogħod minn tranżazzjonijiet ACID "reali": fil-fatt, din hija opportunità li tagħmel CAS fuq data minn rekord wieħed biss, bl-użu ta’ kunsens bl-użu tal-protokoll ta’ Paxos heavyweight. Għalhekk, il-veloċità ta 'tranżazzjonijiet bħal dawn hija baxxa.

Dak li konna neqsin f'Cassandra

Allura, kellna nimplimentaw transazzjonijiet reali ACID f'Cassandra. Bl-użu li nistgħu faċilment nimplimentaw żewġ karatteristiċi konvenjenti oħra ta 'DBMS klassika: indiċijiet veloċi konsistenti, li jippermettulna nwettqu selezzjonijiet ta' data mhux biss biċ-ċavetta primarja, u ġeneratur regolari ta 'IDs awto-inkrementali monotoniċi.

C*One

Għalhekk twieled DBMS ġdid C*One, li jikkonsisti fi tliet tipi ta’ nodi tas-server:

  • Ħażna – (kważi) servers Cassandra standard responsabbli għall-ħażna tad-dejta fuq diski lokali. Hekk kif it-tagħbija u l-volum tad-dejta jikbru, il-kwantità tagħhom tista 'tiġi skalata faċilment għal għexieren u mijiet.
  • Koordinaturi tat-tranżazzjonijiet - jiżguraw l-eżekuzzjoni tat-tranżazzjonijiet.
  • Il-klijenti huma servers tal-applikazzjoni li jimplimentaw operazzjonijiet tan-negozju u jibdew tranżazzjonijiet. Jista 'jkun hemm eluf ta' klijenti bħal dawn.

NewSQL = NoSQL+ACID

Servers ta 'kull tip huma parti minn cluster komuni, jużaw il-protokoll intern tal-messaġġ Cassandra biex jikkomunikaw ma' xulxin u gossip għall-iskambju ta' informazzjoni dwar clusters. Bil-Heartbeat, is-servers jitgħallmu dwar fallimenti reċiproċi, iżommu skema tad-dejta waħda - tabelli, l-istruttura u r-replikazzjoni tagħhom; skema ta' qsim, topoloġija ta' cluster, eċċ.

Klijenti

NewSQL = NoSQL+ACID

Minflok sewwieqa standard, tintuża l-modalità Fat Client. Tali node ma jaħżenx data, iżda jista 'jaġixxi bħala koordinatur għall-eżekuzzjoni tat-talba, jiġifieri, il-Klijent innifsu jaġixxi bħala koordinatur tat-talbiet tiegħu: jistaqsi repliki tal-ħażna u jsolvi l-kunflitti. Dan mhux biss huwa aktar affidabbli u aktar mgħaġġel mis-sewwieq standard, li jeħtieġ komunikazzjoni ma 'koordinatur remot, iżda jippermetti wkoll li tikkontrolla t-trażmissjoni tat-talbiet. Barra minn tranżazzjoni miftuħa fuq il-klijent, it-talbiet jintbagħtu lir-repożitorji. Jekk il-klijent ikun fetaħ transazzjoni, allura t-talbiet kollha fi ħdan it-tranżazzjoni jintbagħtu lill-koordinatur tat-tranżazzjoni.
NewSQL = NoSQL+ACID

C*Koordinatur tat-Tranżazzjoni Wieħed

Il-koordinatur hija xi ħaġa li implimentajna għal C*One mill-bidu. Huwa responsabbli għall-ġestjoni tat-tranżazzjonijiet, serraturi, u l-ordni li fiha t-tranżazzjonijiet huma applikati.

Għal kull tranżazzjoni servis, il-koordinatur jiġġenera timestamp: kull tranżazzjoni sussegwenti hija akbar mit-tranżazzjoni preċedenti. Peress li s-sistema ta' riżoluzzjoni tal-kunflitti ta' Cassandra hija bbażata fuq timestamps (ta' żewġ rekords konfliġġenti, dak bl-aħħar timestamp huwa meqjus attwali), il-kunflitt dejjem se jiġi solvut favur it-tranżazzjoni sussegwenti. Għalhekk implimentajna L-għassa Lampport - mod irħis biex isolvu l-kunflitti f'sistema distribwita.

Serraturi

Biex niżguraw l-iżolament, iddeċidejna li nużaw l-aktar metodu sempliċi - serraturi pessimisti bbażati fuq iċ-ċavetta primarja tar-rekord. Fi kliem ieħor, fi tranżazzjoni, rekord għandu l-ewwel jiġi msakkar, imbagħad biss jinqara, modifikat u salvat. Huwa biss wara impenn b'suċċess li jista' jinfetaħ rekord sabiex it-tranżazzjonijiet li jikkompetu jkunu jistgħu jużawh.

L-implimentazzjoni ta 'tali qfil hija sempliċi f'ambjent mhux distribwit. F'sistema distribwita, hemm żewġ għażliet ewlenin: jew timplimenta l-illokkjar distribwit fuq il-cluster, jew tqassam tranżazzjonijiet sabiex it-tranżazzjonijiet li jinvolvu l-istess rekord dejjem ikunu servut mill-istess koordinatur.

Peress li fil-każ tagħna d-dejta diġà hija mqassma fost gruppi ta 'tranżazzjonijiet lokali f'SQL, ġie deċiż li jiġu assenjati gruppi ta' tranżazzjonijiet lokali lill-koordinaturi: koordinatur wieħed iwettaq it-tranżazzjonijiet kollha b'tokens minn 0 sa 9, it-tieni - b'tokens minn 10 sa 19, u l-bqija. Bħala riżultat, kull waħda mill-istanzi tal-koordinatur issir il-kaptan tal-grupp tat-tranżazzjonijiet.

Imbagħad serraturi jistgħu jiġu implimentati fil-forma ta 'HashMap banali fil-memorja tal-koordinatur.

Koordinaturi fallimenti

Peress li koordinatur wieħed iservi esklussivament grupp ta 'tranżazzjonijiet, huwa importanti ħafna li jiġi determinat malajr il-fatt tal-falliment tiegħu sabiex it-tieni tentattiv biex tesegwixxi t-tranżazzjoni jispiċċa. Biex nagħmlu dan mgħaġġel u affidabbli, użajna protokoll tal-hearbeat tal-kworum kompletament konness:

Kull ċentru tad-dejta jospita mill-inqas żewġ nodi koordinaturi. Perjodikament, kull koordinatur jibgħat messaġġ ta’ taħbit tal-qalb lill-koordinaturi l-oħra u jinfurmahom dwar il-funzjonament tiegħu, kif ukoll liema messaġġi ta’ taħbit tal-qalb irċieva mingħand liema koordinaturi fil-cluster l-aħħar darba.

NewSQL = NoSQL+ACID

Meta jirċievi informazzjoni simili mingħand ħaddieħor bħala parti mill-messaġġi tat-taħbit tal-qalb tagħhom, kull koordinatur jiddeċiedi għalih innifsu liema nodi tal-cluster qed jaħdmu u liema mhumiex, iggwidati mill-prinċipju tal-kworum: jekk in-node X irċieva informazzjoni mill-maġġoranza tan-nodi fil-cluster dwar in-normali irċevuta ta 'messaġġi minn node Y, imbagħad , Y xogħlijiet. U viċi versa, hekk kif il-maġġoranza tirrapporta messaġġi nieqsa min-node Y, allura Y irrifjutat. Huwa kurjuż li jekk il-kworum jinforma lin-node X li m'għadux jirċievi messaġġi minnu, allura n-node X innifsu jqis lilu nnifsu li falla.

Il-messaġġi tat-taħbit tal-qalb jintbagħtu bi frekwenza għolja, madwar 20 darba kull sekonda, b'perjodu ta '50 ms. F'Java, huwa diffiċli li tiggarantixxi r-rispons tal-applikazzjoni fi żmien 50 ms minħabba t-tul komparabbli tal-pawżi kkawżati mill-kollettur taż-żibel. Konna kapaċi niksbu dan il-ħin ta 'rispons bl-użu tal-kollettur taż-żibel G1, li jippermettilna nispeċifikaw mira għat-tul ta' pawżi GC. Madankollu, xi drabi, pjuttost rari, il-kollettur pawżi jaqbeż il-50 ms, li jista 'jwassal għal skoperta ta' ħsara falza. Biex dan ma jseħħx, il-koordinatur ma jirrapportax falliment ta’ nodu remot meta l-ewwel messaġġ ta’ taħbit tal-qalb minnu jisparixxi, biss jekk sparixxew diversi wara xulxin.Dan hu kif irnexxielna niskopru falliment tan-nodu tal-koordinatur f’200. Sinjorina.

Iżda mhux biżżejjed li tifhem malajr liema node waqaf jaħdem. Għandna bżonn nagħmlu xi ħaġa dwar dan.

Riżerva

L-iskema klassika tinvolvi, fil-każ ta’ falliment tal-kaptan, li tibda elezzjoni ġdida bl-użu ta’ waħda minn moda universali algoritmi. Madankollu, algoritmi bħal dawn għandhom problemi magħrufa sew bil-konverġenza taż-żmien u t-tul tal-proċess elettorali nnifsu. Irnexxielna nevitaw dewmien addizzjonali bħal dan bl-użu ta’ skema ta’ sostituzzjoni tal-koordinaturi f’netwerk kompletament konness:

NewSQL = NoSQL+ACID

Ejja ngħidu li rridu nwettqu tranżazzjoni fil-grupp 50. Ejja niddeterminaw minn qabel l-iskema ta 'sostituzzjoni, jiġifieri, liema nodi se jesegwixxu tranżazzjonijiet fil-grupp 50 fil-każ ta' falliment tal-koordinatur ewlieni. L-għan tagħna huwa li nżommu l-funzjonalità tas-sistema fil-każ ta’ ħsara fiċ-ċentru tad-dejta. Ejja niddeterminaw li l-ewwel riżerva tkun nodu minn ċentru tad-dejta ieħor, u t-tieni riserva tkun nodu minn terz. Din l-iskema tintgħażel darba u ma tinbidilx sakemm tinbidel it-topoloġija tal-cluster, jiġifieri, sakemm jidħlu fiha nodi ġodda (li jiġri rari ħafna). Il-proċedura għall-għażla ta 'kaptan attiv ġdid jekk il-qadim jonqos dejjem se tkun kif ġej: l-ewwel riserva ssir il-kaptan attiv, u jekk tkun waqfet taħdem, it-tieni riżerva ssir il-kaptan attiv.

Din l-iskema hija aktar affidabbli mill-algoritmu universali, peress li biex jiġi attivat kaptan ġdid huwa biżżejjed li jiġi ddeterminat il-falliment tal-qadim.

Imma kif se jifhmu l-klijenti liema kaptan qed jaħdem issa? Huwa impossibbli li tibgħat informazzjoni lil eluf ta 'klijenti f'50 ms. Sitwazzjoni hija possibbli meta klijent jibgħat talba biex tiftaħ transazzjoni, ma jkunx għadu jaf li dan il-kaptan m'għadux jiffunzjona, u t-talba tispiċċa. Biex dan ma jseħħx, il-klijenti b'mod spekulattiv jibagħtu talba biex tiftaħ transazzjoni lill-kaptan tal-grupp u ż-żewġ riservi tiegħu f'daqqa, iżda dak li huwa l-kaptan attiv fil-mument biss jirrispondi għal din it-talba. Il-klijent se jagħmel il-komunikazzjoni sussegwenti kollha fi ħdan it-tranżazzjoni biss mal-kaptan attiv.

Il-kaptani tal-backup ipoġġu talbiet riċevuti għal tranżazzjonijiet li mhumiex tagħhom fil-kju ta 'tranżazzjonijiet fil-ġuf, fejn huma maħżuna għal xi żmien. Jekk il-kaptan attiv imut, il-kaptan il-ġdid jipproċessa t-talbiet biex jinfetħu transazzjonijiet mill-kju tiegħu u jirrispondi lill-klijent. Jekk il-klijent ikun diġà fetaħ transazzjoni mal-kaptan l-antik, allura t-tieni tweġiba tiġi injorata (u, ovvjament, tranżazzjoni bħal din mhix se titlesta u tiġi ripetuta mill-klijent).

Kif taħdem it-tranżazzjoni

Ejja ngħidu li klijent bagħat talba lill-koordinatur biex tiftaħ transazzjoni għal tali jew tali entità b'tali jew tali ċavetta primarja. Il-koordinatur jissakkar din l-entità u jpoġġiha fit-tabella tal-lock fil-memorja. Jekk meħtieġ, il-koordinatur jaqra din l-entità mill-ħażna u jaħżen id-dejta li tirriżulta fi stat ta’ tranżazzjoni fil-memorja tal-koordinatur.

NewSQL = NoSQL+ACID

Meta klijent irid ibiddel id-dejta fi tranżazzjoni, jibgħat talba lill-koordinatur biex jimmodifika l-entità, u l-koordinatur ipoġġi d-dejta l-ġdida fit-tabella tal-istatus tat-tranżazzjoni fil-memorja. Dan itemm ir-reġistrazzjoni - ma ssir l-ebda reġistrazzjoni fil-ħażna.

NewSQL = NoSQL+ACID

Meta klijent jitlob id-dejta mibdula tiegħu stess bħala parti minn tranżazzjoni attiva, il-koordinatur jaġixxi kif ġej:

  • jekk l-ID tkun diġà fit-tranżazzjoni, allura d-dejta tittieħed mill-memorja;
  • jekk ma jkunx hemm ID fil-memorja, allura d-dejta nieqsa tinqara min-nodi tal-ħażna, flimkien ma 'dawk diġà fil-memorja, u r-riżultat jingħata lill-klijent.

Għalhekk, il-klijent jista 'jaqra l-bidliet tiegħu stess, iżda klijenti oħra ma jarawx dawn il-bidliet, minħabba li huma maħżuna biss fil-memorja tal-koordinatur; għadhom mhumiex fin-nodi Cassandra.

NewSQL = NoSQL+ACID

Meta l-klijent jibgħat il-kommit, l-istat li kien fil-memorja tas-servizz jiġi ffrankat mill-koordinatur f'lott illoggjat, u jintbagħat bħala lott illoggjat lill-ħażna Cassandra. Il-ħwienet jagħmlu dak kollu meħtieġ biex jiżguraw li dan il-pakkett jiġi applikat atomikament (kompletament), u jirritorna tweġiba lill-koordinatur, li jirrilaxxa s-serraturi u jikkonferma s-suċċess tat-tranżazzjoni lill-klijent.

NewSQL = NoSQL+ACID

U biex tirritorna lura, il-koordinatur jeħtieġ biss li jeħles il-memorja okkupata mill-istat tat-tranżazzjoni.

Bħala riżultat tat-titjib ta’ hawn fuq, implimentajna l-prinċipji ACID:

  • Atomiċità. Din hija garanzija li l-ebda tranżazzjoni mhi se tiġi rreġistrata parzjalment fis-sistema; jew is-suboperazzjonijiet kollha tagħha se jitlestew, jew l-ebda waħda mhi se titlesta. Aħna nżommu ma 'dan il-prinċipju permezz ta' lott logged f'Cassandra.
  • Konsistenza. Kull tranżazzjoni ta' suċċess, b'definizzjoni, tirreġistra biss riżultati validi. Jekk, wara li tiftaħ transazzjoni u twettaq parti mill-operazzjonijiet, jiġi skopert li r-riżultat huwa invalidu, isir rollback.
  • Iżolament. Meta titwettaq tranżazzjoni, tranżazzjonijiet konkorrenti m'għandhomx jaffettwaw ir-riżultat tagħha. Tranżazzjonijiet li jikkompetu huma iżolati bl-użu ta 'serraturi pessimisti fuq il-koordinatur. Għal qari barra tranżazzjoni, il-prinċipju ta' iżolament huwa osservat fil-livell ta' Read Committed.
  • Sostenibbiltà. Irrispettivament mill-problemi f'livelli aktar baxxi — qtugħ tas-sistema, ħsara fil-ħardwer — il-bidliet magħmula minn tranżazzjoni li tlestiet b'suċċess għandhom jibqgħu ppreservati meta l-operazzjonijiet jerġgħu jibdew.

Qari bl-indiċi

Ejja nieħdu tabella sempliċi:

CREATE TABLE photos (
id bigint primary key,
owner bigint,
modified timestamp,
…)

Għandu ID (ċavetta primarja), sid u data tal-modifika. Ikollok bżonn tagħmel talba sempliċi ħafna - agħżel data fuq is-sid bid-data tal-bidla "għall-aħħar jum".

SELECT *
WHERE owner=?
AND modified>?

Sabiex tali mistoqsija tiġi pproċessata malajr, f'DBMS SQL klassiku għandek bżonn tibni indiċi bil-kolonni (sid, modifikat). Nistgħu nagħmlu dan pjuttost faċilment, peress li issa għandna garanziji ACID!

Indiċijiet f'C*One

Hemm tabella tas-sors b'ritratti li fihom l-ID tar-rekord hija ċ-ċavetta primarja.

NewSQL = NoSQL+ACID

Għal indiċi, C*One joħloq tabella ġdida li hija kopja tal-oriġinal. Iċ-ċavetta hija l-istess bħall-espressjoni tal-indiċi, u tinkludi wkoll iċ-ċavetta primarja tar-rekord mit-tabella tas-sors:

NewSQL = NoSQL+ACID

Issa l-mistoqsija għal "sid għall-aħħar jum" tista' tinkiteb mill-ġdid bħala għażla minn tabella oħra:

SELECT * FROM i1_test
WHERE owner=?
AND modified>?

Il-konsistenza tad-dejta fir-ritratti tat-tabella tas-sors u t-tabella tal-indiċi i1 tinżamm awtomatikament mill-koordinatur. Ibbażat fuq l-iskema tad-dejta biss, meta tiġi riċevuta bidla, il-koordinatur jiġġenera u jaħżen bidla mhux biss fit-tabella prinċipali, iżda wkoll f'kopji. L-ebda azzjonijiet addizzjonali ma jsiru fuq it-tabella tal-indiċi, ma jinqrawx zkuk, u ma jintużaw l-ebda serraturi. Jiġifieri, iż-żieda tal-indiċi kważi ma tikkonsma l-ebda riżorsi u prattikament m'għandha l-ebda effett fuq il-veloċità tal-applikazzjoni tal-modifiki.

Bl-użu ta 'ACID, stajna nimplimentaw indiċi li jixbħu SQL. Huma konsistenti, skalabbli, veloċi, kompostibbli, u mibnija fil-lingwa ta' query CQL. L-ebda tibdil fil-kodiċi tal-applikazzjoni mhu meħtieġ biex jappoġġja l-indiċi. Kollox huwa sempliċi bħal fl-SQL. U l-aktar importanti, l-indiċi ma jaffettwawx il-veloċità ta 'eżekuzzjoni ta' modifiki għat-tabella tat-tranżazzjoni oriġinali.

X'ġara

Aħna żviluppajna C * One tliet snin ilu u nedietha f'operazzjoni kummerċjali.

X’ksibna fl-aħħar? Ejja nevalwaw dan billi tuża l-eżempju tas-subsistema tal-ipproċessar u l-ħażna tar-ritratti, wieħed mill-aktar tipi importanti ta 'dejta f'netwerk soċjali. Aħna mhux qed nitkellmu dwar il-korpi tar-ritratti nfushom, iżda dwar kull tip ta 'meta-informazzjoni. Issa Odnoklassniki għandha madwar 20 biljun rekords bħal dawn, is-sistema tipproċessa 80 elf rikjesta għal kull sekonda, sa 8 transazzjonijiet ACID kull sekonda assoċjati mal-modifika tad-dejta.

Meta użajna SQL b'fattur ta 'replikazzjoni = 1 (iżda f'RAID 10), il-metainformazzjoni tar-ritratti kienet maħżuna fuq raggruppament disponibbli ħafna ta' 32 magni li jħaddmu Microsoft SQL Server (flimkien ma' 11-il backup). Ġew allokati wkoll 10 servers għall-ħażna tal-backups. Total ta '50 karozza għaljin. Fl-istess ħin, is-sistema ħadmet b'tagħbija ratata, mingħajr riżerva.

Wara l-migrazzjoni għas-sistema l-ġdida, irċevejna fattur ta 'replikazzjoni = 3 - kopja f'kull ċentru tad-dejta. Is-sistema tikkonsisti minn 63 node ta 'ħażna Cassandra u 6 magni koordinaturi, għal total ta' 69 server. Iżda dawn il-magni huma ħafna irħas, l-ispiża totali tagħhom hija madwar 30% tal-ispiża ta 'sistema SQL. Fl-istess ħin, it-tagħbija tinżamm fi 30%.

Bl-introduzzjoni ta 'C*One, il-latency naqset ukoll: fl-SQL, operazzjoni ta' kitba ħadet madwar 4,5 ms. F'C*One - madwar 1,6 ms. It-tul tat-tranżazzjoni huwa bħala medja inqas minn 40 ms, il-kommit jitlesta f'2 ms, it-tul tal-qari u l-kitba huwa bħala medja ta '2 ms. 99 perċentil - 3-3,1 ms biss, in-numru ta 'timeouts naqas b'100 darba - kollha minħabba l-użu mifrux ta' spekulazzjoni.

Sa issa, il-biċċa l-kbira tan-nodi SQL Server ġew dekummissjonati; prodotti ġodda qed jiġu żviluppati biss bl-użu ta 'C*One. Adattajna C*One biex jaħdem fil-cloud tagħna sħaba waħda, li għamilha possibbli li titħaffef l-iskjerament ta 'clusters ġodda, is-simplifikazzjoni tal-konfigurazzjoni u l-awtomatizzazzjoni tal-operat. Mingħajr il-kodiċi tas-sors, li tagħmel dan ikun ħafna aktar diffiċli u ingombranti.

Issa qed naħdmu fuq it-trasferiment tal-faċilitajiet tal-ħażna l-oħra tagħna fis-sħab - iżda din hija storja kompletament differenti.

Sors: www.habr.com

Żid kumment