
(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öötajaJa 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. , 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
