NewSQL = NoSQL+ACID

NewSQL = NoSQL+ACID
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 Mir sinn an den Top fënnef 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 schwaach koordinéiert 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 héich Konsequenz.

Fir Daten iwwer SQL Server Noden ze verdeelen, hu mir souwuel vertikal wéi horizontal benotzt opzedeelen (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 lues an onzouverlÀsseg 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 hĂ©ich verfĂŒgbare Cluster: 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 Multi-Master 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 manuell Konfliktléisung 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:

  1. Mir spÀren den Album mam Schlëssel.
  2. Schafen eng Entrée an der Foto Dësch.
  3. 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 sauerem, 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 Eventuell Konsistenz 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. zwee-Phase engagĂ©iert.
  • 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 Cassandra CQL 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 Quorum Approche. 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 Spekulatiounen: 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 "liicht Transaktiounen". Awer si si wÀit vun "echte" ACID Transaktiounen: TatsÀchlech ass dëst eng Geleeënheet ze maachen CAS 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.

NewSQL = NoSQL+ACID

Serveren vun all Typ sinn Deel vun engem gemeinsame Cluster, benotzen den internen Cassandra Message Protokoll fir mateneen ze kommunizéieren an Klatsch 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

NewSQL = NoSQL+ACID

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.
NewSQL = NoSQL+ACID

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 Lamport Uhr - 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.

NewSQL = NoSQL+ACID

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 moudesch universal 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:

NewSQL = NoSQL+ACID

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.

NewSQL = NoSQL+ACID

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.

NewSQL = NoSQL+ACID

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.

NewSQL = NoSQL+ACID

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.

NewSQL = NoSQL+ACID

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.

NewSQL = NoSQL+ACID

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:

NewSQL = NoSQL+ACID

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 eent-Wollek, 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

Setzt e Commentaire