{"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\/lv\/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 \/>\nL\u012bdz nesenam laikam soci\u0101l\u0101 t\u012bkla Odnoklassniki ir uzkr\u0101ti ap 50 TB datu, ko apstr\u0101d\u0101 re\u0101llaik\u0101 SQL Server. \u0160\u0101da apjoma \u0101tras un uzticamas, k\u0101 ar\u012b k\u013c\u016bdu notur\u012bgas datu centra piek\u013cuves nodro\u0161in\u0101\u0161ana, izmantojot SQL DB, ir praktiski neiesp\u0113jama. Parasti \u0161\u0101dos gad\u012bjumos izmanto vienu no NoSQL glab\u0101tuv\u0113m, ta\u010du ne viss var tikt p\u0101rnests uz NoSQL: da\u017ei objekti prasa ACID transakciju garantijas. <\/p>\n<p>Tas noveda pie l\u0113muma izmantot NewSQL glab\u0101tuvi, proti, datu b\u0101zi, kas nodro\u0161ina k\u013c\u016bdu notur\u012bbu, m\u0113rogojam\u012bbu un \u0101trdarb\u012bbu, ko pied\u0101v\u0101 NoSQL sist\u0113mas, bet skaidri saglab\u0101 klasisko sist\u0113mu ACID garantijas. Vairums \u0161\u012b jaun\u0101 klases ra\u017eo\u0161anas sist\u0113mu ir maz, t\u0101p\u0113c m\u0113s izstr\u0101d\u0101j\u0101m t\u0101du pa\u0161i un palaid\u0101m to ra\u017eo\u0161anas vid\u0113. <\/p>\n<p>K\u0101 tas darbojas un k\u0101di rezult\u0101ti ir sasniegti \u2013 lasi zem\u0101k.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n\u0160odien m\u0113ne\u0161a auditorija \u00abOdnoklassniki\u00bb p\u0101rsniedz 70 miljonus unik\u0101lu apmekl\u0113t\u0101ju. M\u0113s <noindex><a rel=\"nofollow\" href=\"https:\/\/www.similarweb.com\/top-websites\/category\/internet-and-telecom\/social-network\">esam vieni no piec\u0101m<\/a><\/noindex> liel\u0101kaj\u0101m soci\u0101lo t\u012bklu platform\u0101m pasaul\u0113 un twidzot zem\u0101kaj\u0101m 20 m\u0101jaslap\u0101m, kur\u0101s lietot\u0101ji pavada visvair\u0101k laika. \u00abOK\u00bb infrastrukt\u016bra apstr\u0101d\u0101 \u013coti augstu slodzi: vair\u0101k nek\u0101 miljonu HTTP piepras\u012bjumu\/s uz punktiem. Da\u013ca serveru parka, kas sast\u0101v vair\u0101k nek\u0101 no 8000 serveriem, ir izvietota tuv\u0101k viens otram \u2013 \u010detru Maskavas datu centros, kas \u013cauj nodro\u0161in\u0101t t\u012bkla kav\u0113\u0161anos maz\u0101k par 1 ms starp tiem.<\/p>\n<p>M\u0113s izmantojam Cassandra kop\u0161 2010. gada, s\u0101kot ar 0.6 versiju. \u0160odien ekspluat\u0101cij\u0101 ir vair\u0101kas desmiti klasteru. Visstrauj\u0101kais klasteris apstr\u0101d\u0101 vair\u0101k nek\u0101 4 miljonus darb\u012bbu sekund\u0113, bet liel\u0101kais glab\u0101 260 TB. <\/p>\n<p>Tom\u0113r tas viss ir parasti NoSQL klasteri, kas tiek izmantoti v\u0101j\u0101s saska\u0146ot\u012bbas datu glab\u0101\u0161anai. <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\">Mums tom\u0113r grib\u0113j\u0101s aizst\u0101t galveno saska\u0146oto glab\u0101tuvi, Microsoft SQL Server, kas tika izmantots kop\u0161 \u00abOdnoklassniki\u00bb dibin\u0101\u0161anas. \u0160\u012b glab\u0101tuve sast\u0101v\u0113ja no vair\u0101k nek\u0101 300 SQL Server Standard Edition ma\u0161\u012bn\u0101m, uz kur\u0101m bija glab\u0101ti 50 TB datu \u2013 biznesa objekti. \u0160ie dati tiek modific\u0113ti ACID transakciju ietvaros un prasa<\/a><\/noindex> augstu saska\u0146ot\u012bbu. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">Lai sadal\u012btu datus pa SQL Server mezgliem, m\u0113s izmantoj\u0101m gan vertik\u0101lo, gan horizont\u0101lo<\/a><\/noindex>.<\/p>\n<p>particion\u0113\u0161anu. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Partition_(database)\">particion\u0113\u0161ana<\/a><\/noindex> (sharding). V\u0113sturiski m\u0113s esam izmantoju\u0161i vienk\u0101r\u0161u datu \u0161ard\u0113\u0161anas sh\u0113mu: katrai ent\u012btijai tika pie\u0161\u0137irts tokens \u2014 funkcija, kas \u0146em ID ent\u012btijas. Ent\u012btijas ar vienu un to pa\u0161u token tika novietotas vien\u0101 SQL server\u012b. Master-detail attiec\u012bbas tika \u012bstenotas t\u0101, lai galven\u0101s un izrieto\u0161\u0101s ierakstu tokeni vienm\u0113r sakristu un atrastos vien\u0101 server\u012b. Soci\u0101l\u0101s t\u012bklos gandr\u012bz visi ieraksti tiek rad\u012bti lietot\u0101ja v\u0101rd\u0101 \u2014 tas noz\u012bm\u0113, ka visi lietot\u0101ja dati vien\u0101 funkcion\u0101l\u0101 apak\u0161sist\u0113m\u0101 tiek glab\u0101ti vien\u0101 server\u012b. Tas noz\u012bm\u0113, ka biznesa dar\u012bjumos gandr\u012bz vienm\u0113r piedal\u012bj\u0101s tabulas no viena SQL servera, kas nodro\u0161in\u0101ja datu konsekvenci, izmantojot lok\u0101las ACID dar\u012bjumu, bez nepiecie\u0161am\u012bbas izmantot <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Two-phase_commit_protocol\">l\u0113nus un negod\u012bgus<\/a><\/noindex> izplat\u012btos ACID dar\u012bjumus.<\/p>\n<p>Pateicoties \u0161ard\u0113\u0161anai, un, lai pa\u0101trin\u0101tu SQL darb\u012bbu:<\/p>\n<ul>\n<li>Neizmantojam Foreign key ierobe\u017eojumus, jo pie \u0161ard\u0113\u0161anas ent\u012btijas ID var atrasties cit\u0101 server\u012b.<\/li>\n<li>Neizmantojam glab\u0101tas proced\u016bras un trigerus, jo tas rada papildu slodzi uz DBMS CPU.<\/li>\n<li>Neizmantojam JOINs, \u0146emot v\u0113r\u0101 visu iepriek\u0161 min\u0113to un daudzus nejau\u0161us las\u012bjumus no diska.<\/li>\n<li>\u0100rpus dar\u012bjuma, lai samazin\u0101tu mirk\u013cu blo\u0137\u0113\u0161anu, izmantojam Read Uncommitted izol\u0101cijas l\u012bmeni.<\/li>\n<li>Izpild\u0101m tikai \u012bsus dar\u012bjumus (vid\u0113ji \u012bs\u0101ki par 100 ms).<\/li>\n<li>Neizmantojam vair\u0101ku rindu UPDATE un DELETE d\u0113\u013c liel\u0101 skaita mirk\u013cu blo\u0137\u0113\u0161anas \u2014 atjaunojam tikai vienu ierakstu.<\/li>\n<li>Vaic\u0101jumus vienm\u0113r izpild\u0101m tikai p\u0113c indeksam \u2014 vaic\u0101jums ar visaptvero\u0161u tabulas skat\u012bjumu noz\u012bm\u0113 datu b\u0101zes p\u0101rslodzi un t\u0101s atteik\u0161anos.<\/li>\n<\/ul>\n<p>\n\u0160ie so\u013ci \u013c\u0101va izspiest no SQL serveriem gandr\u012bz maksim\u0101lu veiktsp\u0113ju. Tom\u0113r probl\u0113mu k\u013cuva arvien vair\u0101k. Apskat\u012bsim t\u0101s.<\/p>\n<h2>SQL probl\u0113mas<\/h2>\n<p><\/p>\n<ul>\n<li>T\u0101 k\u0101 m\u0113s izmantoj\u0101m pa\u0161izstr\u0101d\u0101tu \u0161ard\u0113\u0161anu, jaunu shardu pievieno\u0161ana tika veikta manu\u0101li ar administratoriem. Viss \u0161o laiku m\u0113rogojamie datu kopijas neveica piepras\u012bjumus. <\/li>\n<li>Pieaugot ierakstu skaitam tabul\u0101, samazin\u0101s ievieto\u0161anas un modific\u0113\u0161anas \u0101trums; pievienojot indeksus eso\u0161ajai tabulai, \u0101trums krasi samazin\u0101s, indeksu izveide un rekonstrukcija notiek ar d\u012bkst\u0101vi.<\/li>\n<li>Neliel\u0101 Windows SQL Server skaita esam\u012bba ra\u017eo\u0161anas vid\u0113 apgr\u016btina infrastrukt\u016bras p\u0101rvald\u012bbu.<\/li>\n<\/ul>\n<p>\nBet galven\u0101 probl\u0113ma \u2014 <\/p>\n<h2>Izmaksu notur\u012bba<\/h2>\n<p>\nKlasiskajam SQL serverim ir slikta dro\u0161\u012bba pret k\u013c\u016bd\u0101m. Pie\u0146emiet, ka jums ir tikai viens datu b\u0101zes serveris, un tas k\u013c\u016bst nelietojams reizi trijos gados. \u0160aj\u0101 laik\u0101 m\u0101jas lapa nedarbojas 20 min\u016btes, kas ir pie\u0146emami. Ja jums ir 64 serveri, tad m\u0101jas lapa nedarbojas jau reizi trij\u0101s ned\u0113\u013c\u0101s. Un, ja jums ir 200 serveri, tad m\u0101jas lapa nedarbojas katru ned\u0113\u013cu. Tas ir probl\u0113ma. <\/p>\n<p>Ko var dar\u012bt, lai palielin\u0101tu SQL servera dro\u0161\u012bbu pret k\u013c\u016bd\u0101m? Vikip\u0113dija mums pied\u0101v\u0101 izveidot <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/High-availability_cluster\">augst\u0101k pieejamu klasteri<\/a><\/noindex>: kur, ja k\u0101da no sast\u0101vda\u013c\u0101m k\u013c\u016bst nelietojama, ir dubl\u0113jo\u0161a.<\/p>\n<p>Tas prasa d\u0101rga apr\u012bkojuma parku: daudz dubl\u0113\u0161an\u0101s, \u0161\u0137iedru optiku, koplieto\u0161anas kr\u0101tuves, un rezerves iesl\u0113g\u0161ana darbojas nedro\u0161i: apm\u0113ram 10% iesl\u0113g\u0161anas gad\u012bjumu beidzas ar rezerves mezgla neizdo\u0161anos, k\u0101 galven\u0101 mezgla apvienojum\u0101. <\/p>\n<p>Bet galven\u0101 tr\u016bkuma \u0161\u0101dam augst\u0101k pieejamam klasterim ir nulle pieejam\u012bba, ja k\u013c\u016bst nelietojams datu centrs, kur\u0101 tas atrodas. \u00abOdnoklassniki\u00bb ir \u010detri datu centri, un mums ir nepiecie\u0161ams nodro\u0161in\u0101t darb\u012bbu, kad vien\u0101 no tiem iest\u0101jas piln\u012bga av\u0101rija.<\/p>\n<p>Lai to izdar\u012btu, var\u0113tu izmantot <noindex><a rel=\"nofollow\" href=\"https:\/\/technet.microsoft.com\/en-us\/library\/ms151196.aspx\">Multi-Master<\/a><\/noindex> replik\u0101ciju, kas ir ieb\u016bv\u0113ta SQL Server. \u0160is risin\u0101jums ir daudz d\u0101rg\u0101ks d\u0113\u013c programmat\u016bras izmaks\u0101m un cie\u0161 no labi zin\u0101m\u0101m probl\u0113m\u0101m ar replik\u0101ciju \u2014 neparedzamiem transakciju aizkav\u0113jumiem sinhron\u0101 replik\u0101cij\u0101 un aizkav\u0113jumiem replik\u0101ciju piem\u0113ro\u0161an\u0101 (un, k\u0101 secin\u0101jums, zaud\u0113t\u0101m modifik\u0101cij\u0101m) asimhronaj\u0101. Iespcie\u0161am\u0101s <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\">rokas konflikti<\/a><\/noindex> padara \u0161o variantu piln\u012bgi piem\u0113rojamam mums.<\/p>\n<p>Visas \u0161\u012bs probl\u0113mas pras\u012bja radik\u0101lu risin\u0101jumu, un m\u0113s s\u0101k\u0101m detaliz\u0113tu anal\u012bzi. \u0160eit mums j\u0101saprot, ko galvenok\u0101rt veic SQL Server \u2014 transakcijas.<\/p>\n<h2>Vienk\u0101r\u0161a transakcija<\/h2>\n<p>\nApskat\u012bsim vienk\u0101r\u0161\u0101ko, no pielietojam\u0101 SQL programmista viedok\u013ca, transakciju: fotoatt\u0113la pievieno\u0161ana albumam. Albumi un fotoatt\u0113li tiek glab\u0101ti da\u017e\u0101d\u0101s tabul\u0101s. Albumam ir publisko fotoatt\u0113lu skait\u012bt\u0101js. T\u0101d\u0113j\u0101di \u0161\u012b transakcija tiek sadal\u012bta sekojo\u0161os so\u013cos: <\/p>\n<ol>\n<li>Blo\u0137\u0113jam albumu p\u0113c atsl\u0113gas.<\/li>\n<li>Izveidojam ierakstu fotoatt\u0113lu tabul\u0101. <\/li>\n<li>Ja fotoatt\u0113lam ir publisks statuss, tad palielin\u0101m album\u0101 publisko fotoatt\u0113lu skait\u012bt\u0101ju, atjaunin\u0101m ierakstu un apstiprin\u0101m transakciju.<\/li>\n<\/ol>\n<p>\nVai ar\u012b pseido kod\u0101:<\/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>\nM\u0113s redzam, ka visizplat\u012bt\u0101kais biznesa dar\u012bjumu scen\u0101rijs ir izlas\u012bt datus no datub\u0101zes un iel\u0101d\u0113t tos lietojumservera atmi\u0146\u0101, veikt izmai\u0146as un saglab\u0101t jaun\u0101s v\u0113rt\u012bbas atpaka\u013c datub\u0101z\u0113. Parasti \u0161\u0101d\u0101 dar\u012bjum\u0101 m\u0113s atjaunin\u0101m vair\u0101kas entit\u0101tes, vair\u0101kas tabulas. <\/p>\n<p>Transaction executing var notikt konkur\u0113jo\u0161a modifik\u0101cija tiem pa\u0161iem datiem no cita sist\u0113mas. Piem\u0113ram, pretspams var izlemt, ka lietot\u0101js ir aizdom\u012bgs, un t\u0101p\u0113c visas lietot\u0101ja bildes vairs nedr\u012bkst b\u016bt publiskas, t\u0101s ir j\u0101nos\u016bta moder\u0101cijai, t\u0101d\u0113j\u0101di j\u0101maina photo.status uz citu v\u0113rt\u012bbu un j\u0101atgrie\u017e attiec\u012bgie skait\u012bt\u0101ji. Ac\u012bmredzami, ka, ja \u0161\u012b oper\u0101cija notiks bez atomiskuma un konkur\u0113jo\u0161o modifik\u0101ciju izol\u0101cijas garantij\u0101m, tad rezult\u0101ts neb\u016bs t\u0101ds, k\u0101ds nepiecie\u0161ams \u2014 vai nu foto skait\u012bt\u0101js r\u0101d\u012bs nepareizu v\u0113rt\u012bbu, vai ar\u012b ne visas bildes tiks nos\u016bt\u012btas moder\u0101cijai. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ACID\">ACID<\/a><\/noindex>, tad rezult\u0101ts neb\u016bs t\u0101ds, k\u0101 vajadz\u012bgs \u2014 vai nu foto skait\u012bt\u0101js r\u0101d\u012bs nepareizu v\u0113rt\u012bbu, vai ar\u012b ne visas bildes tiks nos\u016bt\u012btas moder\u0101cijai. <\/p>\n<p>T\u0101da veida kods, kas manipul\u0113 ar da\u017e\u0101d\u0101m biznesa entit\u0101t\u0113m vien\u0101 dar\u012bjum\u0101, ir rakst\u012bts \u013coti daudz laik\u0101, kad past\u0101v\u0113ja Odnoklassniki. Tom\u0113r, \u0146emot v\u0113r\u0101 migr\u0101ciju uz NoSQL, <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">Gaid\u0101m\u0101 konsekvence<\/a><\/noindex> m\u0113s zin\u0101m, ka visliel\u0101k\u0101s gr\u016bt\u012bbas (un laika izmaksas) rodas, kad j\u0101izstr\u0101d\u0101 kods, kas v\u0113rsts uz datu konsekvences uztur\u0113\u0161anu. T\u0101d\u0113\u013c galvenais pras\u012bba jaunai uzglab\u0101\u0161anas sist\u0113mai bija nodro\u0161in\u0101t patieso ACID dar\u012bjumu atbalstu lietojumlo\u0123ikai. <\/p>\n<p>Citas, ne maz\u0101k svar\u012bgas pras\u012bbas bija:<\/p>\n<ul>\n<li>Datacentra atteikuma gad\u012bjum\u0101 ir j\u0101b\u016bt pieejamiem gan las\u012b\u0161anai, gan rakst\u012b\u0161anai jaunaj\u0101 uzglab\u0101\u0161anas sist\u0113m\u0101.<\/li>\n<li>J\u0101nodro\u0161ina eso\u0161\u0101s izstr\u0101des \u0101trums. Tas ir, str\u0101d\u0101jot ar jauno uzglab\u0101\u0161anas sist\u0113mu, koda apjomam j\u0101b\u016bt aptuveni t\u0101dam pa\u0161am, nevajadz\u0113tu rasties vajadz\u012bbai rakst\u012bt kaut ko jaunu uzglab\u0101\u0161anai, izstr\u0101d\u0101t konfliktu risin\u0101\u0161anas algoritmus, sekun\u0123u indeksu uztur\u0113\u0161anu utt. <\/li>\n<li>Jaun\u0101s uzglab\u0101\u0161anas sist\u0113mas darba \u0101trumam j\u0101b\u016bt pietiekami augstam, gan lasot datus, gan apstr\u0101d\u0101jot dar\u012bjumus, kas efekt\u012bvi noz\u012bm\u0113 akad\u0113miski stingru, visp\u0101r\u0113ju, bet l\u0113nu risin\u0101jumu piem\u0113ro\u0161anas neiesp\u0113jam\u012bbu, k\u0101, piem\u0113ram, <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Two-phase_commit_protocol\">divf\u0101\u017eu apstiprin\u0101jumus<\/a><\/noindex>.<\/li>\n<li>Autom\u0101tiska m\u0113rogo\u0161ana re\u0101l\u0101 laik\u0101. <\/li>\n<li>Parasto l\u0113to serveru izmanto\u0161ana, bez nepiecie\u0161am\u012bbas ieg\u0101d\u0101ties eksotiskas iek\u0101rtas. <\/li>\n<li>Iesp\u0113ja papla\u0161in\u0101t kr\u0101tuvi uz\u0146\u0113muma izstr\u0101d\u0101t\u0101ju sp\u0113kiem. Citiem v\u0101rdiem sakot, priorit\u0101te tika pie\u0161\u0137irta saviem vai atv\u0113rt\u0101 koda risin\u0101jumiem, v\u0113lams, uz Java b\u0101zes.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Risin\u0101jumi, risin\u0101jumi<\/h2>\n<p>\nAnaliz\u0113jot iesp\u0113jamos risin\u0101jumus, m\u0113s non\u0101c\u0101m pie div\u0101m iesp\u0113j\u0101m arhitekt\u016bras izv\u0113l\u0113:<\/p>\n<p>Pirmais \u2014 \u0146emt jebkuru SQL serveri un \u012bstenot nepiecie\u0161amo p\u0101rr\u0101vuma notur\u012bbu, m\u0113rogo\u0161anas meh\u0101nismu, p\u0101rr\u0101vuma notur\u012bgu klasteri, konfliktu risin\u0101\u0161anu un izplat\u012btas, uzticamas un \u0101tras ACID transakcijas. M\u0113s nov\u0113rt\u0113j\u0101m \u0161o variantu k\u0101 diezgan netradicion\u0101lu un laikietilp\u012bgu.<\/p>\n<p>Otrais variants \u2014 \u0146emt gatavu NoSQL kr\u0101tuvi ar \u012bstenotu m\u0113rogo\u0161anu, p\u0101rr\u0101vuma notur\u012bgu klasteri, konfliktu risin\u0101\u0161anu un realiz\u0113t transakcijas un SQL pa\u0161i. Pirmaj\u0101 mirkl\u012b pat SQL realiz\u0113\u0161anas uzdevums, nerun\u0101jot par ACID transakcij\u0101m, izskat\u0101s k\u0101 ilgs darbs. Bet tad m\u0113s saprat\u0101m, ka SQL iesp\u0113ju komplekts, ko m\u0113s izmantojam praks\u0113, ir t\u0101lu no ANSI SQL, tikpat t\u0101lu k\u0101 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Apache_Cassandra#Cassandra_Query_Language\">Cassandra CQL<\/a><\/noindex> t\u0101lu no ANSI SQL. P\u0113tot CQL tuv\u0101k, m\u0113s saprat\u0101m, ka tas ir pietiekami tuvs tam, kas mums nepiecie\u0161ams.<\/p>\n<h2>Cassandra un CQL<\/h2>\n<p>\nT\u0101tad, kas ir interesants par Cassandra, k\u0101das iesp\u0113jas tai ir?<\/p>\n<p>Pirmk\u0101rt, \u0161eit var izveidot tabulas, kas atbalsta da\u017e\u0101da veida datus, var veikt SELECT vai UPDATE p\u0113c prim\u0101r\u0101 atsl\u0113ga.<\/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>\nLai nodro\u0161in\u0101tu datu saska\u0146ot\u012bbu replik\u0101s, Cassandra izmanto <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Quorum_(distributed_computing)\">kvorum\u0101lo pieeju<\/a><\/noindex>. Vienk\u0101r\u0161\u0101kaj\u0101 gad\u012bjum\u0101 tas noz\u012bm\u0113, ka, ievietojot tr\u012bs viena un t\u0101 pa\u0161a rinda replikas da\u017e\u0101d\u0101s klastera noda\u013c\u0101s, ieraksts tiek uzskat\u012bts par veiksm\u012bgu, ja liel\u0101k\u0101 da\u013ca noda\u013cu (t.i., divas no trim) apstiprina \u0161\u012bs ierakst\u012b\u0161anas oper\u0101cijas veiksm\u012bgumu. Rinda tiek uzskat\u012bta par konsekventu, ja, veicot las\u012b\u0161anu, liel\u0101k\u0101 da\u013ca noda\u013cu tika aptauj\u0101ta un t\u0101s to apstiprin\u0101ja. T\u0101d\u0113j\u0101di, ja ir tr\u012bs replikas, tiek garant\u0113ta piln\u012bga un nekav\u0113jo\u0161a datu konsekvenca vienas noda\u013cas izn\u012bk\u0161anas gad\u012bjum\u0101. \u0160\u0101da pieeja \u013c\u0101va mums ieviest v\u0113l dro\u0161\u0101ku sh\u0113mu: vienm\u0113r nos\u016bt\u012bt piepras\u012bjumus vis\u0101m trim replik\u0101m, gaidot atbildi no div\u0101m \u0101tr\u0101kaj\u0101m. Nov\u0113lota tre\u0161\u0101s replikas atbilde \u0161aj\u0101 gad\u012bjum\u0101 tiek noraid\u012bta. Nov\u0113lotai atbildei no noda\u013cas var b\u016bt nopietnas probl\u0113mas \u2014 kav\u0113\u0161an\u0101s, garbage collection JVM, direct memory reclaim linux kernel, aparat\u016bras k\u013c\u016bme, atsl\u0113g\u0161an\u0101s no t\u012bkla. Tom\u0113r tas nek\u0101di neietekm\u0113 klienta darb\u012bbas un datus.<\/p>\n<p>Pieeja, kur\u0101 m\u0113s piek\u013c\u016bstam trim noda\u013c\u0101m un sa\u0146emam atbildi no div\u0101m, tiek d\u0113v\u0113ta par <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Speculative_execution\">specul\u0101ciju<\/a><\/noindex>: piepras\u012bjums uz liekaj\u0101m replik\u0101m tiek nos\u016bt\u012bts v\u0113l pirms t\u0101s \u00abatvairs nav\u00bb. <\/p>\n<p>V\u0113l viens no Cassandra priek\u0161roc\u012bb\u0101m ir Batchlog \u2014 meh\u0101nisms, kas garant\u0113 vai nu piln\u012bgu izpildi, vai piln\u012bgu neizpildi j\u016bsu izmai\u0146u paketei. Tas \u013cauj mums risin\u0101t A ACID \u2014 atomiskumu no kastes.<\/p>\n<p>Vislab\u0101k\u0101 pieeja transakcij\u0101m Cassandra ir t\u0101 sauktais &#171;<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.datastax.com\/en\/cql\/3.3\/cql\/cql_using\/useInsertLWT.html\">vieglie dar\u012bjumi<\/a><\/noindex>&#171;. Tom\u0113r t\u0101s ir t\u0101lu no \u201e\u012bst\u0101m\u201d ACID transakcij\u0101m: faktisk\u0101 iesp\u0113ja veikt <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Compare-and-swap\">CAS<\/a><\/noindex> uz datiem tikai vienam ierakstam, izmantojot konsensu smag\u0101 protokola Paxos ietvaros. T\u0101d\u0113\u013c \u0161\u0101du dar\u012bjumu \u0101trums nav liels. <\/p>\n<h2>Ko mums tr\u016bka Cassandra<\/h2>\n<p>\nT\u0101tad, mums bija j\u0101paveic \u012bstas ACID dar\u012bjumu realiz\u0101cija Cassandra. Ar kuru pal\u012bdz\u012bbu m\u0113s var\u0113tu viegli \u012bstenot divas citas \u0113rtas iesp\u0113jas klasiskaj\u0101m DBMS: konsekventus \u0101trus indeksus, kas \u013cautu mums veikt datu izg\u016b\u0161anu ne tikai p\u0113c prim\u0101r\u0101 atsl\u0113ga un parast\u0101 monotona autom\u0101tiska inkrement\u0101la ID \u0123eneratora.<\/p>\n<h4>C*One<\/h4>\n<p>\nT\u0101 tika rad\u012bta jauna DBMS <b>C*One<\/b>, kas sast\u0101v no trim servera noda\u013cu veidiem:<\/p>\n<ul>\n<li>Glab\u0101t\u0101ji \u2014 (gandr\u012bz) standarta Cassandra serveri, kas atbild par datu glab\u0101\u0161anu viet\u0113j\u0101s diskos. Pieaugot slodzei un datu apjomam, to skaitu ir viegli palielin\u0101t l\u012bdz desmitiem un simtiem.<\/li>\n<li>Transakciju koordinatori \u2014 nodro\u0161ina transakciju izpildi. <\/li>\n<li>Klienti \u2014 lietojumserveri, kas veic biznesa oper\u0101cijas un inici\u0113 transakcijas. \u0160\u0101du klientu var b\u016bt t\u016bksto\u0161iem.<\/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 \/>\nVisu veidu serveri ir da\u013ca no kop\u0113ja klastera, izmantojot iek\u0161\u0113jo zi\u0146ojumu protokolu Cassandra savstarp\u0113jai sazi\u0146ai un <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">gossip<\/a><\/noindex> lai apmain\u012btos ar klastera inform\u0101ciju. Ar Heartbeat serveri uzzina par savstarp\u0113j\u0101m av\u0101rij\u0101m, uztur vienotu datu sh\u0113mu \u2014 tabulas, to strukt\u016bru un replik\u0101ciju; nodal\u012bjuma sh\u0113mu, klastera topolo\u0123iju un tml.<\/p>\n<h4>Klienti<\/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 \/>\nTiek izmantots Fat Client re\u017e\u012bms, nevis standarta draiveri. \u0160\u0101ds mezgls neuzglab\u0101 datus, bet var darboties k\u0101 piepras\u012bjumu izpildes koordinators, proti, klients pats veic koordin\u0101cijas funkciju saviem piepras\u012bjumiem: jaut\u0101 glab\u0101t\u0101ju replik\u0101m un risina konfliktus. Tas ir ne tikai dro\u0161\u0101k un \u0101tr\u0101k nek\u0101 standarta draiveris, kas prasa sazi\u0146u ar att\u0101lu koordinatoru, bet ar\u012b \u013cauj kontrol\u0113t piepras\u012bjumu nodo\u0161anu. \u0100rpus uz klienta atv\u0113rtas transakcijas piepras\u012bjumi tiek virz\u012bti uz glab\u0101tav\u0101m. Ja klients ir atv\u0113ris transakciju, tad visi piepras\u012bjumi transakcijas ietvaros tiek virz\u012bti uz transakciju koordinatoru.<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 transakciju koordinators<\/h2>\n<p>\nKoordinators \u2014 tas, ko m\u0113s esam izstr\u0101d\u0101ju\u0161i C*One no nulles. Tas ir atbild\u012bgs par transakciju, blo\u0137\u0113\u0161anas un transakciju izpildes sec\u012bbas p\u0101rvald\u012bbu.<\/p>\n<p>Katrai apkalpotajai transakcijai koordinators \u0123ener\u0113 laika z\u012bmogu: katrs n\u0101kamais ir liel\u0101ks par iepriek\u0161\u0113jo transakciju. T\u0101 k\u0101 Cassandr\u0101 konfliktu risin\u0101\u0161anas sist\u0113ma balst\u0101s uz laika z\u012bmoga (no div\u0101m konflikt\u0113jo\u0161\u0101m ierakst\u0113m der\u012bga tiek uzskat\u012bta ar v\u0113l\u0101k laika z\u012bmogu), pretruna vienm\u0113r tiks atrisin\u0101ta par labu n\u0101kamajai transakcijai. T\u0101d\u0113j\u0101di m\u0113s esam \u012bstenoju\u0161i <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\">Lempatora pulkste\u0146us<\/a><\/noindex> \u2014 l\u0113ts veids, k\u0101 risin\u0101t konfliktus izplat\u012bt\u0101 sist\u0113m\u0101.<\/p>\n<h2>Blo\u0137\u0113\u0161anas<\/h2>\n<p>\nLai nodro\u0161in\u0101tu izol\u0101ciju, m\u0113s nol\u0113m\u0101m izmantot visvienk\u0101r\u0161\u0101ko veidu \u2014 pesimistisk\u0101s blo\u0137\u0113\u0161anas p\u0113c ieraksta prim\u0101r\u0101 atsl\u0113ga. Citiem v\u0101rdiem sakot, transakcij\u0101 ieraksts vispirms ir j\u0101blo\u0137\u0113, tikai tad j\u0101izlasa, j\u0101modific\u0113 un j\u0101glab\u0101. Tikai p\u0113c veiksm\u012bgas apstiprin\u0101\u0161anas ieraksts var tikt atblo\u0137\u0113ts, lai konkur\u0113jo\u0161\u0101s transakcijas var\u0113tu to izmantot.<\/p>\n<p>\u0160\u0101das blo\u0137\u0113\u0161anas \u012bsteno\u0161ana ir vienk\u0101r\u0161a neizplat\u012bt\u0101 vid\u0113. Izplat\u012bt\u0101 sist\u0113m\u0101 ir divi galvenie ce\u013ci: vai nu \u012bstenot izplat\u012btu blo\u0137\u0113\u0161anu klaster\u012b, vai ar\u012b sadal\u012bt transakcijas t\u0101, lai transakcijas, kur\u0101s iesaist\u012bta viena ieraksts, vienm\u0113r apkalpotu tas pats koordinators.<\/p>\n<p>T\u0101 k\u0101 m\u016bsu gad\u012bjum\u0101 dati jau ir izplat\u012bti pa grup\u0101m lok\u0101laj\u0101m transakcij\u0101m SQL, tika nolemts pie\u0161\u0137irt koordin\u0113t\u0101jiem grupu lok\u0101lo transakciju: viens koordinators veic visas transakcijas ar tokenu no 0 l\u012bdz 9, otrais - ar tokenu no 10 l\u012bdz 19, un t\u0101 t\u0101l\u0101k. Rezult\u0101t\u0101 katrs koordinators k\u013c\u016bst par transakciju grupas meistaru. <\/p>\n<p>T\u0101d\u0113j\u0101di blo\u0137\u0113\u0161anas var tikt \u012bstenotas k\u0101 element\u0101rs HashMap koordinatora atmi\u0146\u0101.<\/p>\n<h2>Koordinatoru atteikumi<\/h2>\n<p>\nT\u0101 k\u0101 viens koordinators ekskluz\u012bvi apkalpo transakciju grupu, ir \u013coti svar\u012bgi \u0101tri noteikt vi\u0146a atteikumu, lai atk\u0101rtota transakcijas izpilde iek\u013cautos laika limit\u0101. Lai to paveiktu \u0101tri un dro\u0161i, m\u0113s izmantoj\u0101m piln\u012bb\u0101 saist\u012btu kvoruma heartbeata protokolu:<\/p>\n<p>Katram datu centram j\u0101satur vismaz divas koordin\u0101cijas mezgli. Periodiski katrs koordinators nos\u016bta heartbeata zi\u0146ojumu p\u0101r\u0113jiem koordinatoriem un inform\u0113 vi\u0146us par savu darb\u012bbu, k\u0101 ar\u012b par to, no kuriem koordinatoriem vi\u0146\u0161 p\u0113d\u0113jo reizi bija sa\u0146\u0113mis heartbeata zi\u0146ojumus. <\/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 \/>\nSa\u0146emot l\u012bdz\u012bgu inform\u0101ciju no p\u0101r\u0113jiem vi\u0146u heartbeata zi\u0146ojumos, katrs koordinators izlemj, kuri klastera mezgli darbojas, bet kuri ne, vadoties p\u0113c kvoruma principa: ja mezgls X sa\u0146\u0113ma no liel\u0101k\u0101s da\u013cas mezglu klaster\u012b inform\u0101ciju par norm\u0101lu zi\u0146ojumu sa\u0146em\u0161anu no mezgla Y, tad Y darbojas. Un otr\u0101di, tikl\u012bdz liel\u0101k\u0101 da\u013ca pazi\u0146o par zi\u0146ojumu zudumu no mezgla Y, tas noz\u012bm\u0113, ka Y ir atteicis. Interesanti, ka, ja kvorums inform\u0113 mezglu X, ka vairs nesa\u0146em no t\u0101s zi\u0146ojumus, tas pats mezgls X uzskat\u012bs sevi par atteic\u0113ju.<\/p>\n<p>Heartbeat zi\u0146ojumi tiek izs\u016bt\u012bti ar lielu bie\u017eumu, aptuveni 20 reizes sekund\u0113, ar interv\u0101lu 50 ms. Java ir gr\u016bti nodro\u0161in\u0101t lietojumprogrammas atbildes laiku 50 ms d\u0113\u013c sal\u012bdzin\u0101m\u0101m pauz\u0113m, ko izraisa atkritumu sav\u0101c\u0113js. Mums izdev\u0101s sasniegt \u0161\u0101du atbildes laiku, izmantojot G1 atkritumu sav\u0101c\u0113ju, kas \u013cauj nor\u0101d\u012bt m\u0113r\u0137i par GC pau\u017eu ilgumu. Tom\u0113r da\u017ereiz, diezgan reti, atkritumu sav\u0101c\u0113ju pauzes p\u0101rsniedz 50 ms, kas var rad\u012bt nepatiesu sist\u0113mas darb\u012bbas trauc\u0113jumu atpaz\u012b\u0161anu. Lai tas nenotiktu, koordinators nezi\u0146o par att\u0101lin\u0101t\u0101s mezgla darb\u012bbas trauc\u0113jumiem pie pirm\u0101 heartbeat zi\u0146ojuma zuduma, tikai tad, ja tiek zaud\u0113ti vair\u0101ki p\u0113c k\u0101rtas. T\u0101d\u0113j\u0101di mums izdev\u0101s sasniegt koordin\u0113jo\u0161\u0101 mezgla darb\u012bbas trauc\u0113jumu atpaz\u012b\u0161anu 200 ms. <\/p>\n<p>Bet nav pietiekami \u0101tri saprast, kur\u0161 mezgls ir p\u0101rst\u0101jis darboties. J\u0101veic kaut kas \u0161aj\u0101 sakar\u0101. <\/p>\n<h2>Rezerv\u0113\u0161ana<\/h2>\n<p>\nKlasisk\u0101 sh\u0113ma paredz, ka, ja rastos galven\u0101 mezgla boj\u0101jums, tiek ieviests jauna mezgla v\u0113l\u0113\u0161anu process, izmantojot vienu no<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\"> modernajiem<\/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\">univers\u0101lajiem<\/a><\/noindex> algoritmiem. Tom\u0113r \u0161iem algoritmiem ir labi zin\u0101mas probl\u0113mas attiec\u012bb\u0101 uz konver\u0123enci laik\u0101 un pa\u0161as v\u0113l\u0113\u0161anu procesa ilgumu. \u0160\u0101das papildu aizkav\u0113\u0161an\u0101s mums izdev\u0101s izvair\u012bties, izmantojot koordin\u0101ciju aizvieto\u0161anas sh\u0113mu piln\u012bb\u0101 savienot\u0101 t\u012bkl\u0101:<\/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 \/>\nPie\u0146emsim, ka m\u0113s v\u0113lamies veikt dar\u012bjumu grup\u0101 50. Iepriek\u0161nosak\u0101m aizvieto\u0161anas sh\u0113mu, tas ir, kuri mezgli izpild\u012bs 50 grupas dar\u012bjumus galven\u0101 koordinatora neizdo\u0161an\u0101s gad\u012bjum\u0101. M\u016bsu m\u0113r\u0137is ir saglab\u0101t sist\u0113mas darb\u012bbu datu centra atteikuma gad\u012bjum\u0101. Nosak\u0101m, ka pirmais rezerv\u0113 b\u016bs mezgls no cita datu centra, bet otrais rezerv\u0113 \u2014 mezgls no tre\u0161\u0101. \u0160\u012b sh\u0113ma tiek izv\u0113l\u0113ta vienu reizi un nemain\u0101s, kam\u0113r netiek main\u012bta klastera topolo\u0123ija, proti, kam\u0113r pie t\u0101 neien\u0101k jauni mezgli (kas notiek \u013coti reti). Jaun\u0101 akt\u012bv\u0101 galven\u0101 mezgla izv\u0113les k\u0101rt\u012bba boj\u0101juma gad\u012bjum\u0101 vienm\u0113r b\u016bs \u0161\u0101da: akt\u012bvais meistars k\u013c\u016bs par pirmo rezervi, un, ja ar\u012b tas ir p\u0101rst\u0101jis darboties, tad par otro rezervi. <\/p>\n<p>\u0160\u0101da sh\u0113ma ir dro\u0161\u0101ka par univers\u0101lo algoritmu, jo jauna meistara aktiviz\u0101cijai pietiek ar vec\u0101 boj\u0101juma faktu noteik\u0161anu.<\/p>\n<p>Bet k\u0101 klienti saprat\u012bs, kur\u0161 meistars \u0161obr\u012bd str\u0101d\u0101? 50 ms ir par maz, lai izs\u016bt\u012btu inform\u0101ciju t\u016bksto\u0161iem klientu. Past\u0101v iesp\u0113ja, ka klients nos\u016bta piepras\u012bjumu par dar\u012bjuma atv\u0113r\u0161anu, v\u0113l nezinot, ka \u0161is meistars jau vairs nestr\u0101d\u0101, un piepras\u012bjums iestr\u0113gst timeout laik\u0101. Lai tam nov\u0113rstu, klienti spekulat\u012bvi nos\u016bta piepras\u012bjumus par dar\u012bjuma atv\u0113r\u0161anu uzreiz grupas meistaram un abiem vi\u0146a rezerv\u0113m, bet atbild\u0113s uz \u0161o piepras\u012bjumu tikai tas, kur\u0161 \u0161obr\u012bd ir akt\u012bvais meistars. Visi turpm\u0101kie sakari dar\u012bjuma ietvaros tiks veikti tikai ar akt\u012bvo meistaru.<\/p>\n<p>Rezerves meistari sa\u0146emtos piepras\u012bjumus par sve\u0161iem dar\u012bjumiem ievieto nerakst\u012bto dar\u012bjumu rind\u0101, kur tie tiek uzglab\u0101ti noteiktu laiku. Ja akt\u012bvais meistars mirst, tad jaunais meistars apstr\u0101d\u0101 piepras\u012bjumus par dar\u012bjumu atv\u0113r\u0161anu no savas rindas un atbild klientam. Ja klients jau pasp\u0113jis atv\u0113rt dar\u012bjumu ar veco meistaru, tad otr\u0101 atbilde tiek ignor\u0113ta (un, ac\u012bmredzot, \u0161\u0101ds dar\u012bjums netiks pabeigts un tiks atk\u0101rtots no klienta puses).<\/p>\n<h2>K\u0101 darbojas dar\u012bjums<\/h2>\n<p>\nPie\u0146emsim, ka klients nos\u016bt\u012bja koordin\u0101tora piepras\u012bjumu par dar\u012bjuma atv\u0113r\u0161anu konkr\u0113tai ent\u012btijai ar konkr\u0113tu prim\u0101ro atsl\u0113gu. Koordinators blo\u0137\u0113 \u0161o ent\u012btiju un ievieto to neat\u013cauto blo\u0137\u0113\u0161anas tabul\u0101 atmi\u0146\u0101. Ja nepiecie\u0161ams, koordinators nolasa \u0161o ent\u012btiju no kr\u0101tuves un saglab\u0101 ieg\u016btos datus koordin\u0101tora dar\u012bjuma st\u0101vokl\u012b.<\/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 \/>\nKad klients v\u0113las main\u012bt datus dar\u012bjum\u0101, vi\u0146\u0161 nos\u016bta koordin\u0113t\u0101jam piepras\u012bjumu par ent\u012btijas modifik\u0101ciju, un tas ievieto jaunus datus dar\u012bjumu st\u0101vok\u013ca tabul\u0101 atmi\u0146\u0101. Uz \u0161\u012b br\u012b\u017ea ieraksts ir pabeigts \u2014 ieraksts kr\u0101tuv\u0113 netiek veikts.<\/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 \/>\nKad klients pieprasa savus main\u012btos datus akt\u012bv\u0101 dar\u012bjuma ietvaros, koordinators r\u012bkojas t\u0101: <\/p>\n<ul>\n<li>ja ID jau ir dar\u012bjum\u0101, tad dati tiek \u0146emti no atmi\u0146as; <\/li>\n<li>ja ID atmi\u0146\u0101 nav, tad tr\u016bksto\u0161ie dati tiek nolas\u012bti no mezglu kr\u0101tuv\u0113m, apvienoti ar jau eso\u0161ajiem atmi\u0146\u0101 un rezult\u0101ts tiek atdots klientam. <\/li>\n<\/ul>\n<p>\nT\u0101d\u0113j\u0101di klients var izlas\u012bt savus labojumus, bet citi klienti \u0161os labojumus neredz, jo tie tiek glab\u0101ti tikai koordin\u0101tora atmi\u0146\u0101, mezglos Cassandra tos v\u0113l nav.<\/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 \/>\nKad klients nos\u016bta commit, pakalpojuma atmi\u0146\u0101 eso\u0161ais st\u0101voklis tiek saglab\u0101ts koordin\u0113jo\u0161\u0101 komponent\u0113 logged batch form\u0101t\u0101, un p\u0113c tam \u0161is logged batch tiek nos\u016bt\u012bts uz Cassandra kr\u0101tuv\u0113m. Kr\u0101tuv\u0113s tiek veikti visi nepiecie\u0161amie pas\u0101kumi, lai \u0161is pakets tiktu atomiski (piln\u012bb\u0101) piem\u0113rots, un t\u0101s atgrie\u017e atbildi koordin\u0113jo\u0161ajam komponentam, kur\u0161 atbr\u012bvo blo\u0137\u0113jumus un apstiprina dar\u012bjuma veiksm\u012bgumu klientam.<\/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 \/>\nKoordin\u0113jo\u0161ajam komponentam atcel\u0161anai ir pietiekami atbr\u012bvot atmi\u0146u, kas aiz\u0146emta ar dar\u012bjuma st\u0101vokli.<\/p>\n<p>K\u0101 rezult\u0101t\u0101 iepriek\u0161 aprakst\u012btajiem uzlabojumiem, m\u0113s esam \u012bstenoju\u0161i ACID principus:<\/p>\n<ul>\n<li><b>Atomarit\u0101te<\/b>. Tas nodro\u0161ina, ka nek\u0101da dar\u012bjuma da\u013ca netiks sist\u0113m\u0101 re\u0123istr\u0113ta da\u013c\u0113ji; visi t\u0101s apak\u0161dar\u012bjumi tiks izpild\u012bti vai netiks izpild\u012bti visp\u0101r. Mums \u0161is princips tiek iev\u0113rots, pateicoties logged batch Cassandra.<\/li>\n<li><b>Sakrit\u012bba<\/b>. Katrs veiksm\u012bgs dar\u012bjums p\u0113c defin\u012bcijas re\u0123istr\u0113 tikai at\u013cautus rezult\u0101tus. Ja p\u0113c dar\u012bjuma atv\u0113r\u0161anas un da\u013cas oper\u0101ciju izpildes tiek konstat\u0113ts, ka rezult\u0101ts nav at\u013cauts, tiek veikta atcel\u0161ana.<\/li>\n<li><b>Izol\u0101cija<\/b>. Veicot dar\u012bjumu, paral\u0113lie dar\u012bjumi nedr\u012bkst ietekm\u0113t t\u0101 rezult\u0101tu. Konkur\u0113jo\u0161ie dar\u012bjumi ir izol\u0113ti ar pesimistisk\u0101m blo\u0137\u0113\u0161an\u0101m koordin\u0113jo\u0161aj\u0101 komponent\u0113. Las\u012b\u0161ana \u0101rpus dar\u012bjuma iev\u0113ro izol\u0101cijas principus Read Committed l\u012bmen\u012b.<\/li>\n<li><b>Notur\u012bba<\/b>. Neatkar\u012bgi no probl\u0113m\u0101m zem\u0101kajos l\u012bme\u0146os \u2014 elektr\u012bbas trauc\u0113jumi, aparat\u016bras k\u013c\u016bmes \u2014 izmai\u0146\u0101m, kas veiktas veiksm\u012bgi pabeigt\u0101 dar\u012bjum\u0101, j\u0101paliek saglab\u0101t\u0101m p\u0113c sist\u0113mas darb\u012bbas atjauno\u0161anas. <\/li>\n<\/ul>\n<p><\/p>\n<h2>Las\u012b\u0161ana p\u0113c indeksiem<\/h2>\n<p>\nApskat\u012bsim vienk\u0101r\u0161u tabulu: <\/p>\n<pre><code>CREATE TABLE photos (\nid bigint primary key,\nowner bigint,\nmodified timestamp,\n\u2026)<\/code><\/pre>\n<p>\nTai ir ID (prim\u0101rais atsl\u0113ga), \u012bpa\u0161nieks un izmai\u0146u datums. J\u0101veido \u013coti vienk\u0101r\u0161s vaic\u0101jums \u2014 izv\u0113l\u0113ties datus p\u0113c \u012bpa\u0161nieka ar izmai\u0146u datumu \"p\u0113d\u0113jo 24 stundu laik\u0101\". <\/p>\n<pre><code>SELECT *\nWHERE owner=?\nAND modified&gt;?<\/code><\/pre>\n<p>\nLai \u0161\u0101ds vaic\u0101jums \u0101tri izpild\u012btos, klasiskaj\u0101 SQL DB j\u0101izveido indekss kolonn\u0101m (owner, modified). M\u0113s varam to izdar\u012bt diezgan vienk\u0101r\u0161i, jo tagad mums ir ACID garantijas!<\/p>\n<h2>Indeksi C*One<\/h2>\n<p>\nIr s\u0101kotn\u0113j\u0101 tabula ar fotogr\u0101fij\u0101m, kur\u0101 ieraksta ID ir prim\u0101r\u0101 atsl\u0113ga. <\/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 \/>\nIndeksam C*One izveido jaunu tabulu, kas ir s\u0101kotn\u0113j\u0101s tabulas kopija. Atsl\u0113ga sakr\u012bt ar indeksu izteiksm\u0113m, turkl\u0101t t\u0101 ietver ar\u012b ieraksta prim\u0101ro atsl\u0113gu no s\u0101kotn\u0113j\u0101s tabulas:<\/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 \/>\nTagad piepras\u012bjumu par \"\u012bpa\u0161nieku p\u0113d\u0113j\u0101s dienas laik\u0101\" var p\u0101rrakst\u012bt k\u0101 atlasi no citas tabulas:<\/p>\n<pre><code>SELECT * FROM i1_test\nWHERE owner=?\nAND modified&gt;?<\/code><\/pre>\n<p>\nDatu sader\u012bbu s\u0101kotn\u0113j\u0101 tabul\u0101 photos un indeksu i1 autom\u0101tiski uztur koordinatora. Balstoties tikai uz datu sh\u0113mu, sa\u0146emot izmai\u0146as, koordinatora \u0123ener\u0113 un atceras izmai\u0146as ne tikai galvenaj\u0101 tabul\u0101, bet ar\u012b kopiju izmai\u0146as. Nav nepiecie\u0161amas papildu darb\u012bbas ar indeksa tabulu, \u017eurn\u0101li netiek las\u012bti, blo\u0137\u0113\u0161ana netiek izmantota. Tas noz\u012bm\u0113, ka indeksu pievieno\u0161ana gandr\u012bz nepat\u0113r\u0113 resursus un praktiski neietekm\u0113 modific\u0113\u0161anas \u0101trumu.<\/p>\n<p>Izmantojot ACID, m\u0113s sp\u0113jam realiz\u0113t indeksus \"k\u0101 SQL\". Tie nodro\u0161ina sader\u012bbu, var tikt m\u0113rogoti, darbojas \u0101tri, var b\u016bt sastat\u0101mi un ieb\u016bv\u0113ti CQL vaic\u0101jumu valod\u0101. Lai atbalst\u012btu indeksus, nav nepiecie\u0161ams veikt izmai\u0146as lietojumprogrammas kod\u0101. Viss ir vienk\u0101r\u0161i, k\u0101 SQL. Un kas ir vissvar\u012bg\u0101kais, indeksi neietekm\u0113 izmai\u0146u izpildes \u0101trumu s\u0101kotn\u0113j\u0101 dar\u012bjumu tabul\u0101.<\/p>\n<h2>Kas izdev\u0101s<\/h2>\n<p>\nM\u0113s izstr\u0101d\u0101j\u0101m C*One pirms trim gadiem un uzs\u0101k\u0101m to ra\u017eo\u0161an\u0101. <\/p>\n<p>Ko m\u0113s esam ieguvu\u0161i beig\u0101s? Apskat\u012bsim to uz fotoatt\u0113lu apstr\u0101des un uzglab\u0101\u0161anas apak\u0161sist\u0113mas piem\u0113ra, kas ir viens no vissvar\u012bg\u0101kajiem datu veidiem soci\u0101laj\u0101 t\u012bkl\u0101. Run\u0101jam nevis par pa\u0161u fotoatt\u0113lu \u0137erme\u0146iem, bet par visda\u017e\u0101d\u0101ko meta inform\u0101ciju. Pa\u0161laik \"Klasesbiedros\" ir ap 20 miljardi \u0161\u0101du ierakstu, sist\u0113ma apstr\u0101d\u0101 80 t\u016bksto\u0161us las\u012b\u0161anas piepras\u012bjumu sekund\u0113, l\u012bdz 8 t\u016bksto\u0161iem ACID dar\u012bjumu sekund\u0113, kas saist\u012bti ar datu modific\u0113\u0161anu. <\/p>\n<p>Kad m\u0113s izmantoj\u0101m SQL ar replik\u0101cijas faktoru = 1 (bet RAID 10), fotoatt\u0113lu meta inform\u0101cija tika uzglab\u0101ta augstas pieejam\u012bbas klaster\u012b no 32 ma\u0161\u012bn\u0101m ar Microsoft SQL Server (plus 11 rezerves). Tika pie\u0161\u0137irtas ar\u012b 10 serveri dubl\u0113jumu glab\u0101\u0161anai. Kop\u0101 50 d\u0101rgas ma\u0161\u012bnas. \u0160aj\u0101 proces\u0101 sist\u0113ma darboj\u0101s nomin\u0101l\u0101s slodzes apst\u0101k\u013cos, bez rezeres.<\/p>\n<p>P\u0113c migr\u0101cijas uz jauno sist\u0113mu m\u0113s ieguv\u0101m replik\u0101cijas faktoru = 3 \u2014 pa kopijai katr\u0101 datu centr\u0101. Sist\u0113ma sast\u0101v no 63 Cassandra kr\u0101tuves mezgliem un 6 koordinatora ma\u0161\u012bn\u0101m, kop\u0101 69 serveri. Bet \u0161\u012bs ma\u0161\u012bnas ir iev\u0113rojami l\u0113t\u0101kas, to kop\u0113j\u0101 cena ir ap 30 % no SQL sist\u0113mas izmaks\u0101m. \u0160aj\u0101 laik\u0101 slodze saglab\u0101jas pie 30 %.<\/p>\n<p>Ar\u012b kav\u0113jumi ir samazin\u0101ju\u0161ies, ievie\u0161ot C*One: SQL rakst\u012b\u0161anas oper\u0101cija aiz\u0146\u0113ma apm\u0113ram 4,5 ms. C*One \u2014 apm\u0113ram 1,6 ms. Transakcijas ilgums vid\u0113ji ir maz\u0101ks par 40 ms, komits tiek veikts 2 ms laik\u0101, las\u012b\u0161anas un rakst\u012b\u0161anas ilgums vid\u0113ji ir 2 ms. 99. percentils ir tikai 3-3,1 ms, laika p\u0101rsniegumu skaits samazin\u0101jies simt reizes \u2014 viss, pateicoties pla\u0161ai spekul\u0101ciju pielieto\u0161anai. <\/p>\n<p>Uz doto br\u012bdi no ekspluat\u0101cijas ir iz\u0146emta liel\u0101k\u0101 da\u013ca SQL Server mezglu, jauni produkti tiek izstr\u0101d\u0101ti tikai, izmantojot C*One. M\u0113s esam piel\u0101goju\u0161i C*One, lai tas darbotos m\u016bsu m\u0101ko\u0146os. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/odnoklassniki\/blog\/346868\/\">one-cloud<\/a><\/noindex>, kas \u013c\u0101va pa\u0101trin\u0101t jaunu klasteru izv\u0113r\u0161anu, vienk\u0101r\u0161ot konfigur\u0101ciju un automatiz\u0113t ekspluat\u0101ciju. Bez avota koda to izdar\u012bt b\u016btu daudz gr\u016bt\u0101k un sare\u017e\u0123\u012bt\u0101k. <\/p>\n<p>Patlaban m\u0113s str\u0101d\u0101jam pie citu m\u016bsu glab\u0101tuves p\u0101rcel\u0161anas uz m\u0101koni \u2014 bet t\u0101 jau ir pavisam cita st\u0101sts.<br \/>\n<br \/>Avots: <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.5 - 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\/lv\/blog\/administrirovanie\/newsql-nosql-acid\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\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\/lv\/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":"L\u012bdz nesenai pag\u0101tnei \"Odnoklassnikos\" tika apstr\u0101d\u0101ti aptuveni 50 TB datu.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/newsql-nosql-acid","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/37956","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=37956"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/37956\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/28484"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=37956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=37956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=37956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}