
Bis viru kuerzem huet Odnoklassniki ongeféier 50 TB vun Daten gespÀichert, déi an EchtzÀit am SQL Server veraarbecht ginn. Fir sou e Volume ass et bal onméiglech fir séier an zouverlÀsseg, a souguer Datenzenter Feeler-tolerant Zougang mat engem SQL DBMS ze bidden. Typesch, an esou FÀll gëtt ee vun den NoSQL-SpÀichere benotzt, awer net alles kann op NoSQL transferéiert ginn: e puer Entitéite verlaangen ACID Transaktiounsgarantien.
Dëst huet eis zum Gebrauch vun NewSQL-Speicher gefouert, dat heescht e DBMS, deen Fehltoleranz, Skalierbarkeet a Leeschtung vun NoSQL Systemer ubitt, awer glÀichzÀiteg d'ACID Garantien erhalen, déi mat klassesche Systemer vertraut sinn. Et gi wéineg industriell Systemer vun dëser neier Klass, also hu mir esou e System selwer ëmgesat an a kommerziell Operatioun gesat.
Wéi et funktionnéiert a wat geschitt ass - liest ënnert dem Schnëtt.
Haut ass de monatlecht Publikum vun Odnoklassniki méi wéi 70 Milliounen eenzegaarteg Visiteuren. Mir gréisste sozialen Netzwierker op der Welt, an ënnert den zwanzeg Siten op déi Benotzer déi meescht ZÀit verbréngen. D'OK Infrastruktur handhabt ganz héich Lasten: méi wéi eng Millioun HTTP-Ufroen / sec pro Front. Deeler vun enger Serverflott vu méi wéi 8000 Stécker sinn no beieneen lokaliséiert - a véier Moskauer Datenzenteren, wat et méiglech mécht eng Netzlatenz vu manner wéi 1 ms tëscht hinnen ze garantéieren.
Mir hunn Cassandra zënter 2010 benotzt, ugefaange mat der Versioun 0.6. Haut ginn et e puer Dosen Cluster a Betrib. De schnellsten Cluster veraarbecht méi wéi 4 Milliounen Operatiounen pro Sekonn, an de gréisste spÀichert 260 TB.
Wéi och ëmmer, dëst sinn all gewéinlech NoSQL Cluster déi fir d'SpÀichere benotzt ginn daten. Mir wollten d'Haaptkonsequent SpÀichere ersetzen, Microsoft SQL Server, deen zënter der Grënnung vun Odnoklassniki benotzt gouf. D'SpÀichere besteet aus méi wéi 300 SQL Server Standard Edition Maschinnen, déi 50 TB vun Daten enthalen hunn - GeschÀftsentitéiten. Dës Donnéeë ginn als Deel vun ACID Transaktiounen geÀnnert an erfuerderlech .
Fir Daten iwwer SQL Server Noden ze verdeelen, hu mir souwuel vertikal wéi horizontal benotzt (schnitt). Historesch hu mir en einfachen Dateschutzschema benotzt: all Entitéit gouf mat engem Token verbonnen - eng Funktioun vun der Entity ID. Entitéite mat deemselwechten Token goufen um selwechte SQL Server gesat. D'Meeschtesch-Detail Bezéiung gouf ëmgesat sou datt d'Tokens vun den Haapt- a Kannerrecords ëmmer matenee passen an um selwechte Server sinn. An engem sozialen Netzwierk gi bal all Rekorder am Numm vum Benotzer generéiert - dat heescht datt all Benotzerdaten an engem funktionnellen Subsystem op engem Server gespÀichert sinn. Dat ass, eng GeschÀftstransaktioun huet bal ëmmer Tabelle vun engem SQL Server involvéiert, wat et méiglech gemaach huet Datenkonsistenz mat lokalen ACID Transaktiounen ze garantéieren, ouni d'Notzung ze benotzen verdeelt ACID Transaktiounen.
Dank Sharding a fir SQL ze beschleunegen:
- Mir benotzen keng AuslÀnnerschlësselbeschrÀnkungen, well beim Sharing kann d'Entity ID op engem anere Server lokaliséiert sinn.
- Mir benotzen net gespÀichert Prozeduren an Ausléiser wéinst der zousÀtzlech Belaaschtung op der DBMS CPU.
- Mir benotzen net JOINs wéinst all vun der uewen a vill zoufÀlleg liesen aus Scheif.
- Ausserhalb vun enger Transaktioun benotze mir de Read Uncommitted Isolatiounsniveau fir Deadlocks ze reduzéieren.
- Mir maachen nëmme kuerz Transaktiounen (am Duerchschnëtt méi kuerz wéi 100 ms).
- Mir benotzen net Multi-Zeil UPDATE an DELETE wéinst der grousser Zuel vun Deadlocks - mir aktualiséieren nëmmen ee Rekord glÀichzÀiteg.
- Mir maachen ëmmer Ufroen nëmmen op Indexen - eng Ufro mat engem komplette Tabellescannplang fir eis heescht d'Datebank iwwerlaascht a verursaache se ze versoen.
Dës Schrëtt hunn eis erlaabt bal maximal Leeschtung aus SQL Serveren ze pressen. Allerdéngs goufen d'Problemer ëmmer méi vill. Loosst eis se kucken.
Problemer mat SQL
- ZĂ«nter datt mir selbstgeschriwwene SchnĂ«tt benotzt hunn, gouf nei SchnĂ«tt bĂ€igefĂŒĂŒgt manuell vun Administrateuren gemaach. All dĂ«s ZĂ€it, skalierbar Daterepliken waren net servĂ©iert Ufroen.
- WĂ©i d'Zuel vun den Opzeechnungen an der Tabell wiisst, fĂ€llt d'Geschwindegkeet vun der Insertioun an der Modifikatioun erof wann d'Indexen op eng existĂ©ierend Tabelle bĂ€igefĂŒĂŒgt ginn, fĂ€llt d'Geschwindegkeet duerch e Faktor Schafung an Neischafung vun Indexen op;
- Eng kleng Quantitéit vu Windows fir SQL Server an der Produktioun ze hunn mécht d'Infrastrukturmanagement schwéier
Awer den Haaptproblem ass
Feeler Toleranz
De klassesche SQL Server huet schlecht Feeler Toleranz. Loosst eis soen datt Dir nëmmen een Datebankserver hutt, an et fÀllt eemol all drÀi Joer. WÀrend dëser ZÀit ass de Site fir 20 Minutten erof, wat akzeptabel ass. Wann Dir 64 Server hutt, ass de Site eemol all drÀi Wochen erof. A wann Dir 200 Serveren hutt, da funktionnéiert de Site net all Woch. Dëst ass Problem.
Wat kann gemaach ginn fir d'Fehlertoleranz vun engem SQL Server ze verbesseren? Wikipedia invitéiert eis ze bauen : wou am Fall vun Echec vun engem vun de Komponente gëtt et eng Backupsatellit.
DĂ«st erfuerdert eng Flott vun deieren AusrĂŒstung: vill Duplikatioune, optesch Faser, gemeinsame SpĂ€icheren, an d'Inklusioun vun enger Reserve funktionnĂ©iert net zouverlĂ€sseg: ongefĂ©ier 10% vun de Wiesselen enden mam Ausfall vum Backup-Node wĂ©i en Zuch hannert dem Haaptknuet.
Awer den Haaptnodeel vun esou engem hĂ©ich verfĂŒgbare StĂ€rekoup ass Null DisponibilitĂ©it wann den Rechenzentrum an deem et lĂ€it fĂ€llt. Odnoklassniki huet vĂ©ier Rechenzentren, a mir mussen d'Operatioun am Fall vun engem komplette Feeler an engem vun hinnen garantĂ©ieren.
Fir dëst kënne mir benotzen Replikatioun a SQL Server gebaut. Dës Léisung ass vill méi deier wéinst de KÀschte vun der Software a leid ënner bekannte Probleemer mat Replikatioun - onberechenbar Transaktiounsverzögerungen mat synchroner Replikatioun a Verspéidungen bei der Uwendung vun Replikatiounen (an, als Resultat, verluere Modifikatioune) mat asynchroner Replikatioun. Déi implizéiert mécht dës Optioun fir eis komplett inapplicabel.
All dës Problemer erfuerdert eng radikal Léisung, a mir hunn ugefaang se am Detail ze analyséieren. Hei musse mir kennen léieren wat SQL Server haaptsÀchlech mécht - Transaktiounen.
Einfach Transaktioun
Loosst eis déi einfachst Transaktioun betruechten, aus der Siicht vun engem ugewandte SQL Programméierer: eng Foto an en Album addéieren. Albumen a Fotoe ginn op verschiddene Placke gespÀichert. Den Album huet eng ëffentlech Foto counter. Dann ass sou eng Transaktioun an de folgende Schrëtt opgedeelt:
- Mir spÀren den Album mam Schlëssel.
- Schafen eng Entrée an der Foto Dësch.
- Wann d'Foto en Ă«ffentleche Status huet, fĂŒĂŒgt dann en Ă«ffentleche Fototeller an den Album un, aktualisĂ©ieren de Rekord an engagĂ©ieren d'Transaktioun.
Oder am Pseudocode:
TX.start("Albums", id);
Album album = albums.lock(id);
Photo photo = photos.create(âŠ);
if (photo.status == PUBLIC ) {
album.incPublicPhotosCount();
}
album.update();
TX.commit();Mir gesinn datt de meescht ĂŒblechen GeschĂ€ftstransaktiounsszenario ass Daten aus der Datebank an d'ErĂ«nnerung vum Applikatiounsserver ze liesen, eppes z'Ă€nneren an dĂ©i nei WĂ€erter zrĂ©ck an d'Datebank ze spĂ€icheren. Normalerweis an esou enger Transaktioun update mir verschidden EntitĂ©ite, puer DĂ«scher.
Wann Dir eng Transaktioun ausfĂ©iert, kann glĂ€ichzĂ€iteg Ănnerung vun de selwechte Daten aus engem anere System optrieden. Zum Beispill kann Antispam entscheeden datt de Benotzer iergendwĂ©i verdĂ€chteg ass an dofir sollten all d'Fotoen vum Benotzer net mĂ©i Ă«ffentlech sinn, se musse fir Moderatioun geschĂ©ckt ginn, dat heescht d'Foto Ă€nneren.Status op en anere WĂ€ert an auszeschalten dĂ©i entspriechend Teller. Natierlech, wann dĂ«s Operatioun ouni Garantien vun der AtomitĂ©it vun der Uwendung an der Isolatioun vu konkurrĂ©iere Modifikatioune geschitt, wĂ©i an , da wĂ€ert d'Resultat net sinn wat nĂ©ideg ass - entweder de FotozĂ€hler weist de falsche WĂ€ert, oder net all Fotoe ginn zur Moderatioun geschĂ©ckt.
Vill Àhnleche Coden, déi verschidde GeschÀftsentitéite bannent enger Transaktioun manipuléieren, ass uechter d'ganz Existenz vun Odnoklassniki geschriwwe ginn. Baséierend op d'Erfahrung vu Migratiounen op NoSQL aus Mir wëssen datt déi gréissten Erausfuerderung (an ZÀitinvestitioun) aus der Entwécklung vum Code kënnt fir Datenkonsistenz z'erhalen. Dofir hu mir d'Haaptfuerderung fir déi nei Lagerung als Viraussetzung fir real ACID Transaktioune fir Applikatiounslogik ugesinn.
Aner, net manner wichteg, Ufuerderunge waren:
- Wann den Rechenzentrum klappt, muss souwuel d'Liesen an d'Schreiwen op dĂ©i nei SpĂ€ichere verfĂŒgbar sinn.
- Déi aktuell Entwécklungsgeschwindegkeet erhalen. Dat ass, wann Dir mat engem neie Repository schafft, sollt de Betrag vum Code ongeféier d'selwecht sinn, et sollt kee Besoin sinn fir eppes un de Repository ze addéieren, Algorithmen z'entwéckelen fir Konflikter ze léisen, sekundÀr Indexen z'erhalen, etc.
- D'Geschwindegkeet vun der neier SpÀichere muss zimlech héich sinn, souwuel beim Liesen vun Daten wéi och beim Veraarbechtung vun Transaktiounen, wat effektiv bedeit datt akademesch rigoréis, universell, awer lues Léisungen, wéi zum Beispill, net applicabel waren. .
- Automatesch On-the-Fly Skala.
- Benotzen regelméisseg bëlleg Serveren, ouni de Besoin fir exotesch Hardware ze kafen.
- Méiglechkeet vun Stockage Entwécklung vun Firma Entwéckler. An anere Wierder, Prioritéit gouf fir propriétaire oder Open Source Léisunge kritt, am léifsten op Java.
Entscheedungen, Entscheedungen
Analyséiere méiglech Léisungen, mir koumen op zwou méiglech Architekturwahlen:
Déi éischt ass all SQL Server ze huelen an déi erfuerderlech Feeler Toleranz, Skaléierungsmechanismus, Failover Cluster, Konfliktléisung a verdeelt, zouverlÀsseg a séier ACID Transaktiounen ëmzesetzen. Mir hunn dës Optioun als ganz net-trivial an Aarbechtsintensiv bewÀert.
DĂ©i zweet Optioun ass e fĂ€erdege NoSQL-SpĂ€ichere mat implementĂ©ierter SkalĂ©ierung ze huelen, e Failover-Cluster, KonfliktlĂ©isung, an Transaktiounen a SQL selwer implementĂ©ieren. Op den Ă©ischte BlĂ©ck, souguer d'Aufgab vun der Ămsetzung vun SQL, net ACID Transaktiounen ze ernimmen, gesĂ€it aus wĂ©i eng Aufgab dĂ©i Joeren dauert. Awer dunn hu mir gemierkt datt de SQL Feature Set, dee mir an der Praxis benotzen, sou wĂ€it vun ANSI SQL ass wĂ©i wĂ€it vun ANSI SQL. Wann mir CQL nach mĂ©i no kucken, hu mir gemierkt datt et zimlech no war wat mir gebraucht hunn.
Cassandra an CQL
Also, wat ass interessant iwwer Cassandra, wéi eng FÀegkeeten huet et?
Als éischt, hei kënnt Dir Dëscher erstellen déi verschidde Datentypen ënnerstëtzen, Dir kënnt SELECT oder UPDATE op de primÀre Schlëssel maachen.
CREATE TABLE photos (id bigint KEY, owner bigint,âŠ);
SELECT * FROM photos WHERE id=?;
UPDATE photos SET ⊠WHERE id=?;Fir d'Replikdatenkonsistenz ze garantĂ©ieren, benotzt Cassandra . Am einfachsten Fall heescht dat datt wann drĂ€i Repliken vun der selwechter Zeil op verschiddene Wirbelen vum StĂ€rekoup plazĂ©iert sinn, gĂ«tt d'Schreiwe als erfollegrĂ€ich ugesinn wann d'MajoritĂ©it vun den Noden (dat ass zwee vun drĂ€i) den Erfolleg vun dĂ«ser Schreifoperatioun bestĂ€tegt. . D'Zeildaten ginn als konsequent ugesinn wann, beim Liesen, d'MajoritĂ©it vun den Noden geprĂ©ift a bestĂ€tegt goufen. Also, mat drĂ€i Repliken, ass komplett an direkt Datekonsistenz garantĂ©iert wann een Node feelt. DĂ«s Approche erlaabt eis en nach mĂ©i zouverlĂ€sseg Schema Ă«mzesetzen: schĂ©ckt Ă«mmer Ufroen un all drĂ€i Repliken, waart op eng Ăntwert vun deenen zwee schnellsten. DĂ©i spĂ©it Ăntwert vun der drĂ«tter Replica gĂ«tt an dĂ«sem Fall verworf. E Node, dee spĂ©it an der Ăntwert ass, kann sĂ©rieux Problemer hunn - Bremsen, MĂŒllsammlung am JVM, direkt ErĂ«nnerung zrĂ©ck am Linux Kernel, Hardwarefehler, Trennung vum Netz. DĂ«st beaflosst awer op kee Fall d'Operatiounen oder d'DonnĂ©eĂ« vum Client.
D'Approche wa mir drĂ€i Wirbelen kontaktĂ©ieren an eng Ăntwert vun zwee krĂ©ien, gĂ«tt genannt : eng Demande fir extra Repliken gĂ«tt geschĂ©ckt nach ier se "offĂ€llt".
En anere Virdeel vu Cassandra ass Batchlog, e Mechanismus dee garantĂ©iert datt eng Partie Ănnerungen dĂ©i Dir maacht entweder voll applizĂ©iert oder guer net applizĂ©iert ginn. DĂ«st erlaabt eis A an ACID ze lĂ©isen - AtomitĂ©it aus der KĂ«scht.
Déi nootste Saach fir Transaktiounen zu Cassandra sinn déi sougenannte "". Awer si si wÀit vun "echte" ACID Transaktiounen: TatsÀchlech ass dëst eng Geleeënheet ze maachen op Daten aus nëmmen engem Rekord, benotzt Konsens mam Schwéiergewiicht Paxos Protokoll. Dofir ass d'Geschwindegkeet vun esou Transaktiounen niddereg.
Wat mir vermësst an Cassandra
Also hu mir real ACID Transaktiounen zu Cassandra missen ëmsetzen. Mat deem kënne mir zwee aner praktesch Features vu klassesche DBMS einfach implementéieren: konsequent séier Indexen, déi eis erlaben Dateauswielen net nëmmen duerch de primÀre Schlëssel auszeféieren, an e reegelméissege Generator vu monotonen auto-incrementing IDs.
C* Eng
Sou gouf en neien DBMS gebuer C* Eng, besteet aus drÀi Zorte vu Servernoden:
- Stockage - (bal) Standard Cassandra Serveren verantwortlech fir Daten op lokalen Disken ze spÀicheren. Wéi d'Laascht an de Volume vun Daten wuessen, kann hir Quantitéit einfach op Zénger an Honnerte skaléiert ginn.
- Transaktiounskoordinatoren - garantéieren d'Ausféierung vun Transaktiounen.
- Cliente sinn Applikatiounsserver déi GeschÀftsoperatioune implementéieren an Transaktiounen initiéieren. Et kann Dausende vun esou Clienten ginn.

Serveren vun all Typ sinn Deel vun engem gemeinsame Cluster, benotzen den internen Cassandra Message Protokoll fir mateneen ze kommunizéieren an fir Clusterinformatioun auszetauschen. Mat Heartbeat, Serveren léieren iwwer géigesÀitege Feeler, erhalen en eenzegt Dateschema - Dëscher, hir Struktur a Replikatioun; Partition Schema, Cluster Topologie, etc.
Clienten

Amplaz Standard Chauffeuren gëtt Fat Client Modus benotzt. Sou en Node spÀichert keng Daten, awer kann als Koordinator fir d'Ausféierung vun der Ufro handelen, dat heescht, de Client selwer handelt als Koordinator vu sengen Ufroen: et freet SpÀicherrepliken a léist Konflikter. Dëst ass net nëmme méi zouverlÀsseg a méi séier wéi de Standard Chauffer, deen Kommunikatioun mat engem Fernkoordinator erfuerdert, awer och erlaabt Iech d'Transmissioun vun Ufroen ze kontrolléieren. Ausserhalb vun enger Transaktioun op de Client, ginn Ufroe op Repositories geschéckt. Wann de Client eng Transaktioun opgemaach huet, da ginn all Ufroe bannent der Transaktioun un den Transaktiounskoordinator geschéckt.

C * One Transaktiounskoordinator
De Koordinator ass eppes wat mir fir C*One vun Null implementéiert hunn. Et ass verantwortlech fir d'Gestioun vun Transaktiounen, SpÀren, an d'Uerdnung an dÀr Transaktiounen applizéiert ginn.
Fir all servéiert Transaktioun generéiert de Koordinator en ZÀitstempel: all spéider Transaktioun ass méi grouss wéi déi viregt Transaktioun. Zënter dem Cassandra sÀi Konfliktléisungssystem baséiert op ZÀitstempel (vun zwee konfliktende Rekorder, dee mat dem leschten ZÀitstempel gëtt als aktuell ugesinn), gëtt de Konflikt ëmmer zugonschte vun der nÀchster Transaktioun geléist. Sou hu mir ëmgesat - eng bëlleg Manéier Konflikter an engem verdeelt System ze léisen.
Schleisen
Fir Isolatioun ze garantéieren, hu mir décidéiert déi einfachst Method ze benotzen - pessimistesch Schleisen baséiert op dem primÀre Schlëssel vum Rekord. An anere Wierder, an enger Transaktioun muss e Rekord als éischt gespaart ginn, nëmmen dann gelies, geÀnnert a gespÀichert ginn. Nëmmen no engem erfollegrÀichen Engagement kann e Rekord opgehuewe ginn, sou datt konkurrenzfÀeg Transaktioune se benotze kënnen.
Ămsetzung vun esou Sperrung ass einfach an engem net-verdeelt Ămfeld. An engem verdeelt System ginn et zwou Haaptoptiounen: entweder Ă«msetzen verdeelt Sperrung op de StĂ€rekoup, oder verdeelt Transaktiounen sou datt Transaktioune mat deemselwechte Rekord Ă«mmer vum selwechte Koordinator servĂ©iert ginn.
Well an eisem Fall d'Donnéeën schonn ënner Gruppe vu lokalen Transaktiounen an SQL verdeelt sinn, gouf decidéiert lokal Transaktiounsgruppen u Koordinatoren ze ginn: ee Koordinator mécht all Transaktioune mat Tokens vun 0 bis 9, déi zweet - mat Tokens vun 10 bis 19, a sou weider. Als Resultat gëtt jidderee vun de Koordinatorinstanzen de Meeschter vun der Transaktiounsgrupp.
Da kënnen SpÀren a Form vun engem banalen HashMap an der Erënnerung vum Koordinator ëmgesat ginn.
Koordinator Feeler
Zënter engem Koordinator exklusiv eng Grupp vun Transaktiounen déngt, ass et ganz wichteg fir séier d'Tatsaach vu sengem Echec ze bestëmmen, sou datt den zweeten Versuch fir d'Transaktioun auszeféieren ass ZÀit aus. Fir dëst séier an zouverlÀsseg ze maachen, hu mir e komplett verbonne Quorum Hearbeat Protokoll benotzt:
All Datenzenter hëlt op d'mannst zwee Koordinatornoden. Periodesch schéckt all Koordinator eng HÀerzschlagmeldung un déi aner Koordinateuren an informéiert hinnen iwwer sÀi Fonctionnement, wéi och wéi eng HÀerzschlagmeldungen en vun deenen Koordinatoren am Cluster d'lescht Kéier krut.

Kritt Àhnlech Informatioun vun aneren als Deel vun hiren HÀerzschlagmeldungen, entscheet all Koordinator fir sech selwer wéi eng ClusterknÀppchen funktionnéieren a wéi eng net, guidéiert vum Quorumprinzip: wann den Node X Informatioun vun der Majoritéit vun den Wirbelen am Cluster iwwer déi normal kritt huet. Empfang vun Messagen aus Node Y, dann , Y Wierker. A vice versa, soubal d'Majoritéit mellt fehlend Messagen vum Node Y, dann huet Y refuséiert. Et ass virwëtzeg datt wann de Quorum den Node X informéiert datt et net méi Messagen dovunner kritt, da wÀert den Node X selwer sech als gescheitert betruechten.
HĂ€erzschlagmeldungen gi mat hĂ©ijer Frequenz geschĂ©ckt, ongefĂ©ier 20 Mol pro Sekonn, mat enger Period vu 50 ms. Am Java ass et schwĂ©ier d'Applikatiounsreaktioun innerhalb vun 50 ms ze garantĂ©ieren wĂ©inst der verglĂ€ichbarer LĂ€ngt vun de Pausen verursaacht vum MĂŒllsammler. Mir konnten dĂ«s ĂntwertzĂ€it mam G1 MĂŒllsammler erreechen, wat eis erlaabt en Zil fir d'Dauer vun de GC Pausen ze spezifizĂ©ieren. WĂ©i och Ă«mmer, heiansdo, zimlech selten, sinn d'Sammlerpausen mĂ©i wĂ©i 50 ms, wat zu enger falscher Fehlerkennung fĂ©ieren kann. Fir dĂ«st ze verhĂ«nneren, mellt de Koordinator net e Feeler vun engem Remote Node wann dĂ©i Ă©ischt HĂ€erzschlagmeldung dovun verschwĂ«nnt, nĂ«mmen wann e puer an enger Rei verschwonnen hunn ms.
Awer et ass net genuch fir séier ze verstoen wéi eng Node opgehalen huet ze funktionnéieren. Mir mussen eppes doriwwer maachen.
Reservatioun
Déi klassesch Schema ëmfaasst, am Fall vun engem Meeschter Echec, eng Neiwahlen mat engem vun ufÀnken algorithms. Wéi och ëmmer, esou Algorithmen hu bekannte Problemer mat der ZÀitkonvergenz an der LÀngt vum Wahlprozess selwer. Mir konnten esou zousÀtzlech Verspéidungen vermeiden mat engem Koordinator Ersatzschema an engem komplett verbonnene Netzwierk:

Loosst eis soen datt mir eng Transaktioun am Grupp ausféieren 50. Loosst eis am Viraus den Ersatzschema bestëmmen, dat heescht, wéi eng Noden Transaktiounen am Grupp 50 am Fall vun engem Echec vum Haaptkoordinator ausféieren. Eist Zil ass d'Systemfunktionalitéit am Fall vun engem Datenzenterfehler z'erhalen. Loosst eis feststellen datt déi éischt Reserve e Node vun engem aneren Rechenzentrum ass, an déi zweet Reserve wÀert e Node vun engem Drëttel sinn. Dëse Schema gëtt eemol ausgewielt an Ànnert sech net bis d'Topologie vum StÀrekoup Ànnert, dat heescht bis nei Wirbelen et erakommen (wat ganz selten geschitt). D'Prozedur fir en neien aktive Meeschter ze wielen, wann deen alen feelt, wÀert ëmmer wéi follegt sinn: déi éischt Reserve gëtt den aktive Meeschter, a wann se opgehalen huet ze funktionéieren, gëtt déi zweet Reserve den aktive Meeschter.
Dëse Schema ass méi zouverlÀsseg wéi den universellen Algorithmus, well fir en neie Meeschter ze aktivéieren ass et genuch fir den Echec vum alen ze bestëmmen.
Awer wéi verstinn d'Clienten wéi ee Meeschter elo funktionnéiert? Et ass onméiglech Informatioun un Dausende vu Clienten a 50 ms ze schécken. Eng Situatioun ass méiglech wann e Client eng Ufro schéckt fir eng Transaktioun opzemaachen, nach net wëssend datt dëse Meeschter net méi funktionnéiert, an d'Ufro gëtt ZÀit aus. Fir dëst ze verhënneren, schécken d'Clienten spekulativ eng Ufro fir eng Transaktioun un de Gruppmeeschter a béid vu senge Reserven op eemol opzemaachen, awer nëmmen deen deen am Moment den aktive Meeschter ass, wÀert op dës Ufro reagéieren. De Client wÀert all spéider Kommunikatioun bannent der Transaktioun nëmme mam aktive Meeschter maachen.
Backupsatellit Meeschter Plaz empfaangen Demanden fir Transaktiounen dĂ©i net hir sinn an der Schlaang vun ongebuerene Transaktiounen, wou se fir eng ZĂ€it gespĂ€ichert sinn. Wann den aktive Master stierft, veraarbecht den neie Master Ufroe fir Transaktiounen aus senger Schlaang opzemaachen a reagĂ©iert op de Client. Wann de Client schonn eng Transaktioun mam alen Meeschter opgemaach huet, da gĂ«tt dĂ©i zweet Ăntwert ignorĂ©iert (an, selbstverstĂ€ndlech, esou eng Transaktioun gĂ«tt net fĂ€erdeg a gĂ«tt vum Client widderholl).
Wéi d'Transaktioun Wierker
Loosst eis soen datt e Client eng Demande un de Koordinator geschéckt huet fir eng Transaktioun opzemaachen fir sou an esou eng Entitéit mat esou an esou engem primÀre Schlëssel. De Koordinator spÀren dës Entitéit a setzt se an der SpÀr Dësch an Erënnerung. Wann néideg, liest de Koordinator dës Entitéit aus der SpÀichere a spÀichert déi resultéierend Donnéeën an engem Transaktiounszoustand an der Erënnerung vum Koordinator.

Wann e Client Daten an enger Transaktioun wëllt Ànneren, schéckt en eng Ufro un de Koordinator fir d'Entitéit z'Ànneren, an de Koordinator setzt déi nei Donnéeën an der Transaktiounsstatustabell an der Erënnerung. Dëst fÀerdeg den Opnahmen - keng Opnam gëtt op d'SpÀichere gemaach.

Wann e Client seng eege geÀnnert Donnéeën als Deel vun enger aktiver Transaktioun freet, handelt de Koordinator wéi follegt:
- wann d'ID schonn an der Transaktioun ass, da ginn d'Donnéeën aus der Erënnerung geholl;
- wann et keng ID an der Erënnerung ass, da ginn déi fehlend Donnéeën aus de SpÀicherknÀppchen gelies, kombinéiert mat deenen déi schonn an der Erënnerung sinn, an d'Resultat gëtt dem Client kritt.
Sou kann de Client seng eege Ănnerunge liesen, awer aner Clienten gesinn dĂ«s Ănnerungen net, well se nĂ«mmen an der ErĂ«nnerung vum Koordinator sinn, si sinn nach net an de Cassandra-KnĂ€ppchen.

Wann de Client eng Verpflichtung schĂ©ckt, gĂ«tt de Staat, deen an der ErĂ«nnerung vum Service war, vum Koordinator an enger protokollĂ©ierter Batch gespĂ€ichert, a gĂ«tt als protokollĂ©iert Batch op d'Cassandra-SpĂ€ichere geschĂ©ckt. D'GeschĂ€fter maachen alles wat nĂ©ideg ass fir sĂ©cherzestellen datt dĂ«se Package atomesch (komplett) applizĂ©iert gĂ«tt, an eng Ăntwert op de Koordinator zrĂ©ckginn, deen d'SchlĂ€sser verĂ«ffentlecht an den Erfolleg vun der Transaktioun dem Client bestĂ€tegt.

A fir zréckzekréien, brauch de Koordinator nëmmen d'Erënnerung ze befreien, déi vum Transaktiounsstaat besat ass.
Als Resultat vun den uewe genannte Verbesserungen hu mir d'ACID Prinzipien ëmgesat:
- AtomitĂ©it. DĂ«st ass eng Garantie datt keng Transaktioun deelweis am System opgeholl gĂ«tt entweder all seng Ănneroperatiounen ofgeschloss ginn, oder keng wĂ€ert ofgeschloss ginn. Mir halen dĂ«se Prinzip duerch protokollĂ©iert Batch zu Cassandra.
- Konsistenz. All erfollegrÀich Transaktioun, per Definitioun, records nëmme valabel Resultater. Wann, no der Ouverture vun enger Transaktioun an engem Deel vun den Operatiounen, entdeckt gëtt datt d'Resultat ongëlteg ass, gëtt e Réckroll gemaach.
- Isoléierung. Wann eng Transaktioun ausgefouert gëtt, sollten glÀichzÀiteg Transaktioune sÀin Resultat net beaflossen. Konkurrenztransaktiounen sinn isoléiert mat pessimistesche SpÀren op de Koordinator. Fir Liesen ausserhalb vun enger Transaktioun gëtt den Isolatiounsprinzip um Read Committed Niveau observéiert.
- Nohaltegkeet. OnofhĂ€ngeg vu Probleemer op mĂ©i nidderegen Niveauen - Systemblackout, Hardwarefehler - Ănnerungen, dĂ©i duerch eng erfollegrĂ€ich ofgeschloss Transaktioun gemaach goufen, sollten erhale bleiwen wann d'Operatiounen erĂ«m ufĂ€nken.
Liesen duerch Indexen
Loosst eis en einfachen Dësch huelen:
CREATE TABLE photos (
id bigint primary key,
owner bigint,
modified timestamp,
âŠ)Et huet eng ID (primĂ€r SchlĂ«ssel), BesĂ«tzer an Ănnerung Datum. Dir musst eng ganz einfach Ufro maachen - wielt Daten iwwer de BesĂ«tzer mam Ănnerungsdatum "fir de leschten Dag".
SELECT *
WHERE owner=?
AND modified>?Fir datt esou eng Ufro séier veraarbecht gëtt, musst Dir an engem klassesche SQL DBMS en Index opbauen duerch Kolonnen (Besëtzer, geÀnnert). Mir kënnen dat ganz einfach maachen, well mir elo SAIER Garantie hunn!
Indizes an C * One
Et gëtt eng Quelltabel mat Fotoen an deenen d'Rekord ID de primÀre Schlëssel ass.

Fir en Index schaaft C * One en neien Dësch, deen eng Kopie vum Original ass. De Schlëssel ass d'selwecht wéi den Indexausdrock, an et enthÀlt och de primÀre Schlëssel vum Rekord aus der Quelltabel:

Elo kann d'Ufro fir "Besëtzer fir de leschten Dag" als Auswiel vun engem aneren Dësch ëmgeschriwwe ginn:
SELECT * FROM i1_test
WHERE owner=?
AND modified>?D'Konsistenz vun den DonnĂ©eĂ«n an de Quelltabelfotoen an den Indextabelle i1 gĂ«tt automatesch vum Koordinator erhale gelooss. BasĂ©ierend op den Dateschema eleng, wann eng Ănnerung kritt gĂ«tt, generĂ©iert a spĂ€ichert de Koordinator eng Ănnerung net nĂ«mmen an der Haapttabell, awer och a Kopien. Keng zousĂ€tzlech Aktiounen ginn op den Indextabelle gemaach, d'Logbicher ginn net gelies a keng SpĂ€re gi benotzt. Dat ass, Indexer derbĂ€i ze verbrauchen bal keng Ressourcen an huet praktesch keen Effekt op d'Geschwindegkeet vun der Uwendung vun Ănnerungen.
Mat ACID konnte mir SQL-Ă€hnlech Indexen implementĂ©ieren. Si si konsequent, skalierbar, sĂ©ier, komponĂ©ierbar a gebaut an d'CQL Ufro Sprooch. Keng Ănnerunge vum Applikatiounscode sinn erfuerderlech fir Indexen z'Ă«nnerstĂ«tzen. Alles ass sou einfach wĂ©i an SQL. A virun allem, Indizes beaflossen net d'AusfĂ©ierungsgeschwindegkeet vun den Ănnerunge vun der ursprĂ©nglecher Transaktiounstabell.
Wat ass geschitt
Mir hunn den C*One virun drÀi Joer entwéckelt an a kommerziell Operatioun lancéiert.
Wat hu mer um Enn kritt? Loosst eis dat evaluéieren andeems Dir d'Beispill vun der Fotoveraarbechtung a Lagerung-Subsystem benotzt, eng vun de wichtegsten Zorten vun Daten an engem sozialen Netzwierk. Mir schwÀtzen net vun de Kierper vun de Fotoen selwer, mÀ iwwer all Zorte vu Meta-Informatiounen. Elo huet Odnoklassniki ongeféier 20 Milliarden esou Opzeechnungen, de System veraarbecht 80 Tausend Liesfuerderunge pro Sekonn, bis zu 8 Tausend ACID Transaktiounen pro Sekonn verbonne mat Datemodifikatioun.
Wa mir SQL mat Replikatiounsfaktor = 1 benotzt hunn (awer am RAID 10), gouf d'Fotometainformatioun op engem hĂ©ich verfĂŒgbare Cluster vun 32 Maschinnen gespĂ€ichert, dĂ©i Microsoft SQL Server lafen (plus 11 Backups). 10 Servere goufen och zougewisen fir Backups ze spĂ€icheren. Am Ganzen 50 deier Autoen. Zur glĂ€icher zĂ€it huet de system mat nominĂ©ierte belaaschtung, ouni reserve.
Nom Migratioun op den neie System krute mir Replikatiounsfaktor = 3 - eng Kopie an all Datenzenter. De System besteet aus 63 Cassandra SpÀicherknÀppchen a 6 Koordinatormaschinnen, fir insgesamt 69 Serveren. Awer dës Maschinnen si vill méi bëlleg, hir GesamtkÀschte sinn ongeféier 30% vun de KÀschte vun engem SQL System. Zur selwechter ZÀit gëtt d'Laascht op 30% gehal.
Mat der Aféierung vum C * One ass d'Latenz och erofgaang: an SQL huet eng Schreifoperatioun ongeféier 4,5 ms gedauert. An C*One - ongeféier 1,6 ms. D'Transaktiounsdauer ass am Duerchschnëtt manner wéi 40 ms, d'Verpflichtung ass an 2 ms ofgeschloss, d'Lies- a Schreifdauer ass am Duerchschnëtt 2 ms. 99th percentile - nëmmen 3-3,1 ms, d'Zuel vun den Timeouts ass ëm 100 Mol erofgaang - alles wéinst der verbreeter Notzung vu Spekulatiounen.
Bis elo sinn déi meescht vun de SQL Server Noden ofgebaut ginn nei Produkter ginn nëmme mat C*One entwéckelt. Mir hunn C*One ugepasst fir an eiser Cloud ze schaffen , wat et méiglech gemaach huet d'Deployment vun neie Cluster ze beschleunegen, d'Konfiguratioun ze vereinfachen an d'Operatioun automatiséieren. Ouni de Quellcode wier dëst vill méi schwéier a ëmstÀndlech ze maachen.
Elo schaffen mir un eis aner SpÀicheranlagen op d'Cloud ze transferéieren - awer dat ass eng ganz aner Geschicht.
Source: will.com
