«Pro, aga mitte klaster» vÔi kuidas me DBMS-i importasendame

«Pro, aga mitte klaster» vÔi kuidas me DBMS-i importasendame
(c) Yandex.Images

KĂ”ik tegelased on vĂ€ljamĂ”eldud, kaubamĂ€rgid kuuluvad nende omanikele, kĂ”ik kokkusattumised on juhuslikud ja ĂŒldiselt, see on minu «subjektiivne hinnang, palun Ă€rge pĂŒĂŒdke ust murda ».

Meil on mĂ€rkimisvÀÀrne kogemus teabehaldussĂŒsteemide tĂ”lkimisel andmebaasi loogikaga ĂŒhelt DBMS-ilt teisele. Seoses valitsuse mÀÀrusega nr 1236 16.11.2016, on see sageli tĂ”lgendus Oracle'ist PostgreSQLi. Kuidas korraldada protsessi vĂ”imalikult tĂ”husalt ja valutult — saame rÀÀkida eraldi, tĂ€na rÀÀgime klastrite kasutamise eripĂ€radest ja milliste probleemidega vĂ”ib kokku puutuda kĂ”rge koormusega jaotatud sĂŒsteemide ĂŒlesehitamisel keeruka loogikaga protseduurides ja funktsioonides.

Spoiler – jah, CAP, RAC ja pg multimaster on vĂ€ga erinevad lahendused.

Oletame, et olete juba kogu plsql loogika pgsql-ile ĂŒle viinud. Ja teie regressioonitestid on ĂŒsna head, nĂŒĂŒd mĂ”tlemegi loomulikult skaleerimisele, kuna koormustestid ei paku teile suurt rÔÔmu, eriti selle riistvaraga, mis algselt projektis ette nĂ€htud oli, selle teise DBMS-i jaoks. Oletame, et leiate kodumaise tarnija „Postgres Professional“ lahenduse, millel on valik nimega „multimaster“, mis on saadaval ainult „Postgres Pro Enterprise“ maksimaalses versioonis ning kirjelduse pĂ”hjal tundub see olevat just see, mida vajate, ja esimese pinnapealse uurimise kĂ€igus tuleb pĂ€he mĂ”te: „O! See on just nagu RAC! Ja veel kodumaise tehnilise toe vĂ”imalus!“

Aga Ă€rge kiirustage rÔÔmustama, ja edasi kirjeldame, miks neid nĂŒansse on oluline teada, kuna neid on raske ette nĂ€ha, isegi pĂ€rast toote dokumentatsiooni pĂ”hjalikku lugemist. Hinnake, kas olete valmis sageli DBMS-i versioone tootmispaigas uuendama, kuna mĂ”ned vead ei ole tootmisprotsessiga ĂŒhilduvad ja neid on keeruline testi kĂ€igus avastada.
Alustage tootja veebisaidil jaotise „multimaster“ – „piirangud“ tĂ€helepaneliku lugemisega.

Esimene asi, millega vĂ”ib kokku puutuda, on tehingute töö eripĂ€ra nn „kahefaasilises“ reĆŸiimis, ja vahel ei saa seda parandada muul viisil kui kogu teie protseduuri loogika ĂŒmber kirjutamisega. Siin on lihtne nĂ€ide:

loo tabel test1 (id integer, id1 integer);
inserteeri test1 vÀÀrtused (1, 1),(1, 2);

MUUDA TABELIT test1, LISADES KONSTRUKTSIOONI test1_uk UNIKAALSE (id,id1) EDASI LÜKKAMISEGA ALGUSES EDASI LÜKKATUD;

uuenda test1
           seadke id1 =
               juhtum id1
                 kui 1
                 siis 2
                 muidu id1 - sign(2 - 1)
               lÔpp
         kus id1 on vahemikus 1 kuni 2;

Tekkis viga:

VIGA:  [MTM] Tehing MTM-1-2435-10-605783555137701 (10654) on katkestatud sĂ”lmes 3. Kontrollige selle logi, et nĂ€ha vigade ĂŒksikasju.

Edasi vĂ”ib pikka aega vĂ”idelda dead lock'iga versioonides 10.5, 10.6 ja ainus teadaolev pÀÀseteede, mis tapab kogu klastrite mĂ”tte – on „probleemsete“ tabelite eemaldamine klastrist, st teha make_table_local, kuid see vĂ€hemalt vĂ”imaldab töötada, mitte peatada kĂ”ike kĂ”rgenenud tehingu fikseerimise ootustes. VĂ”ite ka proovida uuendada versioonile 11.2, mis peaks aitama, vĂ”ib-olla ka mitte, Ă€rge unustage kontrollida.

MÔnedes versioonides vÔite saada veelgi salapÀrasemat lukustust:

kasutajanimi = mtm ja backend_type = taustatöötaja

Ja sellises olukorras aitab teid vaid andmebaasi versiooni uuendamine 11.2-le ja kÔrgemale, vÔib-olla ei aita.

MÔned operatsioonid indeksitega vÔivad pÔhjustada vigu, kus selgelt öeldakse, et probleem seisneb Bi-Directional Replication'is, MTM logides nÀete otseselt BDR. TÔesti 2ndQuadrant? Ei, me ostsime multimasteri, see on lihtsalt juhus, see tehnoloogia nimi.

[MTM] bdr ei toeta indeksi uuesti kontrollimist
[MTM] 12124: REMOTE algus katkestada tehing 4083
[MTM] 12124: saata KATKESTA teade tehingu (5467) kohaliku xid=4083 koordinaatorile 3
[MTM] VastuvÔtja KATKESTA_PAREM loogiline sÔnum tehingu MTM-3-25030-83-605694076627780 jaoks sÔlmest 3
[MTM] Katkestada ettevalmistatud tehing MTM-3-25030-83-605694076627780 olek InProgress sÔlmest 3 originId=3
[MTM] MtmLogAbortLogicalMessage sÔlm=3 tehing=MTM-3-25030-83-605694076627780 lsn=9fff448 

Kui kasutate ajutisi tabeleid, hoolimata kinnitustest: „Multimaster laiendus viib andmete replikatsiooni tĂ€iesti automaatselt lĂ€bi. VĂ”ite samaaegselt teostada kirjutavaid tehinguid ja töötada ajutiste tabelitega igas klastris oleku sĂ”lmest.“

Siis tegelikult te saate, et replikatsioon ei toimi kĂ”ikidel tabelitel, mida protseduuris kasutatakse, kui koodis on ajutise tabeli loomine, ja isegi multimaster.remote_functions'i kasutamine ei aita, tuleb uuendada vĂ”i ĂŒmber kirjutada oma loogika protseduuris. Kui peate samaaegselt kasutama kahte laiendit multimaster ja pg_pathman „Postgres Pro Enterprise“ v 10.5 raames, siis kontrollige, et selle lihtsa nĂ€ite juures:

LOOBA ANDMEBAAS measurement (
    city_id         int mitte,
    logdate         kuupÀev mitte,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);

LOOBA ANDMEBAAS measurement_y2019m06 PARTITION OF measurement FOR VALUES FROM ('2019-06-01') TO ('2019-07-01');
insert into measurement values (1, to_date('27.06.2019', 'dd.mm.yyyy'), 1, 1);
insert into measurement values (2, to_date('28.06.2019', 'dd.mm.yyyy'), 1, 1);
insert into measurement values (3, to_date('29.06.2019', 'dd.mm.yyyy'), 1, 1);
insert into measurement values (4, to_date('30.06.2019', 'dd.mm.yyyy'), 1, 1);

DB serverite logides hakkavad tekkima sellised vead:



 PATHMAN_CONFIG ei sisalda suhet 23245
> find_in_dynamic_libpath: proovin "\/opt\/
\/ent-10\/lib\/pg_pathman"
> find_in_dynamic_libpath: proovin "\/opt\/
\/ent-10\/lib\/pg_pathman.so"
> DEBBUGING:  find_in_dynamic_libpath: proovin "\/opt\/
\/ent-10\/lib\/pg_pathman"
> find_in_dynamic_libpath: proovin "\/opt\/
\/ent-10\/lib\/pg_pathman.so"
> PrepareTransaction(1) nimi: nimetuks; blockState: PREPARE; seisund: INPROGR, xid\/subid\/cid: 6919\/1\/40
> StartTransaction(1) nimi: nimetuks; blockState: DEFAULT; seisund: INPROGR, xid\/subid\/cid: 0\/1\/0
> vahetatud ajajoonele 1, kehtiv kuni 0\/0


Tehing MTM-1-13604-7-612438856339841 (6919) on katkestatud sÔlmes 2. Kontrollige selle logi, et nÀha veateateid.
...
[MTM] 28295: KAUDA algab katkestus tehingu 7017


[MTM] 28295: saatma ABORT teate tehingu (6919) kohalik xid=7017 koordinaatorile 1

Mis need vead on, saate teada tehnilisest toelt, ei tasu ju te selle eest maksma hakata.

Mida teha? Õige! Uuendage "Postgres Pro Enterprise" versioonile 11.2

Erakordselt tuleb teada, et sequence, olles replikatsiooni andmebaasi objekt, ei oma ĂŒldiselt vÀÀrtust kogu klustis, iga sequence on kohaliku kehtivusega iga sĂ”lme puhul ja kui teil on unikaalsete piirangutega vĂ€ljad ja kasutate sequence, siis saate ainult teha inkrementi, mis on vĂ”rdne sĂ”lme numbriga klustis, kuna klustis on sama palju sĂ”lmi, nii kiiresti suureneb ka sequence ja int lĂ”ppeb kiiremini, kui ootate. Sequence'i lihtsustamiseks leiate tootes isegi funktsiooni alter_sequences, mis teeb vajalikud inkremendid iga sequence'i jaoks kĂ”ikidel sĂ”lmedel, kuid olge valmis, et funktsioon ei pruugi töötada kĂ”igis versioonides. Loomulikult on selle ise kirjutamine vĂ”imalik, vĂ”ttes aluseks koodi githubist vĂ”i muutes otse andmebaasis. Samuti töötavad vĂ€ljad tĂŒĂŒbiga serialbigserial tĂ€psemalt, kuid nende kasutamiseks peate tĂ”enĂ€oliselt kirjutama oma protseduuride ja funktsioonide koodi ĂŒmber. VĂ”ib-olla on kellegi jaoks kasulik funktsioon monotonic_sequences.

Kuni versioonini 11.2 "Postgres Pro Enterprise" töötab replikatsioon ainult juhul, kui on olemas unikaalsed esimesed vÔtmed, pidage seda meeles arendamisel.

Eraldi tahaksin rÀÀkida npgsql-i töös esinevatest eripĂ€radest just klastrilahendustes, need probleemid ei esine ĂŒksikutes sĂ”lmides, kuid mitme vĂ”rgu puhul on need tĂ€iesti olemas.
MÔnedes versioonides vÔidakse kokku puutuda veaga:

Exception Details: Npgsql.PostgresException: 25001: kÀsk SET TRANSACTION ISOLATION LEVEL 
Kirjeldus: Töötlemata erand tekkis praeguse veebipÀringu kÀitlemise ajal. Palun vaadake teeki jÀlgi, et saada rohkem teavet vea ja selle alguskoha kohta koodis. 

Mida teha? Lihtsalt Ă€rge kasutage mĂ”ningaid versioone. Tuleb neid teada, kuna viga ei esine vaid ĂŒhes versioonis ning isegi pĂ€rast selle esmast parandamist vĂ”ite sellega hiljem kokku puutuda. Sellele tuleb samuti ette valmistuda ja parem on kĂ”ik tuvastatud andmebaasi vead, mille parendab tootja, katta eraldi regressioonitestidega. Usalda, aga kontrolli.

Kui rakendus kasutab npgsql-i ja vahetab sĂ”lmede vahel, arvates, et need on absoluutselt ĂŒhesugused, siis vĂ”ib teil tekkida viga:

EXCEPTION: Npgsql.PostgresException (0x80004005): XX000: vahemĂ€lu vaatamine ebaĂ”nnestus tĂŒĂŒbi ...

See viga tekib seetÔttu, et kÀivitatakse sidumine

(NpgsqlConnection.GlobalTypeMapper.MapComposite("some_composite_type");) 

koostĂŒĂŒbid rakenduse kĂ€ivitamisel kĂ”ikide ĂŒhenduste jaoks. Selle tulemusena saame identifikaatori ĂŒhest sĂ”lmest ja teisel sĂ”lmel pĂ€ringut tehes ei ĂŒhti see, mistĂ”ttu tagastatakse viga, s.t. töötamine koostĂŒĂŒpidega klastris osade rakenduste jaoks on vĂ”imalik ainult lisarewrittenide poolse rakenduse kĂŒljest (kui suudate seda teha).

Kuna me kĂ”ik teame, et klastrite ĂŒldine seisundi hindamine on vĂ€ga oluline diagnostika ja operatiivmeetmete jaoks, siis tootest leiate mĂ”ned funktsioonid, mis peaksid elu mugavamaks tegema, kuid mĂ”nikord vĂ”ivad need pakkuda tĂ€iesti eri tulemusi, kui te ja isegi tootja neid ootavad.

NĂ€iteks:

select mtm.collect_cluster_info();
iga sÔlmes annab sama tulemuse:
(1, Online, 0, 0, 0, 2, 3, 0, 0, 0, 1, 0, 0, 1, 1, 3, 7, 0, 0, 0, "2018-10-31 05:33:06")
(2, Online, 0, 0, 0, 2, 3, 0, 0, 0, 1, 0, 0, 1, 1, 3, 7, 0, 0, 0, "2018-10-31 05:33:06")
(3, Online, 0, 0, 0, 2, 3, 0, 0, 0, 1, 0, 0, 1, 1, 3, 7, 0, 0, 0, "2018-10-31 05:33:09")

Aga miks vÀljal LiveNodes on igal pool number 2, kuigi mitme vÔrgu töö kirjeldus peaks vastama numbrile AllNodes=3? Vastus: tuleb vÀrskendada andmebaasi versiooni.

Ja olge valmis koguma logisid kĂ”igis sĂ”lmedes, kuna tavaliselt nĂ€ete "viga on teise sĂ”lme logis". Tehniline tugi aktsepteerib kĂ”ik teie tuvastatud vead ja teavitab teid jĂ€rgmise versiooni valmidusest, mille installimine vĂ”ib mĂ”nikord nĂ”uda teenuse peatamist, mĂ”nikord ka pikema aja jooksul (olenevalt teie andmebaasi mahust). Ärge lootke, et tootja muretseb teie kasutusprobleemide pĂ€rast ning et vĂ€rskendused tuvastatud vigade tĂ”ttu toimuvad tootja esindajate osalusel, tĂ€psemalt ei ole vaja tootja esindajaid kaasata, kuna vĂ”ite lĂ”ppkokkuvĂ”ttes saada tootmises lagunenud klastriga ilma varundamiseta.

Tegelikult hoiatab tootja kommertstoote litsentsis ausalt: "See tarkvara on antud 'nagu on' ja tuntud nimi OÜ 'Postgres Professionaalne' ei ole kohustatud pakkuma hooldust, tuge, uuendusi, laiendusi ega muudatusi."

Kui te pole veel aru saanud, millise toote kohta on jutt, siis kogu see kogemus on saadud Postgres Pro Enterprise'i aastase kasutamise tulemusena. JÀrelduse vÔite teha ise, niivÔrd toores, et seente kasvamiseks on ideaalne.

Aga see oleks veel pool hÀda, kui probleeme lahendatakse Ôigeaegselt ja operatiivselt.

Kuid seda ei toimu. Tundub, et tootjal ei ole piisavalt ressursse, et kiiresti tuvastatud vigu kÔrvaldada.

Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. Logige sisse, palun.

Kas teil on kogemusi vĂ€lismaalt/omandiandjalt tasuta/rahvuslikule andmebaasile ĂŒleminekul?

  • 21,3%Jah, positiivne10

  • 10,6%Jah, negatiivne5

  • 21,3%Ei, andmebaasi ei ole vahetatud10

  • 4,3%Andmebaasi on vahetatud, kuid midagi ei muutunud2

  • 42,6%Tulemustega tutvumiseks20

HÀÀletas 47 kasutajat. 12 kasutajat olid erapooletud.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster