{"id":37956,"date":"2019-10-31T22:20:47","date_gmt":"2019-10-31T19:20:47","guid":{"rendered":"https:\/\/prohoster.info\/blog\/newsql-nosql-acid\/"},"modified":"2019-10-31T22:20:47","modified_gmt":"2019-10-31T19:20:47","slug":"newsql-nosql-acid","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/newsql-nosql-acid","title":{"rendered":"NewSQL = NoSQL+ACID","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/973145efa566bca10ffe7ba95733a1d5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEddig az Odnoklassnikiben k\u00f6r\u00fclbel\u00fcl 50 TB adat, amelyet val\u00f3s id\u0151ben dolgoznak fel, SQL Serverben t\u00e1rol\u00f3dott. Ilyen mennyis\u00e9g eset\u00e9n gyors \u00e9s megb\u00edzhat\u00f3, s\u0151t, m\u00e9g a meghib\u00e1sod\u00e1sokkal szemben is ellen\u00e1ll\u00f3 adatk\u00f6zpont-hozz\u00e1f\u00e9r\u00e9s biztos\u00edt\u00e1sa SQL DBMS haszn\u00e1lat\u00e1val gyakorlatilag lehetetlen. Ilyen esetekben \u00e1ltal\u00e1ban az egyik NoSQL t\u00e1rol\u00f3t haszn\u00e1lj\u00e1k, de nem mindent lehet \u00e1thelyezni NoSQL-be: egyes entit\u00e1sok ACID-tranzakci\u00f3s garanci\u00e1kat ig\u00e9nyelnek. <\/p>\n<p>Ez vezette el minket a NewSQL-t\u00e1rol\u00f3 haszn\u00e1lat\u00e1hoz, vagyis olyan DBMS-hez, amely a NoSQL rendszerek meghib\u00e1sod\u00e1s-ellen\u00e1ll\u00f3s\u00e1g\u00e1t, sk\u00e1l\u00e1zhat\u00f3s\u00e1g\u00e1t \u00e9s teljes\u00edtm\u00e9ny\u00e9t biztos\u00edtja, mik\u00f6zben meg\u0151rzi a klasszikus rendszerekben megszokott ACID garanci\u00e1kat. Az iparban m\u0171k\u00f6d\u0151 ilyen \u00faj oszt\u00e1ly\u00fa rendszerek sz\u00e1ma korl\u00e1tozott, ez\u00e9rt mi saj\u00e1t rendszert val\u00f3s\u00edtottunk meg, \u00e9s \u00fczembe helyezt\u00fck. <\/p>\n<p>Hogyan m\u0171k\u00f6dik \u00e9s mi lett az eredm\u00e9ny \u2013 ezt olvashatod a kattint\u00e1s ut\u00e1n.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nMa az 'Odnoklassniki' havi k\u00f6z\u00f6ns\u00e9ge t\u00f6bb mint 70 milli\u00f3 egyedi l\u00e1togat\u00f3t sz\u00e1ml\u00e1l. Mi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.similarweb.com\/top-websites\/category\/internet-and-telecom\/social-network\">a legnagyobb \u00f6t<\/a><\/noindex> szoci\u00e1lis h\u00e1l\u00f3zat k\u00f6z\u00e9 tartozunk a vil\u00e1gon, \u00e9s a legforgalmasabb weboldalak h\u00fasz legjobbj\u00e1nak list\u00e1j\u00e1n tal\u00e1lhat\u00f3. Az \"OK\" infrastrukt\u00fara rendk\u00edv\u00fcl magas terhel\u00e9seket dolgoz fel: t\u00f6bb mint egymilli\u00f3 HTTP-k\u00e9relmet m\u00e1sodpercenk\u00e9nt a frontokn\u00e1l. A szerverpark egy r\u00e9sze, t\u00f6bb mint 8000 g\u00e9p, k\u00f6zel helyezkedik el egym\u00e1shoz \u2013 n\u00e9gy moszkvai adatk\u00f6zpontban, ami lehet\u0151v\u00e9 teszi a h\u00e1l\u00f3zati k\u00e9sleltet\u00e9s 1 ms-n\u00e1l alacsonyabb \u00e9rt\u00e9k\u00e9nek biztos\u00edt\u00e1s\u00e1t.<\/p>\n<p>2010 \u00f3ta haszn\u00e1ljuk a Cassandr\u00e1t, kezdve a 0.6 verzi\u00f3t\u00f3l. Ma t\u00f6bb tucat klaszter van \u00fczemeltet\u00e9sben. A leggyorsabb klaszter t\u00f6bb mint 4 milli\u00f3 m\u0171veletet dolgoz fel m\u00e1sodpercenk\u00e9nt, a legnagyobb pedig 260 TB-ot t\u00e1rol. <\/p>\n<p>Mindazon\u00e1ltal mindezek tipikus NoSQL klaszterek, amelyeket az <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B2_%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D0%BE%D0%BC_%D1%81%D1%87%D1%91%D1%82%D0%B5\">gyenge konszenzus\u00fa<\/a><\/noindex> adatok t\u00e1rol\u00e1s\u00e1ra haszn\u00e1lnak. Mi pedig azt szerett\u00fck volna, ha a f\u0151 konszolid\u00e1lt t\u00e1rol\u00f3t, a Microsoft SQL Servert, amelyet az 'Odnoklassniki' alap\u00edt\u00e1sa \u00f3ta haszn\u00e1lunk, lecser\u00e9lj\u00fck. A t\u00e1rol\u00f3 t\u00f6bb mint 300 SQL Server Standard Edition g\u00e9pb\u0151l \u00e1llt, amelyekben 50 TB adat \u2013 \u00fczleti entit\u00e1sok \u2013 tal\u00e1lhat\u00f3k. Ezek az adatok ACID-tranzakci\u00f3k keret\u00e9ben m\u00f3dosulnak, \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">magas konszenzust ig\u00e9nyelnek.<\/a><\/noindex>.<\/p>\n<p>SQL Server adatainak csom\u00f3pontok k\u00f6z\u00f6tti eloszt\u00e1s\u00e1hoz mind f\u00fcgg\u0151leges, mind v\u00edzszintes <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Partition_(database)\">particion\u00e1l\u00e1st alkalmaztunk.<\/a><\/noindex> (shardol\u00e1s). T\u00f6rt\u00e9nelmileg egyszer\u0171 adatmegoszt\u00e1si s\u00e9m\u00e1t haszn\u00e1ltunk: minden entit\u00e1shoz egy token volt rendelve \u2014 az entit\u00e1s ID-j\u00e1nak f\u00fcggv\u00e9nye. Azonos tokennel rendelkez\u0151 entit\u00e1sok egy SQL-szerverre ker\u00fcltek. A master-detail t\u00edpus\u00fa kapcsolatot \u00fagy val\u00f3s\u00edtott\u00e1k meg, hogy az eredeti \u00e9s a sz\u00e1rmaztatott rekord tokenei mindig megegyeztek \u00e9s egy szerveren voltak. A k\u00f6z\u00f6ss\u00e9gi h\u00e1l\u00f3zatban szinte minden bejegyz\u00e9st a felhaszn\u00e1l\u00f3 nev\u00e9ben gener\u00e1lnak \u2014 teh\u00e1t minden felhaszn\u00e1l\u00f3i adat egy funkcion\u00e1lis alk\u00e9rd\u00e9s keretein bel\u00fcl egy szerveren t\u00e1rol\u00f3dik. Ez azt jelenti, hogy a \u00fczleti tranzakci\u00f3k sor\u00e1n szinte mindig ugyanazon SQL-szerver t\u00e1bl\u00e1i vettek r\u00e9szt, ami lehet\u0151v\u00e9 tette az adatok konzisztenci\u00e1j\u00e1nak fenntart\u00e1s\u00e1t helyi ACID-tranzakci\u00f3kon kereszt\u00fcl, an\u00e9lk\u00fcl, hogy sz\u00fcks\u00e9g lenne <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Two-phase_commit_protocol\">lass\u00fa \u00e9s megb\u00edzhatatlan<\/a><\/noindex> el\u00e1gazott ACID-tranzakci\u00f3kra.<\/p>\n<p>A shardol\u00e1snak \u00e9s az SQL teljes\u00edtm\u00e9ny\u00e9nek jav\u00edt\u00e1sa \u00e9rdek\u00e9ben:<\/p>\n<ul>\n<li>Nem haszn\u00e1lunk k\u00fcls\u0151 kulcs korl\u00e1toz\u00e1sokat, mivel a shardol\u00e1s sor\u00e1n az entit\u00e1s ID-je m\u00e1sik szerveren lehet.<\/li>\n<li>Nem haszn\u00e1lunk t\u00e1rolt elj\u00e1r\u00e1sokat \u00e9s trigger-eket a DBMS CPU-j\u00e1nak tov\u00e1bbi terhel\u00e9se miatt.<\/li>\n<li>Nem haszn\u00e1lunk JOIN-kat az el\u0151bb eml\u00edtettek \u00e9s a sok v\u00e9letlen leolvas\u00e1s miatt a lemezen.<\/li>\n<li>Tranzakci\u00f3k n\u00e9lk\u00fcl a holtpontok cs\u00f6kkent\u00e9se \u00e9rdek\u00e9ben a Read Uncommitted izol\u00e1ci\u00f3s szintet alkalmazzuk.<\/li>\n<li>Csak r\u00f6vid tranzakci\u00f3kat hajtunk v\u00e9gre (\u00e1tlagosan 100 ms-n\u00e1l r\u00f6videbb).<\/li>\n<li>Nem haszn\u00e1lunk t\u00f6bb soros UPDATE \u00e9s DELETE parancsokat a sok holtpont miatt \u2014 csak egy-egy rekordot friss\u00edt\u00fcnk.<\/li>\n<li>A lek\u00e9rdez\u00e9seket mindig csak indexeken hajtjuk v\u00e9gre \u2014 egy olyan lek\u00e9rdez\u00e9s, amely teljes t\u00e1bl\u00e1zat megtekint\u00e9si terv\u00e9vel rendelkezik, sz\u00e1munkra a DB t\u00falterhel\u00e9s\u00e9t \u00e9s le\u00e1ll\u00e1s\u00e1t jelenti.<\/li>\n<\/ul>\n<p>\nEzek a l\u00e9p\u00e9sek lehet\u0151v\u00e9 tett\u00e9k, hogy majdnem maxim\u00e1lis teljes\u00edtm\u00e9nyt nyerj\u00fcnk ki az SQL-szerverekb\u0151l. Azonban a probl\u00e9m\u00e1k egyre szaporodtak. N\u00e9zz\u00fck meg \u0151ket.<\/p>\n<h2>SQL probl\u00e9m\u00e1k<\/h2>\n<p><\/p>\n<ul>\n<li>Mivel saj\u00e1t fejleszt\u00e9s\u0171 shardol\u00e1st haszn\u00e1ltunk, \u00faj shardok manu\u00e1lis hozz\u00e1ad\u00e1s\u00e1t az adminisztr\u00e1torok v\u00e9gezt\u00e9k. Ez id\u0151 alatt a sk\u00e1l\u00e1zhat\u00f3 adatm\u00e1solatok nem szolg\u00e1lt\u00e1k ki a lek\u00e9rdez\u00e9seket. <\/li>\n<li>Ahogy n\u0151tt a rekordok sz\u00e1ma a t\u00e1bl\u00e1ban, a besz\u00far\u00e1s \u00e9s m\u00f3dos\u00edt\u00e1s sebess\u00e9ge cs\u00f6kkent, \u00e9s ha indexeket adtunk hozz\u00e1 a megl\u00e9v\u0151 t\u00e1bl\u00e1hoz, a sebess\u00e9g dr\u00e1maian esett, az indexek l\u00e9trehoz\u00e1s \u00e9s \u00fajrabefoglal\u00e1s kies\u00e9ssel j\u00e1rt.<\/li>\n<li>A produkci\u00f3s k\u00f6rnyezetben l\u00e9v\u0151 n\u00e9h\u00e1ny Windows SQL Server megnehez\u00edti az infrastrukt\u00fara kezel\u00e9s\u00e9t<\/li>\n<\/ul>\n<p>\nDe a legnagyobb probl\u00e9ma \u2014 <\/p>\n<h2>Hibat\u0171r\u00e9s<\/h2>\n<p>\nA klasszikus SQL-szervernek gyenge a hibat\u0171r\u00e9se. Tegy\u00fck fel, hogy csak egy adatb\u00e1zis-szervere van, \u00e9s az h\u00e1rom \u00e9vente le\u00e1ll. Ilyenkor a weboldal 20 percig nem m\u0171k\u00f6dik, ami elfogadhat\u00f3. Ha 64 szervere van, akkor a weboldal h\u00e1romhetente egyszer \u00e1ll le. Ha pedig 200 szervere van, akkor a weboldal minden h\u00e9ten le\u00e1ll. Ez probl\u00e9ma. <\/p>\n<p>Mit tehet\u00fcnk a SQL-szerver hibat\u0171r\u00e9s\u00e9nek n\u00f6vel\u00e9se \u00e9rdek\u00e9ben? A Wikip\u00e9dia javasolja, hogy \u00e9p\u00edts\u00fcnk <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/High-availability_cluster\">magas rendelkez\u00e9sre \u00e1ll\u00e1s\u00fa klasztert<\/a><\/noindex>: ahol b\u00e1rmelyik komponens le\u00e1ll\u00e1sa eset\u00e9n van egy m\u00e1sodlagos megold\u00e1s.<\/p>\n<p>Ez k\u00f6lts\u00e9ges berendez\u00e9seket ig\u00e9nyel: rengeteg duplik\u00e1l\u00e1s, optikai sz\u00e1l, k\u00f6z\u00f6s t\u00e1rol\u00f3k, \u00e9s a tartal\u00e9k bekapcsol\u00e1sa is megb\u00edzhatatlanul m\u0171k\u00f6dik: az ind\u00edt\u00e1sok k\u00f6r\u00fclbel\u00fcl 10%-a a tartal\u00e9k csom\u00f3pont le\u00e1ll\u00e1s\u00e1val \u00e9r v\u00e9get a f\u0151 csom\u00f3pont m\u00f6g\u00f6tt. <\/p>\n<p>De a legnagyobb h\u00e1tr\u00e1nya ennek a magas rendelkez\u00e9sre \u00e1ll\u00e1s\u00fa klaszternek, hogy a d\u00e1tacentrum le\u00e1ll\u00e1sa eset\u00e9n nulla rendelkez\u00e9sre \u00e1ll\u00e1st biztos\u00edt. Az \"Odnoklassniki\" n\u00e9gy adatk\u00f6zponttal rendelkezik, \u00e9s biztos\u00edtanunk kell a m\u0171k\u00f6d\u00e9st, ha az egyik teljesen le\u00e1ll.<\/p>\n<p>Erre alkalmazhatn\u00e1nk <noindex><a rel=\"nofollow\" href=\"https:\/\/technet.microsoft.com\/en-us\/library\/ms151196.aspx\">Multi-Master<\/a><\/noindex> replik\u00e1ci\u00f3t, amely be van \u00e9p\u00edtve az SQL Serverbe. Ez a megold\u00e1s jelent\u0151sen dr\u00e1g\u00e1bb a szoftver k\u00f6lts\u00e9ge miatt, \u00e9s a replik\u00e1ci\u00f3val kapcsolatos j\u00f3l ismert probl\u00e9m\u00e1kt\u00f3l szenved, mint p\u00e9ld\u00e1ul a szinkron replik\u00e1ci\u00f3 eset\u00e9n a tranzakci\u00f3k el\u0151re nem l\u00e1that\u00f3 k\u00e9sleked\u00e9se, illetve a aszinkron replik\u00e1ci\u00f3k alkalmaz\u00e1s\u00e1nak k\u00e9sleked\u00e9sei (ez\u00e1ltal pedig elveszett m\u00f3dos\u00edt\u00e1sok). A k\u00e9zi konfliktusmegold\u00e1s pedig ezt a lehet\u0151s\u00e9get sz\u00e1munkra teljesen alkalmazhatatlann\u00e1 teszi. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/relational-databases\/replication\/transactional\/peer-to-peer-conflict-detection-in-peer-to-peer-replication\">K\u00e9zi konfliktusmegold\u00e1s<\/a><\/noindex> teljesen alkalmazhatatlann\u00e1 teszi ezt a lehet\u0151s\u00e9get sz\u00e1munkra.<\/p>\n<p>Mindezek a probl\u00e9m\u00e1k radik\u00e1lis megold\u00e1sokat ig\u00e9nyeltek, \u00e9s elkezdt\u00fck a r\u00e9szletes elemz\u00e9s\u00fcket. Itt meg kell ismern\u00fcnk, hogy az SQL Server alapvet\u0151en mit csin\u00e1l \u2014 tranzakci\u00f3kat.<\/p>\n<h2>Egyszer\u0171 tranzakci\u00f3<\/h2>\n<p>\nVizsg\u00e1ljuk meg a legegyszer\u0171bb tranzakci\u00f3t, a szemsz\u00f6g\u00e9b\u0151l n\u00e9zve egy alkalmaz\u00e1s SQL-programoz\u00f3ja sz\u00e1m\u00e1ra: egy f\u00e9nyk\u00e9p hozz\u00e1ad\u00e1sa egy albumhoz. Az albumok \u00e9s f\u00e9nyk\u00e9pek k\u00fcl\u00f6n t\u00e1bl\u00e1zatokban vannak t\u00e1rolva. Az albumnak van egy sz\u00e1ml\u00e1l\u00f3ja a nyilv\u00e1nos f\u00e9nyk\u00e9pekre. Ebben az esetben a tranzakci\u00f3 a k\u00f6vetkez\u0151 l\u00e9p\u00e9sekre oszlik: <\/p>\n<ol>\n<li>Z\u00e1roljuk az albumot kulcs alapj\u00e1n.<\/li>\n<li>L\u00e9trehozunk egy bejegyz\u00e9st a f\u00e9nyk\u00e9pek t\u00e1bl\u00e1j\u00e1ban. <\/li>\n<li>Ha a f\u00e9nyk\u00e9p nyilv\u00e1nos st\u00e1tusz\u00fa, akkor n\u00f6velj\u00fck az album nyilv\u00e1nos f\u00e9nyk\u00e9pek sz\u00e1m\u00e1t, friss\u00edtj\u00fck a bejegyz\u00e9st \u00e9s elk\u00f6telezz\u00fck a tranzakci\u00f3t.<\/li>\n<\/ol>\n<p>\nVagy \u00e1ln\u00e9ven:<\/p>\n<pre><code>TX.start(\"Albums\", id);\nAlbum album = albums.lock(id);\nPhoto photo = photos.create(\u2026);\n\nif (photo.status == PUBLIC ) {\n    album.incPublicPhotosCount();\n}\nalbum.update();\n\nTX.commit();<\/code><\/pre>\n<p>\nL\u00e1tjuk, hogy a legelterjedtebb \u00fczleti tranzakci\u00f3s forgat\u00f3k\u00f6nyv az, amikor adatokat olvasunk az adatb\u00e1zisb\u00f3l a alkalmaz\u00e1s szerver mem\u00f3ri\u00e1j\u00e1ba, m\u00f3dos\u00edtunk valamit, \u00e9s a \u00faj \u00e9rt\u00e9keket visszatessz\u00fck az adatb\u00e1zisba. \u00c1ltal\u00e1ban egy ilyen tranzakci\u00f3ban t\u00f6bb entit\u00e1st friss\u00edt\u00fcnk, t\u00f6bb t\u00e1bl\u00e1zatot. <\/p>\n<p>A tranzakci\u00f3 v\u00e9grehajt\u00e1sa sor\u00e1n a konkurens m\u00f3dos\u00edt\u00e1sok t\u00f6rt\u00e9nhetnek ugyanazon adatokkal m\u00e1s rendszerekb\u0151l. P\u00e9ld\u00e1ul az antispam rendszerek \u00fagy d\u00f6nthetnek, hogy a felhaszn\u00e1l\u00f3 gyan\u00fas, ez\u00e9rt minden fot\u00f3nak nem szabad nyilv\u00e1nosnak lennie, ezeket moder\u00e1ci\u00f3ra kell k\u00fcldeni, ami azt jelenti, hogy meg kell v\u00e1ltoztatni a photo.status-ot egy m\u00e1sik \u00e9rt\u00e9kre, \u00e9s vissza kell \u00e1ll\u00edtani a megfelel\u0151 sz\u00e1ml\u00e1l\u00f3kat. Nyilv\u00e1nval\u00f3, hogy ha ez az elj\u00e1r\u00e1s atomikus alkalmaz\u00e1s\u00e1nak \u00e9s a konkur\u00e1l\u00f3 m\u00f3dos\u00edt\u00e1sok elszigetel\u00e9s\u00e9nek garanci\u00e1i n\u00e9lk\u00fcl t\u00f6rt\u00e9nik, mint a <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>, akkor az eredm\u00e9ny nem az lesz, ami sz\u00fcks\u00e9ges \u2013 vagy a fot\u00f3sz\u00e1ml\u00e1l\u00f3 helytelen \u00e9rt\u00e9ket fog mutatni, vagy nem minden fot\u00f3 ker\u00fcl moder\u00e1ci\u00f3ra. <\/p>\n<p>Hasonl\u00f3 k\u00f3dok, amelyek k\u00fcl\u00f6nb\u00f6z\u0151 \u00fczleti entit\u00e1sokkal manipul\u00e1lnak egy tranz\u00e1ci\u00f3 keretein bel\u00fcl, az Odnoklassnikik l\u00e9tez\u00e9se alatt nagyon sokat \u00edrtak. A NoSQL-ra val\u00f3 migr\u00e1ci\u00f3k tapasztalata alapj\u00e1n <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">V\u00e1rhat\u00f3 Konzisztencia<\/a><\/noindex> tudjuk, hogy a legnagyobb neh\u00e9zs\u00e9get (\u00e9s id\u0151r\u00e1ford\u00edt\u00e1st) az adatok konzisztenci\u00e1j\u00e1nak fenntart\u00e1s\u00e1ra ir\u00e1nyul\u00f3 k\u00f3d fejleszt\u00e9s\u00e9nek sz\u00fcks\u00e9gess\u00e9ge jelenti. Ez\u00e9rt a legf\u0151bb k\u00f6vetelm\u00e9ny \u00faj t\u00e1rol\u00f3nk sz\u00e1m\u00e1ra az volt, hogy biztos\u00edtsa az alkalmaz\u00e1s logik\u00e1ja sz\u00e1m\u00e1ra a val\u00f3di ACID tranzakci\u00f3kat. <\/p>\n<p>M\u00e1s, nem kev\u00e9sb\u00e9 fontos k\u00f6vetelm\u00e9nyek voltak:<\/p>\n<ul>\n<li>Adatk\u00f6zpont meghib\u00e1sod\u00e1sa eset\u00e9n az \u00faj t\u00e1rol\u00f3n bel\u00fcl mind az olvas\u00e1s, mind a \u00edr\u00e1s hozz\u00e1f\u00e9rhet\u0151 kell legyen.<\/li>\n<li>A jelenlegi fejleszt\u00e9si sebess\u00e9g fenntart\u00e1sa. Teh\u00e1t az \u00faj t\u00e1rol\u00f3val val\u00f3 munka sor\u00e1n a k\u00f3d mennyis\u00e9g\u00e9nek k\u00f6r\u00fclbel\u00fcl ugyanannak kell lennie, nem szabad sz\u00fcks\u00e9gess\u00e9 tenni a t\u00e1rol\u00f3ba val\u00f3 tov\u00e1bbi \u00edr\u00e1st, konfliktusok megold\u00e1s\u00e1ra szolg\u00e1l\u00f3 algoritmusok kifejleszt\u00e9s\u00e9t, m\u00e1sodlagos indexek fenntart\u00e1s\u00e1t stb. <\/li>\n<li>Az \u00faj t\u00e1rol\u00f3 sebess\u00e9g\u00e9nek el\u00e9g magasnak kell lennie, mind az adatok olvas\u00e1sakor, mind a tranzakci\u00f3k feldolgoz\u00e1sakor, ami t\u00e9nylegesen azt jelentette, hogy az akad\u00e9miailag szigor\u00fa, univerz\u00e1lis, de lass\u00fa megold\u00e1sok, mint p\u00e9ld\u00e1ul <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Two-phase_commit_protocol\">a k\u00e9phaszn\u00e1l\u00f3k k\u00e9tszakaszos biztons\u00e1gi megold\u00e1sai nem alkalmazhat\u00f3k.<\/a><\/noindex>.<\/li>\n<li>Automatikus sk\u00e1l\u00e1z\u00e1s val\u00f3s id\u0151ben. <\/li>\n<li>H\u00e9tk\u00f6znapi olcs\u00f3 szerverek haszn\u00e1lata, egzotikus hardverek v\u00e1s\u00e1rl\u00e1s\u00e1nak sz\u00fcks\u00e9gess\u00e9ge n\u00e9lk\u00fcl. <\/li>\n<li>A t\u00e1rol\u00f3 fejleszt\u00e9si lehet\u0151s\u00e9ge a v\u00e1llalat fejleszt\u0151i \u00e1ltal. M\u00e1s sz\u00f3val, a priorit\u00e1s a saj\u00e1t, vagy ny\u00edlt forr\u00e1sk\u00f3d\u00fa megold\u00e1sokra \u00f6sszpontosult, lehet\u0151leg Java nyelven.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Megold\u00e1sok, megold\u00e1sok<\/h2>\n<p>\nA lehets\u00e9ges megold\u00e1sokat elemezve k\u00e9t architekt\u00fara alternat\u00edv\u00e1t tal\u00e1ltunk:<\/p>\n<p>Az els\u0151 \u2014 b\u00e1rmilyen SQL szerver kiv\u00e1laszt\u00e1sa, \u00e9s a sz\u00fcks\u00e9ges hibat\u0171r\u00e9s, sk\u00e1l\u00e1z\u00e1si mechanizmus, hibat\u0171r\u0151 klaszter, konfliktuskezel\u00e9s \u00e9s elosztott, megb\u00edzhat\u00f3 \u00e9s gyors ACID tranzakci\u00f3k megval\u00f3s\u00edt\u00e1sa. Ezt a lehet\u0151s\u00e9get el\u00e9g \u00f6sszetettnek \u00e9s id\u0151ig\u00e9nyesnek \u00edt\u00e9lt\u00fck.<\/p>\n<p>A m\u00e1sodik lehet\u0151s\u00e9g \u2014 egy m\u00e1r k\u00e9sz NoSQL t\u00e1rol\u00f3 v\u00e1laszt\u00e1sa, amely megval\u00f3s\u00edtott sk\u00e1l\u00e1z\u00e1ssal, hibat\u0171r\u0151 klaszterrel, konfliktuskezel\u00e9ssel \u00e9s az SQL \u00e9s tranzakci\u00f3k saj\u00e1t magunk \u00e1ltali megval\u00f3s\u00edt\u00e1sa. Els\u0151 pillant\u00e1sra m\u00e9g az SQL megval\u00f3s\u00edt\u00e1sa, nem besz\u00e9lve az ACID tranzakci\u00f3kr\u00f3l, \u00e9vekig tart\u00f3 feladatnak t\u0171nt. De k\u00e9s\u0151bb r\u00e1j\u00f6tt\u00fcnk, hogy az SQL lehet\u0151s\u00e9gek, amelyeket a gyakorlatban haszn\u00e1lunk, messze \u00e1llnak az ANSI SQL-t\u0151l, \u00e9ppen \u00fagy, ahogy <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Apache_Cassandra#Cassandra_Query_Language\">Cassandra CQL<\/a><\/noindex> messze \u00e1ll az ANSI SQL-t\u0151l. Alaposabban megvizsg\u00e1lva a CQL-t, r\u00e1j\u00f6tt\u00fcnk, hogy az el\u00e9g k\u00f6zel \u00e1ll ahhoz, amire sz\u00fcks\u00e9g\u00fcnk van.<\/p>\n<h2>Cassandra \u00e9s CQL<\/h2>\n<p>\nTeh\u00e1t mi\u00e9rt \u00e9rdekes a Cassandra, milyen lehet\u0151s\u00e9gekkel rendelkezik?<\/p>\n<p>El\u0151sz\u00f6r is, itt k\u00fcl\u00f6nb\u00f6z\u0151 adatsorokkal rendelkez\u0151 t\u00e1bl\u00e1kat lehet l\u00e9trehozni, lehet\u0151s\u00e9g van SELECT vagy UPDATE v\u00e9grehajt\u00e1s\u00e1ra az els\u0151dleges kulcs alapj\u00e1n.<\/p>\n<pre><code>CREATE TABLE photos (id bigint KEY, owner bigint,\u2026);\nSELECT * FROM photos WHERE id=?;\nUPDATE photos SET \u2026 WHERE id=?;<\/code><\/pre>\n<p>\nA replik\u00e1k adatainak konzisztenci\u00e1j\u00e1nak biztos\u00edt\u00e1sa \u00e9rdek\u00e9ben a Cassandra <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Quorum_(distributed_computing)\">kv\u00f3rum megk\u00f6zel\u00edt\u00e9st alkalmaz.<\/a><\/noindex>A legegyszer\u0171bb esetben ez azt jelenti, hogy ha h\u00e1rom m\u00e1solatot helyez\u00fcnk el ugyanannak a sorozatnak a k\u00fcl\u00f6nb\u00f6z\u0151 csom\u00f3pontjaiban, a rekord akkor sz\u00e1m\u00edt sikeresnek, ha a csom\u00f3pontok t\u00f6bbs\u00e9ge (teh\u00e1t kett\u0151 a h\u00e1rom k\u00f6z\u00fcl) meger\u0151s\u00edtette a m\u0171velet siker\u00e9t. A sorozat adatainak akkor sz\u00e1m\u00edtanak konszolid\u00e1ltnak, ha a legt\u00f6bb csom\u00f3pontot megk\u00e9rdezt\u00e9k olvas\u00e1skor, \u00e9s meger\u0151s\u00edtett\u00e9k \u0151ket. \u00cdgy h\u00e1rom m\u00e1solat eset\u00e9n teljes \u00e9s azonnali adatok konzisztenci\u00e1j\u00e1t garant\u00e1lj\u00e1k egy csom\u00f3pont meghib\u00e1sod\u00e1sa eset\u00e9n. Ez a megk\u00f6zel\u00edt\u00e9s lehet\u0151v\u00e9 tette sz\u00e1munkra, hogy egy m\u00e9g megb\u00edzhat\u00f3bb s\u00e9m\u00e1t val\u00f3s\u00edtsunk meg: mindig elk\u00fcldj\u00fck a k\u00e9r\u00e9seket mindh\u00e1rom m\u00e1solatnak, \u00e9s v\u00e1rakozunk a k\u00e9t leggyorsabb v\u00e1lasz\u00e1ra. A harmadik m\u00e1solat k\u00e9sleked\u0151 v\u00e1lasza ilyenkor elvet\u00e9sre ker\u00fcl. A k\u00e9sleked\u0151 csom\u00f3pontnak ek\u00f6zben s\u00falyos probl\u00e9m\u00e1i lehetnek \u2014 lassul\u00e1s, szem\u00e9tgy\u0171jt\u00e9s a JVM-ben, k\u00f6zvetlen mem\u00f3ria visszaig\u00e9nyl\u00e9s a linux kernelben, hardverhiba, h\u00e1l\u00f3zati lev\u00e1l\u00e1s. Azonban ez a kliens m\u0171veleteire \u00e9s az adatokra semmilyen hat\u00e1ssal nincs.<\/p>\n<p>A megk\u00f6zel\u00edt\u00e9s, amikor h\u00e1rom csom\u00f3ponthoz fordulunk, \u00e9s k\u00e9t v\u00e1lasz \u00e9rkezik, \u00fagynevezett <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Speculative_execution\">spekul\u00e1ci\u00f3nak<\/a><\/noindex>: a felesleges m\u00e1solatokra vonatkoz\u00f3 k\u00e9r\u00e9s m\u00e9g azel\u0151tt elindul, hogy a \"lev\u00e1l\u00e1s\" megt\u00f6rt\u00e9nne. <\/p>\n<p>A Cassandra m\u00e1sik el\u0151nye a Batchlog \u2014 egy mechanizmus, amely garant\u00e1lja a csomag teljes alkalmaz\u00e1s\u00e1t vagy teljes elutas\u00edt\u00e1s\u00e1t, \u00edgy megoldjuk az A-t az ACID-ben \u2014 az atomarit\u00e1st alap\u00e9rtelmez\u00e9s szerint.<\/p>\n<p>A legk\u00f6zelebb a Cassandra tranzakci\u00f3ihoz az \u00fagynevezett &#171;<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.datastax.com\/en\/cql\/3.3\/cql\/cql_using\/useInsertLWT.html\">lightweight transactions<\/a><\/noindex>&#171;. De a \"val\u00f3di\" ACID tranzakci\u00f3kt\u00f3l t\u00e1vol \u00e1llnak: val\u00f3j\u00e1ban ez lehet\u0151s\u00e9g arra, hogy <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Compare-and-swap\">CAS<\/a><\/noindex> adatok egyetlen rekordj\u00e1ra alkalmazni, a Paxos neh\u00e9z protokoll konszenzusa seg\u00edts\u00e9g\u00e9vel. Ez\u00e9rt ezek a tranzakci\u00f3k nem t\u00fal gyorsak. <\/p>\n<h2>Ami hi\u00e1nyzik a Cassandr\u00e1t\u00f3l<\/h2>\n<p>\n\u00cdgy a Cassandraban val\u00f3di ACID-tranzakci\u00f3kat kellett megval\u00f3s\u00edtanunk, amelyek seg\u00edts\u00e9g\u00e9vel k\u00f6nnyen megval\u00f3s\u00edthatn\u00e1nk a klasszikus DBMS k\u00e9t m\u00e1sik k\u00e9nyelmes lehet\u0151s\u00e9g\u00e9t: a konzisztens gyors indexeket, ami lehet\u0151v\u00e9 tenn\u00e9 sz\u00e1munkra az adatok lek\u00e9rdez\u00e9s\u00e9t nemcsak a primer kulcs szerint, hanem egy norm\u00e1l monoton automatikus n\u00f6vel\u0151 ID gener\u00e1l\u00f3j\u00e1t is.<\/p>\n<h4>C*One<\/h4>\n<p>\n\u00cdgy sz\u00fcletett meg az \u00faj adatb\u00e1zis-kezel\u0151 rendszer <b>C*One<\/b>, amely h\u00e1rom t\u00edpus\u00fa szervercsom\u00f3pontb\u00f3l \u00e1ll:<\/p>\n<ul>\n<li>T\u00e1rhelyek \u2014 (majdnem) standard Cassandra szerverek, amelyek a helyi lemezeken t\u00e1rolj\u00e1k az adatokat. A terhel\u00e9s \u00e9s az adatmennyis\u00e9g n\u00f6veked\u00e9s\u00e9vel a sz\u00e1muk k\u00f6nnyen b\u0151v\u00edthet\u0151 ak\u00e1r tucatokra \u00e9s sz\u00e1zakra.<\/li>\n<li>A tranzakci\u00f3koordin\u00e1torok biztos\u00edtj\u00e1k a tranzakci\u00f3k v\u00e9grehajt\u00e1s\u00e1t. <\/li>\n<li>Az \u00fcgyfelek \u2013 az alkalmaz\u00e1sszerverek, amelyek \u00fczleti m\u0171veleteket hajtanak v\u00e9gre \u00e9s ind\u00edtj\u00e1k a tranzakci\u00f3kat. Az ilyen \u00fcgyfelekb\u0151l ak\u00e1r ezrek is lehetnek.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/f3809d89404ae596c62b642dbdb9e431.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMinden t\u00edpus\u00fa szerver egy k\u00f6z\u00f6s klaszterben van, a Cassandra bels\u0151 \u00fczenetprotokollj\u00e1t haszn\u00e1lj\u00e1k az egym\u00e1ssal val\u00f3 kommunik\u00e1ci\u00f3hoz \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">gossip<\/a><\/noindex> a klaszterinform\u00e1ci\u00f3k cser\u00e9j\u00e9re. A Heartbeat seg\u00edts\u00e9g\u00e9vel a szerverek \u00e9rtes\u00fclnek a k\u00f6lcs\u00f6n\u00f6s meghib\u00e1sod\u00e1sokr\u00f3l, fenntartj\u00e1k az egys\u00e9ges adatmodelt \u2013 t\u00e1bl\u00e1k, azok szerkezete \u00e9s replik\u00e1ci\u00f3; a part\u00edcion\u00e1l\u00e1si s\u00e9ma, a klaszter topol\u00f3gi\u00e1ja stb.<\/p>\n<h4>\u00dcgyfelek<\/h4>\n<p>\n<img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/80f83358f215cf59db3b657ba1083420.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA hagyom\u00e1nyos meghajt\u00f3k helyett Fat Client \u00fczemm\u00f3dot haszn\u00e1lunk. Az ilyen csom\u00f3pont nem t\u00e1rol adatokat, de a lek\u00e9rdez\u00e9sek v\u00e9grehajt\u00e1s\u00e1nak koordin\u00e1torak\u00e9nt m\u0171k\u00f6dhet, azaz az \u00fcgyf\u00e9l maga hajtja v\u00e9gre a lek\u00e9rdez\u00e9sek koordin\u00e1l\u00e1s\u00e1nak funkci\u00f3j\u00e1t: lek\u00e9rdezi a t\u00e1rol\u00f3 replik\u00e1it \u00e9s feloldja a konfliktusokat. Ez nemcsak megb\u00edzhat\u00f3bb \u00e9s gyorsabb, mint a t\u00e1voli koordin\u00e1torral kommunik\u00e1l\u00f3 hagyom\u00e1nyos meghajt\u00f3, hanem lehet\u0151v\u00e9 teszi a lek\u00e9rdez\u00e9sek \u00e1tvitel\u00e9nek kezel\u00e9s\u00e9t is. Az \u00fcgyf\u00e9l \u00e1ltal megnyitott tranzakci\u00f3n k\u00edv\u00fcl a lek\u00e9rdez\u00e9sek a t\u00e1rol\u00f3khoz ir\u00e1nyulnak. Ha azonban az \u00fcgyf\u00e9l megnyitott egy tranzakci\u00f3t, akkor a tranzakci\u00f3n bel\u00fcli \u00f6sszes lek\u00e9rdez\u00e9s a tranzakci\u00f3koordin\u00e1torhoz ker\u00fcl.<br \/>\n<img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/709bf227eeb8f71abeff703a72780efd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>C*One tranzakci\u00f3koordin\u00e1tor<\/h2>\n<p>\nA koordin\u00e1tor az, amit a C*One-hoz teljesen null\u00e1r\u00f3l val\u00f3s\u00edtottunk meg. \u0150 felel\u0151s a tranzakci\u00f3k, z\u00e1rol\u00e1sok \u00e9s a tranzakci\u00f3k alkalmaz\u00e1s\u00e1nak sorrendj\u00e9nek kezel\u00e9s\u00e9\u00e9rt.<\/p>\n<p>Minden kezelt tranzakci\u00f3hoz a koordin\u00e1tor l\u00e9trehoz egy id\u0151b\u00e9lyeget: minden k\u00f6vetkez\u0151 nagyobb, mint az el\u0151z\u0151 tranzakci\u00f3 id\u0151b\u00e9lyege. Mivel a Cassandra rendszer konfliktusfelold\u00e1sa id\u0151b\u00e9lyegek alapj\u00e1n m\u0171k\u00f6dik (k\u00e9t konfliktusos bejegyz\u00e9s k\u00f6z\u00fcl a k\u00e9s\u0151bbi id\u0151b\u00e9lyeggel rendelkez\u0151 \u00e9r v\u00e9get), mindig a k\u00f6vetkez\u0151 tranzakci\u00f3 jav\u00e1ra d\u0151l el a konfliktus. \u00cdgy val\u00f3s\u00edtottuk meg <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A7%D0%B0%D1%81%D1%8B_%D0%9B%D1%8D%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D0%B0\">Lamport \u00f3r\u00e1kat<\/a><\/noindex> \u2013 olcs\u00f3 m\u00f3dszert a konfliktusok felold\u00e1s\u00e1ra elosztott rendszerben.<\/p>\n<h2>Z\u00e1rol\u00e1sok<\/h2>\n<p>\nA szigetel\u00e9s biztos\u00edt\u00e1sa \u00e9rdek\u00e9ben a legegyszer\u0171bb m\u00f3dszert v\u00e1lasztottuk \u2013 pesszimista z\u00e1rol\u00e1sokat a bejegyz\u00e9s els\u0151dleges kulcsa szerint. M\u00e1s szavakkal, a tranzakci\u00f3ban a bejegyz\u00e9st el\u0151sz\u00f6r z\u00e1rolni kell, csak ezut\u00e1n lehet elolvasni, m\u00f3dos\u00edtani \u00e9s elmenteni. Csak a sikeres elk\u00f6telez\u00e9s ut\u00e1n oldhat\u00f3 fel a bejegyz\u00e9s, hogy a versenyt\u00e1rs tranzakci\u00f3k haszn\u00e1lhass\u00e1k.<\/p>\n<p>A blokkol\u00e1s megval\u00f3s\u00edt\u00e1sa egyszer\u0171 a nem elosztott k\u00f6rnyezetben. Elosztott rendszerben k\u00e9t f\u0151 megold\u00e1s l\u00e9tezik: vagy meg kell val\u00f3s\u00edtani az elosztott blokkol\u00e1st a klaszterben, vagy el kell osztani a tranzakci\u00f3kat \u00fagy, hogy a k\u00f6zvetlen\u00fcl kapcsol\u00f3d\u00f3 tranzakci\u00f3kat mindig ugyanaz a koordin\u00e1tor kezelje.<\/p>\n<p>Mivel a mi eset\u00fcnkben az adatok m\u00e1r csoportos\u00edtva vannak a helyi tranzakci\u00f3k szerint SQL-ben, \u00fagy d\u00f6nt\u00f6tt\u00fcnk, hogy a helyi tranzakci\u00f3csoportok sz\u00e1m\u00e1ra r\u00f6gz\u00edtett koordin\u00e1torokat \u00e1ll\u00edtunk be: az egyik koordin\u00e1tor az \u00f6sszes tranzakci\u00f3t kezeli, amelynek azonos\u00edt\u00f3ja 0-9, a m\u00e1sik a 10-19 k\u00f6z\u00f6tti tranzakci\u00f3kat, \u00e9s \u00edgy tov\u00e1bb. Ennek eredm\u00e9nyek\u00e9nt minden koordin\u00e1tor p\u00e9ld\u00e1ny a tranzakci\u00f3s csoport mestere lesz. <\/p>\n<p>Ekkor a blokkol\u00e1sok megval\u00f3s\u00edthat\u00f3k egy egyszer\u0171 HashMap form\u00e1j\u00e1ban a koordin\u00e1tor mem\u00f3ri\u00e1j\u00e1ban.<\/p>\n<h2>A koordin\u00e1torok hib\u00e1i<\/h2>\n<p>\nMivel egy koordin\u00e1tor kiz\u00e1r\u00f3lag egy tranzakci\u00f3csoportot szolg\u00e1l ki, nagyon fontos gyorsan meghat\u00e1rozni a le\u00e1ll\u00e1s\u00e1t, hogy a tranzakci\u00f3 \u00fajb\u00f3li v\u00e9grehajt\u00e1sa belef\u00e9rjen a hat\u00e1rid\u0151be. Ehhez gyors \u00e9s megb\u00edzhat\u00f3 megold\u00e1sk\u00e9nt egy teljesen \u00f6sszekapcsolt kvorum alap\u00fa heartbeat protokollt alkalmaztunk:<\/p>\n<p>Minden adatk\u00f6zpontban legal\u00e1bb k\u00e9t koordin\u00e1tor csom\u00f3pont tal\u00e1lhat\u00f3. Id\u0151szakosan minden koordin\u00e1tor megk\u00fcldi heartbeat \u00fczenet\u00e9t a t\u00f6bbi koordin\u00e1tornak, t\u00e1j\u00e9koztatja \u0151ket a m\u0171k\u00f6d\u00e9s\u00e9r\u0151l, valamint arr\u00f3l, hogy mely koordin\u00e1torokt\u00f3l kapta meg utolj\u00e1ra a heartbeat \u00fczeneteket a klaszterben. <\/p>\n<p><img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/5c337e53815cad0a2071b160d98d42fa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA t\u00f6bbi koordin\u00e1tort\u00f3l kapott hasonl\u00f3 inform\u00e1ci\u00f3k alapj\u00e1n minden koordin\u00e1tor eld\u00f6nti, hogy a klaszter mely csom\u00f3pontjai m\u0171k\u00f6dnek \u00e9s melyek nem, a kvorum elv\u00e9t k\u00f6vetve: ha a X csom\u00f3pont a klaszter t\u00f6bbs\u00e9g\u00e9t\u0151l inform\u00e1ci\u00f3t kap arr\u00f3l, hogy a Y csom\u00f3pontt\u00f3l a heartbeat \u00fczenetek rendben meg\u00e9rkeztek, akkor Y m\u0171k\u00f6dik. \u00c9s ford\u00edtva, amint a t\u00f6bbs\u00e9g jelez arr\u00f3l, hogy nem kapott \u00fczeneteket Y csom\u00f3pontt\u00f3l, akkor Y meghib\u00e1sodott. \u00c9rdekes, hogy ha a kvorum \u00e9rtes\u00edti az X csom\u00f3pontot arr\u00f3l, hogy t\u00f6bb\u00e9 nem kap t\u0151le \u00fczeneteket, akkor mag\u00e1t a X csom\u00f3pontot is hib\u00e1snak fogja tekinteni.<\/p>\n<p>A heartbeat message is sent at a high frequency, about 20 times per second, with a period of 50 ms. In Java, it is difficult to guarantee an application response within 50 ms due to comparable pause durations caused by the garbage collector. We managed to achieve such a response time using the G1 garbage collector, which allows specifying a target for the duration of GC pauses. However, sometimes, quite rarely, the garbage collector pauses exceed 50 ms, which can lead to false failure detection. To prevent this, the coordinator does not report the failure of a remote node upon losing the first heartbeat message from it, only if several in a row are lost. This way, we managed to achieve the detection of a coordinator node failure in 200 ms. <\/p>\n<p>But it is not enough to quickly understand which node has stopped functioning. Something needs to be done about that. <\/p>\n<h2>K\u00f6lcs\u00f6nz\u00e9s<\/h2>\n<p>\nThe classic scheme suggests initiating new elections in case of a master failure using one of the<noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Raft\"> fashionable<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9F%D0%B0%D0%BA%D1%81%D0%BE%D1%81\">universal<\/a><\/noindex> algorithms. However, these algorithms have well-known problems with convergence over time and the duration of the election process itself. We managed to avoid such additional delays using a coordinator replacement scheme in a fully connected network:<\/p>\n<p><img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/5e2db258fa2200026390a73a414dfe81.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSuppose we want to execute a transaction in group 50. We will predefine the replacement scheme, that is, which nodes will perform transactions for group 50 in case of the primary coordinator's failure. Our goal is to maintain system operability in the event of a data center failure. We will define that the first backup will be a node from another data center, and the second backup will be a node from a third. This scheme is selected once and does not change until the cluster topology changes, that is, until new nodes join it (which happens very rarely). The order of selecting a new active master in case of the old one failing will always be as follows: the first backup will become the active master, and if it also stops functioning, the second backup. <\/p>\n<p>This scheme is more reliable than a universal algorithm, as activating a new master requires only determining the fact of the old one's failure.<\/p>\n<p>De hogyan \u00e9rthetik meg az \u00fcgyfelek, hogy melyik mester dolgozik \u00e9ppen? 50 ms alatt lehetetlen inform\u00e1ci\u00f3t k\u00fcldeni ezer \u00fcgyf\u00e9lnek. Olyan helyzet fordulhat el\u0151, amikor az \u00fcgyf\u00e9l egy tranzakci\u00f3 megnyit\u00e1s\u00e1ra k\u00fcld k\u00e9rd\u00e9st, m\u00e9g nem tudva, hogy ez a mester m\u00e1r nem akt\u00edv, \u00e9s a k\u00e9rd\u00e9se id\u0151t\u00fall\u00e9p\u00e9s miatt megakadhat. Ennek elker\u00fcl\u00e9se \u00e9rdek\u00e9ben az \u00fcgyfelek spekulat\u00edvan k\u00fcldenek tranzakci\u00f3megnyit\u00f3 k\u00e9relmet az adott csoport mestere fel\u00e9 \u00e9s mindk\u00e9t tartal\u00e9k\u00e1nak, de a k\u00e9rd\u00e9sre csak az akt\u00edv mester fog v\u00e1laszolni. A tranzakci\u00f3 keretein bel\u00fcl minden tov\u00e1bbi kommunik\u00e1ci\u00f3t az \u00fcgyf\u00e9l csak az akt\u00edv mesterrel folytathat.<\/p>\n<p>A tartal\u00e9k mesterek a nekik nem tartoz\u00f3 tranzakci\u00f3kra \u00e9rkez\u0151 k\u00e9relmeket a m\u00e9g meg nem sz\u00fcletett tranzakci\u00f3k sor\u00e1ba helyezik, ahol egy ideig t\u00e1rolj\u00e1k \u0151ket. Ha az akt\u00edv mester elhal\u00e1lozik, akkor az \u00faj mester dolgozza fel a tranzakci\u00f3k megnyit\u00e1s\u00e1ra vonatkoz\u00f3 k\u00e9relmeket a saj\u00e1t sor\u00e1b\u00f3l \u00e9s v\u00e1laszol az \u00fcgyf\u00e9lnek. Ha az \u00fcgyf\u00e9l m\u00e1r megnyitott egy tranzakci\u00f3t a r\u00e9gi mestern\u00e9l, akkor a m\u00e1sodik v\u00e1lasz figyelmen k\u00edv\u00fcl marad (\u00e9s nyilv\u00e1nval\u00f3an a tranzakci\u00f3 nem z\u00e1rul le, \u00e9s az \u00fcgyf\u00e9l \u00fajra megpr\u00f3b\u00e1lja).<\/p>\n<h2>Hogyan m\u0171k\u00f6dik a tranzakci\u00f3<\/h2>\n<p>\nTegy\u00fck fel, hogy az \u00fcgyf\u00e9l elk\u00fcld\u00f6tt egy k\u00e9relmet az koordin\u00e1tornak egy tranzakci\u00f3 megnyit\u00e1s\u00e1ra egy bizonyos entit\u00e1sra egy adott els\u0151dleges kulccsal. Az koordin\u00e1tor letiltja ezt az entit\u00e1st \u00e9s elhelyezi a z\u00e1rol\u00e1si t\u00e1bl\u00e1zatban a mem\u00f3ri\u00e1ban. Ha sz\u00fcks\u00e9ges, az koordin\u00e1tor kiolvassa ezt az entit\u00e1st a t\u00e1rol\u00f3b\u00f3l \u00e9s a kapott adatokat a tranzakci\u00f3 \u00e1llapot\u00e1ba menti a koordin\u00e1tor mem\u00f3ri\u00e1j\u00e1ban.<\/p>\n<p><img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/246b4a5c68a4cc886b87af784c16b9dc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAmikor az \u00fcgyf\u00e9l m\u00f3dos\u00edtani szeretn\u00e9 az adatokat a tranzakci\u00f3 keret\u00e9ben, elk\u00fcldi az koordin\u00e1tornak a m\u00f3dos\u00edt\u00e1shoz sz\u00fcks\u00e9ges k\u00e9relm\u00e9t, amelybe az \u00faj adatokat elhelyezi a tranzakci\u00f3k \u00e1llapot t\u00e1bl\u00e1j\u00e1ba a mem\u00f3ri\u00e1ban. Ezen a ponton a bejegyz\u00e9s befejez\u0151dik \u2014 a t\u00e1rol\u00f3ba nem t\u00f6rt\u00e9nik \u00edr\u00e1s.<\/p>\n<p><img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/4400a91af30eb71134978ff27474f745.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAmikor az \u00fcgyf\u00e9l k\u00e9r egy lek\u00e9rdez\u00e9st az akt\u00edv tranzakci\u00f3 keret\u00e9ben az \u00e1ltala m\u00f3dos\u00edtott adatokra, az koordin\u00e1tor a k\u00f6vetkez\u0151 m\u00f3don j\u00e1r el: <\/p>\n<ul>\n<li>ha az ID m\u00e1r l\u00e9tezik a tranzakci\u00f3ban, akkor az adatok a mem\u00f3ri\u00e1b\u00f3l sz\u00e1rmaznak; <\/li>\n<li>ha az ID nincs a mem\u00f3ri\u00e1ban, akkor a hi\u00e1nyz\u00f3 adatokat kiolvass\u00e1k a csom\u00f3pont-t\u00e1rol\u00f3kb\u00f3l, egyes\u00edtik a m\u00e1r megl\u00e9v\u0151 adatokkal, \u00e9s az eredm\u00e9nyt visszaadj\u00e1k az \u00fcgyf\u00e9lnek. <\/li>\n<\/ul>\n<p>\n\u00cdgy az \u00fcgyf\u00e9l olvashatja a saj\u00e1t m\u00f3dos\u00edt\u00e1sait, m\u00edg m\u00e1s \u00fcgyfelek nem l\u00e1tj\u00e1k ezeket a v\u00e1ltoz\u00e1sokat, mivel csak a koordin\u00e1tor mem\u00f3ri\u00e1j\u00e1ban t\u00e1rol\u00f3dnak, a Cassandra csom\u00f3pontokban m\u00e9g nincsenek ott.<\/p>\n<p><img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/c93fd7e8393f431a976f1f56b95e227c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAmikor egy \u00fcgyf\u00e9l elk\u00fcldi a commitot, a szolg\u00e1ltat\u00e1s mem\u00f3ri\u00e1j\u00e1ban l\u00e9v\u0151 \u00e1llapotot a koordin\u00e1tor a logged batch-ben menti, ami m\u00e1r logged batch form\u00e1ban ker\u00fcl a Cassandra t\u00e1rol\u00f3khoz. A t\u00e1rol\u00f3k mindent megtesznek annak \u00e9rdek\u00e9ben, hogy ez a csomag atomikusan (teljes m\u00e9rt\u00e9kben) alkalmaz\u00e1sra ker\u00fclj\u00f6n, \u00e9s v\u00e1laszolnak a koordin\u00e1tornak, aki felszabad\u00edtja a z\u00e1rol\u00e1sokat, \u00e9s meger\u0151s\u00edti a tranzakci\u00f3 sikeress\u00e9g\u00e9t az \u00fcgyf\u00e9lnek.<\/p>\n<p><img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/ab20487ba53ed88e2f560a2249b5d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA visszag\u00f6rget\u00e9shez a koordin\u00e1tornak csup\u00e1n annyira van sz\u00fcks\u00e9ge, hogy felszabad\u00edtsa a tranzakci\u00f3 \u00e1llapot\u00e1t foglal\u00f3 mem\u00f3ri\u00e1t.<\/p>\n<p>A fent eml\u00edtett fejleszt\u00e9sek eredm\u00e9nyek\u00e9nt megval\u00f3s\u00edtottuk az ACID-elveket:<\/p>\n<ul>\n<li><b>Atomarit\u00e1s<\/b>. Ez garant\u00e1lja, hogy egy tranzakci\u00f3 sem lesz r\u00e9szben r\u00f6gz\u00edtve a rendszerben, vagy az \u00f6sszes altransz\u00e1ci\u00f3 teljes\u00fcl, vagy egy sem. N\u00e1lunk ezt az elvet a Cassandra logged batch rendszere biztos\u00edtja.<\/li>\n<li><b>K\u00f6vetkezetess\u00e9g<\/b>. Minden sikeres tranzakci\u00f3 defin\u00edci\u00f3szer\u0171en csak megengedett eredm\u00e9nyeket r\u00f6gz\u00edt. Ha a tranzakci\u00f3 nyit\u00e1sa ut\u00e1n \u00e9s egyes m\u0171veletek v\u00e9grehajt\u00e1sa ut\u00e1n kider\u00fcl, hogy az eredm\u00e9ny \u00e9rv\u00e9nytelen, visszag\u00f6rget\u00e9st hajtunk v\u00e9gre.<\/li>\n<li><b>Sz\u00e9ls\u0151s\u00e9ges szigetel\u00e9s<\/b>. Tranzakci\u00f3 v\u00e9grehajt\u00e1sa sor\u00e1n a p\u00e1rhuzamos tranzakci\u00f3knak nem szabad befoly\u00e1solniuk az eredm\u00e9ny\u00e9t. A verseng\u0151 tranzakci\u00f3kat pesszimista z\u00e1rol\u00e1sokkal izol\u00e1lj\u00e1k a koordin\u00e1toron. A tranzakci\u00f3n k\u00edv\u00fcli olvas\u00e1sokn\u00e1l a szigetel\u00e9s elve a Read Committed szintj\u00e9n \u00e9rv\u00e9nyes\u00fcl.<\/li>\n<li><b>Stabilit\u00e1s<\/b>. F\u00fcggetlen\u00fcl az als\u00f3bb szint\u0171 probl\u00e9m\u00e1kt\u00f3l \u2014 rendszer\u00e1ramkimarad\u00e1s, berendez\u00e9s meghib\u00e1sod\u00e1sa \u2014 a sikeresen befejezett tranzakci\u00f3 \u00e1ltal v\u00e9grehajtott v\u00e1ltoz\u00e1soknak meg kell maradniuk a m\u0171k\u00f6d\u00e9s helyre\u00e1ll\u00edt\u00e1sa ut\u00e1n. <\/li>\n<\/ul>\n<p><\/p>\n<h2>Indexek szerinti olvas\u00e1s<\/h2>\n<p>\nVegy\u00fcnk egy egyszer\u0171 t\u00e1bl\u00e1zatot: <\/p>\n<pre><code>CREATE TABLE photos (\nid bigint primary key,\nowner bigint,\nmodified timestamp,\n\u2026)<\/code><\/pre>\n<p>\nMindez tartalmaz egy azonos\u00edt\u00f3t (els\u0151dleges kulcs), a tulajdonost \u00e9s a m\u00f3dos\u00edt\u00e1s d\u00e1tum\u00e1t. K\u00e9sz\u00edten\u00fcnk kell egy nagyon egyszer\u0171 lek\u00e9rdez\u00e9st \u2014 v\u00e1lasszuk ki az adatokat a tulajdonos szerint a \"m\u00falt 24 \u00f3r\u00e1ban\" m\u00f3dos\u00edtott d\u00e1tummal. <\/p>\n<pre><code>SELECT *\nWHERE owner=?\nAND modified&gt;?<\/code><\/pre>\n<p>\nAhhoz, hogy az ilyen lek\u00e9rdez\u00e9s gyorsan v\u00e9grehajthat\u00f3 legyen, egy klasszikus SQL DBMS-ben indexet kell \u00e9p\u00edten\u00fcnk a (owner, modified) oszlopokra. Ezt el\u00e9g egyszer\u0171en megtehetj\u00fck, mivel most m\u00e1r megvannak az ACID-garanci\u00e1ink!<\/p>\n<h2>Indexek a C*One-ban<\/h2>\n<p>\nVan egy eredeti t\u00e1bl\u00e1zatunk f\u00e9nyk\u00e9pekkel, ahol a bejegyz\u00e9s azonos\u00edt\u00f3ja az els\u0151dleges kulcs. <\/p>\n<p><img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/9f5d7c5f66882666a7ae8219f710beeb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA C*One indexhez egy \u00faj t\u00e1bl\u00e1t hoz l\u00e9tre, amely az eredeti m\u00e1solata. A kulcs megegyezik az indexkifejez\u00e9ssel, \u00e9s ebbe a kulcsba m\u00e9g az eredeti t\u00e1bl\u00e1zat bejegyz\u00e9s\u00e9nek els\u0151dleges kulcsa is beletartozik:<\/p>\n<p><img decoding=\"async\" alt=\"NewSQL = NoSQL+ACID\" src=\"\/wp-content\/uploads\/2019\/09\/ce6df1c8407bca7ddc61fd88141455e6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMost m\u00e1r a \u201etulajdonos az utols\u00f3 24 \u00f3r\u00e1ban\u201d lek\u00e9rdez\u00e9st \u00e1t\u00edrhatjuk egy m\u00e1sik t\u00e1bl\u00e1b\u00f3l sz\u00e1rmaz\u00f3 select-re:<\/p>\n<pre><code>SELECT * FROM i1_test\nWHERE owner=?\nAND modified&gt;?<\/code><\/pre>\n<p>\nA photos alaptabla \u00e9s az indexelt i1 t\u00e1bl\u00e1k adatinak konzisztenci\u00e1j\u00e1t automatikusan a koordin\u00e1tor tartja fenn. Csak az adatmodell alapj\u00e1n, amikor v\u00e1ltoz\u00e1st \u00e9szlel, a koordin\u00e1tor nemcsak a f\u0151 t\u00e1bla v\u00e1ltoz\u00e1sait gener\u00e1lja \u00e9s t\u00e1rolja, hanem a m\u00e1solatok v\u00e1ltoz\u00e1sait is. Nincsenek tov\u00e1bbi m\u0171veletek az index t\u00e1bl\u00e1n, a napl\u00f3z\u00e1s nem t\u00f6rt\u00e9nik, z\u00e1rol\u00e1sok nem haszn\u00e1latosak. Ez\u00e9rt az indexek hozz\u00e1ad\u00e1sa szinte nem fogyaszt er\u0151forr\u00e1st \u00e9s gyakorlatilag nem befoly\u00e1solja a m\u00f3dos\u00edt\u00e1sok v\u00e9grehajt\u00e1s\u00e1nak sebess\u00e9g\u00e9t.<\/p>\n<p>Az ACID seg\u00edts\u00e9g\u00e9vel val\u00f3s\u00edtottuk meg az indexeket \u201emint a SQL\u201d-ben. Ezek konzisztens, sk\u00e1l\u00e1zhat\u00f3k, gyorsan m\u0171k\u00f6dnek, lehetnek \u00f6sszetettek \u00e9s bele\u00e9p\u00edtettek a CQL lek\u00e9rdez\u00e9si nyelvbe. Az indexek t\u00e1mogat\u00e1s\u00e1hoz nem sz\u00fcks\u00e9ges a alkalmaz\u00e1s k\u00f3d m\u00f3dos\u00edt\u00e1sa. Minden egyszer\u0171, mint a SQL. \u00c9s ami a legfontosabb, az indexek nem befoly\u00e1solj\u00e1k a tranzakci\u00f3s f\u0151t\u00e1bla m\u00f3dos\u00edt\u00e1sainak v\u00e9grehajt\u00e1si sebess\u00e9g\u00e9t.<\/p>\n<h2>Mi lett az eredm\u00e9ny<\/h2>\n<p>\nH\u00e1rom \u00e9ve fejlesztett\u00fck ki a C*One-t, \u00e9s ind\u00edtottuk el ipari haszn\u00e1latra. <\/p>\n<p>Mit nyert\u00fcnk v\u00e9g\u00fcl? N\u00e9zz\u00fck meg ezt a f\u00e9nyk\u00e9pek feldolgoz\u00e1si \u00e9s t\u00e1rol\u00e1si alrendszer p\u00e9ld\u00e1j\u00e1n kereszt\u00fcl, amely a legfontosabb adat t\u00edpusa a k\u00f6z\u00f6ss\u00e9gi h\u00e1l\u00f3zatban. Nem maguknak a f\u00e9nyk\u00e9peknek a test\u00e9r\u0151l van sz\u00f3, hanem a k\u00fcl\u00f6nb\u00f6z\u0151 metaadatokr\u00f3l. Jelenleg az \u201eOszt\u00e1lyt\u00e1rsakban\u201d k\u00f6r\u00fclbel\u00fcl 20 milli\u00e1rd ilyen bejegyz\u00e9s tal\u00e1lhat\u00f3, a rendszer m\u00e1sodpercenk\u00e9nt 80 ezer olvas\u00e1si k\u00e9r\u00e9st, 8 ezer ACID-tranzakci\u00f3t kezel, amelyek adatok m\u00f3dos\u00edt\u00e1s\u00e1hoz kapcsol\u00f3dnak. <\/p>\n<p>Amikor SQL-t haszn\u00e1ltunk replication factor = 1 (de RAID 10-ben), a f\u00e9nyk\u00e9pek metaadatai egy 32 g\u00e9pb\u0151l \u00e1ll\u00f3, Microsoft SQL Serverrel rendelkez\u0151, nagy rendelkez\u00e9sre \u00e1ll\u00e1s\u00fa klaszterben t\u00e1rol\u00f3dtak (plusz 11 tartal\u00e9k). 10 szerver k\u00fcl\u00f6n\u00fclt el biztons\u00e1gi m\u00e1solatok t\u00e1rol\u00e1s\u00e1ra. \u00d6sszesen 50 dr\u00e1ga g\u00e9p volt. A rendszer ek\u00f6zben n\u00e9vleges terhel\u00e9ssel m\u0171k\u00f6d\u00f6tt, tartal\u00e9kok n\u00e9lk\u00fcl.<\/p>\n<p>Az \u00faj rendszerre val\u00f3 migr\u00e1l\u00e1s ut\u00e1n replication factor = 3-at kaptunk \u2014 m\u00e1solat minden adatk\u00f6zpontban. A rendszer 63 Cassandra t\u00e1rol\u00f3 nodb\u00f3l \u00e9s 6 koordin\u00e1l\u00f3 g\u00e9pb\u0151l \u00e1ll, \u00f6sszesen 69 szerver. De ezek a g\u00e9pek jelent\u0151sen olcs\u00f3bbak, \u00f6sszes k\u00f6lts\u00e9g\u00fck k\u00f6r\u00fclbel\u00fcl 30%-a a SQL-re \u00e9p\u00fcl\u0151 rendszer\u00e9nek.<\/p>\n<p>A C*One bevezet\u00e9s\u00e9vel cs\u00f6kkentek a k\u00e9s\u00e9sek is: az SQL \u00edr\u00e1si m\u0171velete 4,5 ms k\u00f6r\u00fcli id\u0151t vett ig\u00e9nybe. A C*One eset\u00e9ben ez k\u00f6r\u00fclbel\u00fcl 1,6 ms. A tranzakci\u00f3k \u00e1tlagos hossza kevesebb mint 40 ms, a k\u00f6telez\u0151 commit 2 ms alatt zajlik, az olvas\u00e1s \u00e9s \u00edr\u00e1s hossza \u00e1tlagosan 2 ms. A 99. percentilis mind\u00f6ssze 3-3,1 ms, az id\u0151korl\u00e1tok sz\u00e1ma 100-szoros cs\u00f6kken\u00e9sen ment kereszt\u00fcl - mindez a spekul\u00e1ci\u00f3k sz\u00e9les k\u00f6r\u0171 alkalmaz\u00e1s\u00e1nak k\u00f6sz\u00f6nhet\u0151. <\/p>\n<p>Jelen pillanatban a SQL Server csom\u00f3pontok jelent\u0151s r\u00e9sze m\u00e1r ki van vonva a termel\u00e9sb\u0151l, az \u00faj term\u00e9kek csak a C*One haszn\u00e1lat\u00e1val k\u00e9sz\u00fclnek. A C*One-t az felh\u0151nkkel val\u00f3 egy\u00fcttm\u0171k\u00f6d\u00e9shez alak\u00edtottuk \u00e1t. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/odnoklassniki\/blog\/346868\/\">one-cloud<\/a><\/noindex>, amely lehet\u0151v\u00e9 tette az \u00faj klaszterek gyorsabb telep\u00edt\u00e9s\u00e9t, a konfigur\u00e1ci\u00f3 egyszer\u0171s\u00edt\u00e9s\u00e9t \u00e9s a m\u0171k\u00f6d\u00e9s automatiz\u00e1l\u00e1s\u00e1t. Az alapforr\u00e1sk\u00f3d n\u00e9lk\u00fcl ez jelent\u0151sen nehezebb \u00e9s bonyolultabb lett volna. <\/p>\n<p>Jelenleg m\u00e1s adatt\u00e1rol\u00f3ink felh\u0151be val\u00f3 \u00e1thelyez\u00e9s\u00e9n dolgozunk - de ez m\u00e1r egy teljesen m\u00e1sik t\u00f6rt\u00e9net.<br \/>\n<br \/>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/odnoklassniki\/blog\/417593\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0414\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u043e\u043a\u043e\u043b\u043e 50 \u0422\u0411 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0445\u0440\u0430\u043d\u0438\u043b\u043e\u0441\u044c \u0432 SQL Server. \u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439, \u0434\u0430 \u0435\u0449\u0435 \u0438 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a \u043e\u0442\u043a\u0430\u0437\u0443 \u0426\u041e\u0414 \u0434\u043e\u0441\u0442\u0443\u043f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f SQL \u0421\u0423\u0411\u0414, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0434\u043d\u043e \u0438\u0437 NoSQL-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449, \u043d\u043e \u043d\u0435 \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432 NoSQL: \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28484,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37956","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0414\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u043e\u043a\u043e\u043b\u043e 50 \u0422\u0411 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/newsql-nosql-acid\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47NewSQL = NoSQL+ACID | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0414\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u043e\u043a\u043e\u043b\u043e 50 \u0422\u0411 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/newsql-nosql-acid\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:20:47+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:20:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47NewSQL = NoSQL+ACID | ProHoster","description":"Nemr\u00e9g m\u00e9g k\u00f6r\u00fclbel\u00fcl 50 TB adatot dolgoztunk fel az Odnoklassnikiben.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/newsql-nosql-acid","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47NewSQL = NoSQL+ACID | ProHoster","og:description":"\u0414\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u043e\u043a\u043e\u043b\u043e 50 \u0422\u0411 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/newsql-nosql-acid","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:20:47+00:00","article:modified_time":"2019-10-31T19:20:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37956","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 19:55:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:17:23","updated":"2026-01-23 19:55:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/37956","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=37956"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/37956\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/28484"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=37956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=37956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=37956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}