NewSQL = NoSQL + ACID

NewSQL = NoSQL + ACID
Jiska dènyèman, Odnoklassniki estoke apeprè 50 TB nan done trete an tan reyèl nan SQL sèvè. Pou yon volim konsa, li prèske enposib pou bay aksè rapid ak fyab, e menm sant done ki toleran echèk lè l sèvi avèk yon DBMS SQL. Tipikman, nan ka sa yo, youn nan depo NoSQL yo itilize, men se pa tout bagay ka transfere nan NoSQL: kèk antite mande pou garanti tranzaksyon ACID.

Sa a te mennen nou nan itilize nan depo NewSQL, se sa ki, yon DBMS ki bay tolerans fay, évolutivité ak pèfòmans nan sistèm NoSQL, men an menm tan an kenbe garanti yo ACID abitye nan sistèm klasik yo. Gen kèk sistèm endistriyèl k ap travay nan nouvo klas sa a, kidonk nou te aplike yon sistèm sa a tèt nou epi nou mete l nan operasyon komèsyal yo.

Ki jan li fonksyone ak sa ki te pase - li anba koupe a.

Jodi a, odyans lan chak mwa nan Odnoklassniki se plis pase 70 milyon vizitè inik. Nou Nou nan senk an tèt yo pi gwo rezo sosyal nan mond lan, ak nan mitan ven sit kote itilizatè yo pase plis tan. Enfrastrikti OK la okipe chaj trè wo: plis pase yon milyon demann HTTP/sec pou chak devan. Pati nan yon flòt sèvè ki gen plis pase 8000 moso yo sitiye tou pre youn ak lòt - nan kat sant done Moskou, ki pèmèt pou yon latansi rezo a mwens pase 1 ms ant yo.

Nou te itilize Cassandra depi 2010, kòmanse ak vèsyon 0.6. Jodi a gen plizyè douzèn grap nan operasyon. Gwoup ki pi rapid la trete plis pase 4 milyon operasyon pa segonn, epi pi gwo magazen an 260 TB.

Sepandan, sa yo se tout grap NoSQL òdinè yo itilize pou depo fèb kowòdone done. Nou te vle ranplase depo prensipal ki konsistan, Microsoft SQL Server, ki te itilize depi fondasyon Odnoklassniki. Depo a konsiste de plis pase 300 machin SQL Server Standard Edition, ki gen 50 TB done - antite biznis. Done sa yo modifye kòm yon pati nan tranzaksyon ACID epi yo mande yo segondè konsistans.

Pou distribye done atravè nœuds sèvè SQL, nou itilize tou de vètikal ak orizontal partitionnement (sharding). Istorikman, nou te itilize yon senp done sharding konplo: chak antite te asosye ak yon siy - yon fonksyon nan ID antite a. Yo te mete antite ki gen menm siy la sou menm sèvè SQL la. Relasyon mèt-detay yo te aplike pou jeton dosye prensipal yo ak dosye timoun yo toujou matche epi yo te chita sou menm sèvè a. Nan yon rezo sosyal, prèske tout dosye yo pwodwi sou non itilizatè a, ki vle di ke tout done itilizatè ki nan yon sèl subsistèm fonksyonèl yo estoke sou yon sèl sèvè. Sa vle di, yon tranzaksyon biznis prèske toujou enplike tab ki soti nan yon sèl sèvè SQL, ki te fè li posib asire konsistans done lè l sèvi avèk tranzaksyon ACID lokal yo, san yo pa bezwen itilize. ralanti ak enfidèl distribiye tranzaksyon ACID.

Mèsi a sharding ak akselere SQL:

  • Nou pa sèvi ak kontrent kle etranje, depi lè sharding ID antite a ka lokalize sou yon lòt sèvè.
  • Nou pa sèvi ak pwosedi ki estoke ak deklanche akòz chaj adisyonèl sou CPU DBMS la.
  • Nou pa sèvi ak JOIN paske nan tout sa ki anwo yo ak anpil lekti o aza nan disk.
  • Andeyò yon tranzaksyon, nou itilize nivo izolasyon Read Uncommitted pou redwi enpas.
  • Nou fè sèlman tranzaksyon kout (an mwayèn pi kout pase 100 ms).
  • Nou pa sèvi ak plizyè ranje UPDATE ak DELETE akòz gwo kantite enpas - nou mete ajou sèlman yon dosye alafwa.
  • Nou toujou fè demann sèlman sou endèks - yon rechèch ak yon plan eskanè tab konplè pou nou vle di twòp baz done a ak sa ki lakòz li echwe.

Etap sa yo pèmèt nou peze pèfòmans prèske maksimòm soti nan serveurs SQL. Sepandan, pwoblèm yo te vin pi plis ak plis anpil. Ann gade yo.

Pwoblèm ak SQL

  • Piske nou te itilize sharding oto-ekri, ajoute nouvo sharding te fè lamen pa administratè yo. Pandan tout tan sa a, kopi done évolutive yo pa t ap fè demann sèvis yo.
  • Kòm kantite dosye nan tablo a ap grandi, vitès la nan ensèsyon ak modifikasyon diminye lè yo ajoute endèks nan yon tab ki egziste deja, vitès la desann nan yon faktè kreyasyon ak re-kreyasyon nan endèks;
  • Èske w gen yon ti kantite Windows pou SQL sèvè nan pwodiksyon fè jesyon enfrastrikti difisil

Men, pwoblèm prensipal la se

tolerans fòt

Sèvè SQL klasik la gen pòv tolerans fay. Ann di ou gen yon sèl sèvè baz done, epi li echwe yon fwa chak twazan. Pandan tan sa a sit la desann pou 20 minit, sa ki akseptab. Si ou gen 64 serveurs, lè sa a sit la desann yon fwa chak twa semèn. Men, si ou gen 200 serveurs, Lè sa a, sit la pa travay chak semèn. Sa a se pwoblèm.

Kisa ki ka fè pou amelyore tolerans fòt yon sèvè SQL? Wikipedya envite nou bati grap trè disponib: kote nan ka ta gen echèk nan nenpòt nan eleman yo gen yon sèl backup.

Sa a mande pou yon flòt nan ekipman chè: repetisyon anpil, fib optik, depo pataje, ak enklizyon an nan yon rezèv pa travay fyab: apeprè 10% nan switching fini ak echèk la nan ne backup la tankou yon tren dèyè ne prensipal la.

Men, dezavantaj prensipal la nan tankou yon gwoup trè disponib se zewo disponiblite si sant done kote li ye a echwe. Odnoklassniki gen kat sant done, epi nou bezwen asire operasyon an nan evènman an nan yon echèk konplè nan youn nan yo.

Pou sa nou te kapab itilize Multi-Mèt replikasyon bati nan SQL sèvè. Solisyon sa a pi chè akòz pri a nan lojisyèl epi li soufri de pwoblèm byen li te ye ak replikasyon - reta tranzaksyon enprevizib ak replikasyon synchrone ak reta nan aplike replikasyon (e, kòm yon rezilta, modifikasyon pèdi) ak replikasyon asynchrone. Enplik la rezolisyon manyèl konfli fè opsyon sa a konplètman inaplikab pou nou.

Tout pwoblèm sa yo te mande yon solisyon radikal, e nou te kòmanse analize yo an detay. Isit la nou bezwen fè konesans ak sa SQL sèvè sitou fè - tranzaksyon yo.

Tranzaksyon senp

Ann konsidere tranzaksyon ki pi senp la, nan pwen de vi yon pwogramè SQL aplike: ajoute yon foto nan yon album. Albòm ak foto yo estoke nan plak diferan. Album nan gen yon kontwa foto piblik. Lè sa a, yon tranzaksyon sa yo divize an etap sa yo:

  1. Nou fèmen album lan pa kle.
  2. Kreye yon antre nan tablo foto a.
  3. Si foto a gen yon estati piblik, Lè sa a, ajoute yon kontwa foto piblik nan album lan, mete ajou dosye a epi komèt tranzaksyon an.

Oswa nan pseudocode:

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

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

TX.commit();

Nou wè ke senaryo tranzaksyon biznis ki pi komen se li done ki sòti nan baz done a nan memwa a nan sèvè aplikasyon an, chanje yon bagay epi sove nouvo valè yo tounen nan baz done a. Anjeneral nan yon tranzaksyon konsa nou mete ajou plizyè antite, plizyè tab.

Lè egzekite yon tranzaksyon, modifikasyon konkouran nan menm done ki soti nan yon lòt sistèm ka rive. Pou egzanp, Antispam ka deside ke itilizatè a se yon jan kanmenm sispèk ak Se poutèt sa tout foto itilizatè a pa ta dwe piblik ankò, yo bezwen voye yo pou modération, ki vle di chanje foto.status nan kèk lòt valè ak fèmen kontwa ki koresponn yo. Li evidan, si operasyon sa a fèt san garanti atomite aplikasyon ak izolasyon modifikasyon konpetisyon, tankou nan ASID, Lè sa a, rezilta a pa pral sa ki nesesè - swa kontwa foto a pral montre valè a mal, oswa se pa tout foto yo pral voye pou modération.

Yon anpil nan kòd ki sanble, manipile divès antite biznis nan yon sèl tranzaksyon, te ekri nan tout egzistans la nan Odnoklassniki. Ki baze sou eksperyans nan migrasyon nan NoSQL soti nan Konsistans evantyèlman Nou konnen ke pi gwo defi a (ak envestisman tan) soti nan devlope kòd pou kenbe konsistans done yo. Se poutèt sa, nou konsidere egzijans prensipal la pou nouvo depo a dwe pwovizyon pou tranzaksyon reyèl ACID pou lojik aplikasyon an.

Lòt, pa mwens enpòtan, kondisyon yo te:

  • Si sant done a echwe, tou de lekti ak ekri nan nouvo depo a dwe disponib.
  • Kenbe vitès devlopman aktyèl la. Sa vle di, lè w ap travay ak yon nouvo depo, kantite kòd yo ta dwe apeprè menm, pa ta dwe gen okenn bezwen ajoute anyen nan depo a, devlope algoritm pou rezoud konfli, kenbe endis segondè, elatriye.
  • Vitès nouvo depo a te dwe byen wo, tou de lè lekti done yo ak lè trete tranzaksyon yo, sa ki te efektivman vle di ke solisyon akademik solid, inivèsèl, men dousman, tankou, pou egzanp, pa t aplikab. de-faz komèt.
  • Otomatik dekale sou vole.
  • Sèvi ak sèvè regilye bon mache, san yo pa bezwen achte pyès ki nan konpitè ekzotik.
  • Posiblite devlopman depo pa devlopè konpayi yo. Nan lòt mo, priyorite yo te bay solisyon propriétaires oswa sous louvri, de preferans nan Java.

Desizyon, desizyon

Analize solisyon posib, nou rive nan de chwa achitekti posib:

Premye a se pran nenpòt sèvè SQL epi aplike tolerans fay ki nesesè yo, mekanis dekale, gwoup failover, rezolisyon konfli ak distribiye, serye ak rapid tranzaksyon ACID. Nou te evalye opsyon sa a kòm trè ki pa trivial ak travay entansif.

Dezyèm opsyon a se pran yon depo NoSQL pare ak dekale aplike, yon gwoup failover, rezolisyon konfli, epi aplike tranzaksyon ak SQL tèt ou. Nan premye gade, menm travay la nan aplikasyon SQL, san nou pa mansyone tranzaksyon ACID, sanble yon travay ki pral pran plizyè ane. Men, Lè sa a, nou reyalize ke seri a karakteristik SQL nou itilize nan pratik se osi lwen ANSI SQL kòm Cassandra CQL lwen ANSI SQL. Lè nou pran yon gade pi pre nan CQL, nou reyalize ke li te byen pre sa nou te bezwen.

Cassandra ak CQL

Se konsa, ki sa ki enteresan sou Cassandra, ki kapasite li genyen?

Premyèman, isit la ou ka kreye tab ki sipòte divès kalite done ou ka fè SELECT oswa UPDATE sou kle prensipal la.

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

Pou asire konsistans done kopi, Cassandra itilize apwòch kowòm. Nan ka ki pi senp la, sa vle di ke lè twa kopi menm ranje yo mete sou diferan nœuds nan gwoup la, ekri a konsidere kòm siksè si majorite nœuds (ki vle di, de sou twa) konfime siksè operasyon ekriti sa a. . Done ranje yo konsidere kòm konsistan si, lè lekti, majorite nœuds yo te vote epi konfime yo. Kidonk, ak twa kopi, konsistans done konplè ak enstantane garanti si yon sèl ne echwe. Apwòch sa a te pèmèt nou aplike yon konplo menm plis serye: toujou voye demann bay tout twa kopi, ap tann yon repons nan men de sa yo ki pi rapid. Se repons an reta nan twazyèm kopi a jete nan ka sa a. Yon ne ki an reta nan reponn ka gen pwoblèm grav - fren, koleksyon fatra nan JVM la, rekiperasyon memwa dirèk nan nwayo Linux la, echèk pyès ki nan konpitè, dekoneksyon nan rezo a. Sepandan, sa a pa afekte operasyon kliyan an oswa done nan okenn fason.

Apwòch la lè nou kontakte twa nœuds epi resevwa yon repons nan de yo rele espekilasyon: yo voye yon demann pou kopi siplemantè menm anvan li "tonbe".

Yon lòt benefis Cassandra se Batchlog, yon mekanis ki asire ke yon pakèt chanjman ou fè yo swa konplètman aplike oswa yo pa aplike nan tout. Sa a pèmèt nou rezoud A nan ACID - atomite soti nan bwat la.

Bagay ki pi pre tranzaksyon nan Cassandra yo se sa yo rele "tranzaksyon ki lejè". Men, yo lwen tranzaksyon "reyèl" ACID: an reyalite, sa a se yon opòtinite fè CAS sou done ki soti nan yon sèl dosye, lè l sèvi avèk konsansis lè l sèvi avèk pwotokòl la pwa lou Paxos. Se poutèt sa, vitès la nan tranzaksyon sa yo ba.

Sa nou te manke nan Cassandra

Se konsa, nou te oblije aplike reyèl tranzaksyon ACID nan Cassandra. Sèvi ak sa nou ta ka fasilman aplike de lòt karakteristik pratik nan DBMS klasik: konsistan endis rapid, ki ta pèmèt nou fè seleksyon done pa sèlman pa kle prensipal la, ak yon dèlko regilye nan monotonik oto-enkreman IDs.

Kòn

Se konsa yon nouvo DBMS te fèt Kòn, ki gen twa kalite nœuds sèvè:

  • Depo - (prèske) serveurs Cassandra estanda ki responsab pou estoke done sou disk lokal yo. Kòm chaj la ak volim nan done ap grandi, kantite yo ka fasilman echèl a dè dizèn ak dè santèn.
  • Koòdonatè tranzaksyon yo - asire ekzekisyon tranzaksyon yo.
  • Kliyan yo se sèvè aplikasyon ki aplike operasyon biznis ak kòmanse tranzaksyon yo. Kapab genyen dè milye de kliyan konsa.

NewSQL = NoSQL + ACID

Sèvè tout kalite yo fè pati yon gwoup komen, sèvi ak pwotokòl entèn mesaj Cassandra pou kominike youn ak lòt epi tripotay pou fè echanj enfòmasyon gwoup. Avèk Heartbeat, sèvè yo aprann sou echèk mityèl, kenbe yon sèl chema done - tab, estrikti yo ak replikasyon; konplo patisyon, topoloji gwoup, elatriye.

Kliyan

NewSQL = NoSQL + ACID

Olye de chofè estanda, yo itilize mòd Fat Client. Yon ne konsa pa estoke done, men li ka aji kòm yon koòdonatè ekzekisyon demann, se sa ki, Kliyan an tèt li aji kòm yon koòdonatè nan demann li yo: li mande kopi depo ak rezoud konfli. Sa a se pa sèlman pi serye ak pi vit pase chofè estanda a, ki mande pou kominikasyon ak yon koòdonatè aleka, men tou, pèmèt ou kontwole transmisyon demann yo. Deyò yon tranzaksyon ki louvri sou kliyan an, demann yo voye bay depo. Si kliyan an te louvri yon tranzaksyon, Lè sa a, tout demann ki nan tranzaksyon an yo voye bay kowòdonatè tranzaksyon an.
NewSQL = NoSQL + ACID

C*One Kowòdonatè Tranzaksyon

Koòdonatè a se yon bagay nou aplike pou C*One depi nan grafouyen. Li responsab pou jere tranzaksyon, kadna, ak lòd nan ki tranzaksyon yo aplike.

Pou chak tranzaksyon sèvis, kowòdonatè a jenere yon timestamp: chak tranzaksyon ki vin apre a pi gran pase tranzaksyon anvan an. Piske sistèm rezolisyon konfli Cassandra a baze sou timestamps (nan de dosye konfli, youn ki gen dènye timestamp la konsidere kòm aktyèl), konfli a ap toujou rezoud an favè tranzaksyon ki vin apre a. Se konsa nou aplike Lampport gade - yon fason bon mache pou rezoud konfli nan yon sistèm distribiye.

Locks

Pou asire izolasyon, nou deside sèvi ak metòd ki pi senp - kadna pesimis ki baze sou kle prensipal la nan dosye a. Nan lòt mo, nan yon tranzaksyon, yon dosye dwe premye fèmen, sèlman Lè sa a, li, modifye, ak sove. Se sèlman apre yon komèt siksè ka yon dosye dwe debloke pou ke tranzaksyon konpetisyon ka itilize li.

Aplike bloke sa a se senp nan yon anviwònman ki pa distribye. Nan yon sistèm distribiye, gen de opsyon prensipal: swa aplike bloke distribiye sou gwoup la, oswa distribye tranzaksyon pou ke tranzaksyon ki enplike menm dosye yo toujou ap okipe pa menm kowòdonatè a.

Depi nan ka nou an done yo deja distribye nan mitan gwoup tranzaksyon lokal yo nan SQL, li te deside bay kowòdonatè gwoup tranzaksyon lokal yo: yon sèl kowòdonatè fè tout tranzaksyon ak marqueur soti nan 0 a 9, dezyèm lan - ak marqueur soti nan 10 a 19, ak sou sa. Kòm yon rezilta, chak nan ka kowòdonatè yo vin mèt gwoup tranzaksyon an.

Lè sa a, kadna ka aplike nan fòm lan nan yon HashMap ordinèr nan memwa kowòdonatè a.

Echèk koòdonatè

Depi yon sèl koòdonatè sèvi sèlman yon gwoup tranzaksyon, li trè enpòtan pou detèmine byen vit reyalite a nan echèk li yo pou ke dezyèm tantativ pou egzekite tranzaksyon an ap tan. Pou rann sa a rapid ak fyab, nou te itilize yon pwotokòl kowòm ki byen konekte:

Chak sant done gen pou pi piti de nœuds koòdonatè. Tanzantan, chak koòdonatè voye yon mesaj batman kè bay lòt koòdonatè yo epi enfòme yo sou fonksyone li yo, ansanm ak ki mesaj batman kè li te resevwa nan men ki koòdonatè nan gwoup la dènye fwa.

NewSQL = NoSQL + ACID

Lè yo resevwa enfòmasyon ki sanble nan men lòt moun kòm yon pati nan mesaj batman kè yo, chak kowòdonatè deside poukont li ki nœud gwoup ki fonksyone ak ki pa, gide pa prensip kowòm la: si nœud X te resevwa enfòmasyon nan men majorite nœuds nan gwoup la sou nòmal la. resevwa mesaj ki soti nan ne Y, lè sa a, Y ap travay. Ak vis vèrsa, le pli vit ke majorite a rapòte mesaj ki manke soti nan ne Y, Lè sa a, Y te refize. Li se kirye ke si kowòm nan enfòme ne X ke li pa resevwa mesaj ankò nan men li, Lè sa a, ne X tèt li ap konsidere tèt li echwe.

Mesaj batman kè yo voye ak frekans segondè, apeprè 20 fwa pa segonn, ak yon peryòd de 50 ms. Nan Java, li difisil pou garanti repons aplikasyon an nan 50 ms akòz longè ki konparab nan poz ki te koze pa pèseptè a fatra. Nou te kapab reyalize tan repons sa a lè l sèvi avèk pèseptè fatra G1 la, ki pèmèt nou presize yon sib pou dire poz GC yo. Sepandan, pafwa, byen raman, pèseptè a poz depase 50 ms, sa ki ka mennen nan yon deteksyon fo fot. Pou anpeche sa rive, kowòdonatè a pa rapòte yon echèk nan yon ne aleka lè premye mesaj batman an soti nan li disparèt, sèlman si plizyè te disparèt nan yon ranje ms.

Men, li pa ase byen vit konprann ki ne ki sispann fonksyone. Nou bezwen fè yon bagay sou sa.

Rezèvasyon

Konplo a klasik enplike, nan evènman an nan yon echèk mèt, kòmanse yon nouvo eleksyon lè l sèvi avèk youn nan alamòd inivèsèl algoritm. Sepandan, algorithm sa yo gen pwoblèm byen li te ye ak dirèksyon tan ak longè nan pwosesis eleksyon an tèt li. Nou te kapab evite reta adisyonèl sa yo lè l sèvi avèk yon plan ranplasman koòdonatè nan yon rezo konplètman konekte:

NewSQL = NoSQL + ACID

Ann di nou vle egzekite yon tranzaksyon nan gwoup 50. Ann detèmine davans konplo ranplasman an, se sa ki nœuds ki pral egzekite tranzaksyon nan gwoup 50 nan evènman an nan yon echèk nan koòdonatè prensipal la. Objektif nou se kenbe fonksyonalite sistèm nan ka ta gen yon echèk sant done. Ann detèmine ke premye rezèv la pral yon ne ki soti nan yon lòt sant done, ak dezyèm rezèv la pral yon ne ki soti nan yon twazyèm. Se konplo sa a chwazi yon fwa epi li pa chanje jiskaske topoloji gwoup la chanje, se sa ki, jiskaske nouvo nœuds antre nan li (sa ki rive trè raman). Pwosedi pou chwazi yon nouvo mèt aktif si ansyen an echwe ap toujou jan sa a: premye rezèv la ap vin mèt aktif, epi si li sispann fonksyone, dezyèm rezèv la ap vin mèt aktif la.

Konplo sa a pi serye pase algorithm inivèsèl la, depi pou aktive yon nouvo mèt li ase pou detèmine echèk ansyen an.

Men, ki jan kliyan yo pral konprann ki mèt ap travay kounye a? Li enposib voye enfòmasyon bay dè milye de kliyan nan 50 ms. Yon sitiyasyon posib lè yon kliyan voye yon demann pou louvri yon tranzaksyon, li poko konnen ke mèt sa a pa fonksyone ankò, epi demann lan pral tan. Pou anpeche sa rive, kliyan spéculatif voye yon demann pou louvri yon tranzaksyon bay mèt gwoup la ak tou de rezèv li yo alafwa, men se sèlman youn ki se mèt aktif la nan moman an ap reponn demann sa a. Kliyan an pral fè tout kominikasyon ki vin apre nan tranzaksyon an sèlman ak mèt aktif la.

Mèt sovgad mete demann resevwa pou tranzaksyon ki pa yo nan keu tranzaksyon ki poko fèt, kote yo estoke pou kèk tan. Si mèt aktif la mouri, nouvo mèt la trete demann pou louvri tranzaksyon nan keu li yo epi li reponn kliyan an. Si kliyan an te deja louvri yon tranzaksyon ak ansyen mèt la, Lè sa a, dezyèm repons lan inyore (e, evidamman, tankou yon tranzaksyon pa pral fini epi yo pral repete pa kliyan an).

Ki jan tranzaksyon an ap travay

Ann di yon kliyan voye yon demann bay kowòdonatè a pou ouvè yon tranzaksyon pou tèl ak tèl antite ak tèl ak tèl yon kle prensipal. Koòdonatè a fèmen antite sa a epi li mete l nan tab fèmen an nan memwa. Si sa nesesè, kowòdonatè a li antite sa a nan depo epi estoke done ki kapab lakòz yo nan yon eta tranzaksyon nan memwa kowòdonatè a.

NewSQL = NoSQL + ACID

Lè yon kliyan vle chanje done nan yon tranzaksyon, li voye yon demann bay koòdonatè a pou modifye antite a, epi kowòdonatè a mete nouvo done yo nan tablo estati tranzaksyon an nan memwa. Sa a konplete anrejistreman an - pa gen okenn anrejistreman fèt nan depo a.

NewSQL = NoSQL + ACID

Lè yon kliyan mande pwòp done li chanje kòm yon pati nan yon tranzaksyon aktif, kowòdonatè a aji jan sa a:

  • si ID a deja nan tranzaksyon an, Lè sa a, done yo pran nan memwa;
  • si pa gen okenn ID nan memwa, Lè sa a, done ki manke yo li nan nœuds yo depo, konbine avèk sa yo ki deja nan memwa, epi rezilta a bay kliyan an.

Kidonk, kliyan an ka li chanjman pwòp li yo, men lòt kliyan pa wè chanjman sa yo, paske yo estoke sèlman nan memwa a nan kowòdonatè a yo poko nan nœuds Cassandra;

NewSQL = NoSQL + ACID

Lè kliyan an voye komèt, kowòdonatè a sove eta ki te nan memwa sèvis la nan yon pakèt ki konekte, epi li voye kòm yon pakèt ki konekte nan depo Cassandra. Magazen yo fè tout sa ki nesesè pou asire ke pake sa a se atomikman (konplètman) aplike, epi retounen yon repons bay kowòdonatè a, ki moun ki degaje kadna yo ak konfime siksè nan tranzaksyon an bay kliyan an.

NewSQL = NoSQL + ACID

Ak rollback, koòdonatè a sèlman bezwen libere memwa ki okipe pa eta a tranzaksyon an.

Kòm rezilta amelyorasyon ki anwo yo, nou aplike prensip ACID yo:

  • Atomisite. Sa a se yon garanti ke okenn tranzaksyon yo pral pasyèlman anrejistre nan sistèm nan swa tout nan suboperasyon li yo pral ranpli, oswa youn pa pral ranpli. Nou respekte prensip sa a atravè pakèt konekte nan Cassandra.
  • Konsistans. Chak tranzaksyon siksè, pa definisyon, anrejistre sèlman rezilta valab. Si, apre yo fin louvri yon tranzaksyon ak fè yon pati nan operasyon yo, yo dekouvri ke rezilta a pa valab, yo fè yon rollback.
  • An karantèn. Lè yon tranzaksyon egzekite, tranzaksyon konkouran pa ta dwe afekte rezilta li yo. Tranzaksyon konpetisyon yo izole lè l sèvi avèk kadna pesimis sou koòdonatè a. Pou lekti deyò yon tranzaksyon, prensip izolasyon an obsève nan nivo Read Committed.
  • Sustainability. Kèlkeswa pwoblèm nan nivo ki pi ba yo—pandan sistèm, echèk pyès ki nan konpitè—chanjman yon tranzaksyon ki konplete avèk siksè ta dwe rete konsève lè operasyon yo rekòmanse.

Lekti pa endèks

Ann pran yon tablo senp:

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

Li gen yon ID (kle prensipal), pwopriyetè ak dat modifikasyon. Ou bezwen fè yon demann trè senp - chwazi done sou mèt kay la ak dat chanjman "pou dènye jou a".

SELECT *
WHERE owner=?
AND modified>?

Nan lòd pou yon rechèch sa yo dwe trete byen vit, nan yon DBMS SQL klasik ou bezwen bati yon endèks pa kolòn (pwopriyetè, modifye). Nou ka fè sa byen fasil, depi kounye a nou gen garanti ACID!

Endèks nan C*One

Gen yon tablo sous ak foto kote ID dosye a se kle prensipal la.

NewSQL = NoSQL + ACID

Pou yon endèks, C*One kreye yon nouvo tab ki se yon kopi orijinal la. Kle a se menm jan ak ekspresyon endèks la, epi li gen ladan tou kle prensipal dosye a nan tablo sous la:

NewSQL = NoSQL + ACID

Koulye a, rechèch la pou "pwopriyetè pou dènye jou a" ka reekri kòm yon seleksyon nan yon lòt tab:

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

Koòdonatè a kenbe konsistans done yo nan foto tab sous yo ak tablo endèks i1 la. Dapre chema done a sèlman, lè yo resevwa yon chanjman, kowòdonatè a jenere ak estoke yon chanjman pa sèlman nan tablo prensipal la, men tou nan kopi. Pa gen okenn aksyon adisyonèl fèt sou tab endèks la, mòso bwa yo pa li, epi pa gen okenn kadna yo itilize. Sa vle di, ajoute endèks konsome prèske pa gen okenn resous ak nòmalman pa gen okenn efè sou vitès la nan aplike modifikasyon.

Sèvi ak ACID, nou te kapab aplike endis SQL ki tankou. Yo cohérente, évolutive, rapide, composable, ak konstwi nan lang requête CQL. Pa gen okenn chanjman nan kòd aplikasyon yo oblije sipòte endèks. Tout bagay se senp tankou nan SQL. Ak pi enpòtan, endèks pa afekte vitès ekzekisyon modifikasyon nan tablo tranzaksyon orijinal la.

Sak pase

Nou devlope C*One twa ane de sa e nou te lanse li nan operasyon komèsyal.

Kisa nou te jwenn nan fen a? Ann evalye sa a lè l sèvi avèk egzanp tretman foto ak sistèm depo, youn nan kalite done ki pi enpòtan nan yon rezo sosyal. Nou pa pale sou kò yo nan foto yo tèt yo, men sou tout kalite meta-enfòmasyon. Koulye a, Odnoklassniki gen apeprè 20 milya dosye sa yo, sistèm nan trete 80 mil demann pou chak segonn, jiska 8 mil tranzaksyon ACID pou chak segonn ki asosye ak modifikasyon done.

Lè nou te itilize SQL ak faktè replikasyon = 1 (men nan ATAK 10), metaenfòmasyon foto yo te estoke sou yon grap trè disponib nan 32 machin ki kouri Microsoft SQL sèvè (plis 11 sovgad). 10 serveurs yo te tou atribye ba pou estoke sovgad. Yon total de 50 machin chè. An menm tan an, sistèm lan te opere nan chaj rated, san rezèv.

Apre migrasyon nan nouvo sistèm nan, nou te resevwa faktè replikasyon = 3 - yon kopi nan chak sant done. Sistèm nan konsiste de 63 nœuds depo Cassandra ak 6 machin koòdonatè, pou yon total de 69 sèvè. Men, machin sa yo pi bon mache, pri total yo se apeprè 30% nan pri a nan yon sistèm SQL. An menm tan an, chaj la kenbe nan 30%.

Avèk entwodiksyon C*One, latansi tou diminye: nan SQL, yon operasyon ekri te pran apeprè 4,5 ms. Nan C*One - apeprè 1,6 ms. Dire tranzaksyon an se an mwayèn mwens pase 40 ms, komèt la fini nan 2 ms, dire a li ak ekri se an mwayèn 2 ms. 99yèm percentile - sèlman 3-3,1 ms, kantite timeout te diminye pa 100 fwa - tout akòz itilizasyon an toupatou nan espekilasyon.

Depi kounye a, pi fò nan nœuds sèvè SQL yo te dekomisyone nouvo pwodwi yo ap devlope sèlman lè l sèvi avèk C*One. Nou adapte C*One pou travay nan nwaj nou an yon sèl-nwaj, ki te fè li posib akselere deplwaman nouvo grap, senplifye konfigirasyon ak otomatize operasyon. San kòd sous la, fè sa a ta pi difisil ak ankonbran.

Koulye a, nou ap travay sou transfere lòt enstalasyon depo nou yo nan nwaj la - men sa se yon istwa konplètman diferan.

Sous: www.habr.com

Add nouvo kòmantè