
(c) Yandex.Bilder
Alla karaktÀrer Àr fiktiva, varumÀrken tillhör deras respektive Àgare, alla likheter Àr slumpmÀssiga och detta Àr helt enkelt min »subjektiva Äsikt, var snÀll och bryt inte dörren...«
Vi har betydande erfarenhet av att översĂ€tta informationssystem med logik i databaser frĂ„n ett DBMS till ett annat. I samband med den ryska regeringens förordning nr 1236 frĂ„n den 16.11.2016 handlar det ofta om överföring frĂ„n Oracle till Postgresql. Hur man organiserar processen pĂ„ ett maximalt effektivt och smĂ€rtfritt sĂ€tt â det kan vi berĂ€tta mer om separat, idag kommer vi att tala om egenskaperna hos kluster och vilka problem man kan stöta pĂ„ nĂ€r man bygger högbelastade distribuerade system med komplex logik i procedurer och funktioner.
Spoiler â ja, cap, RAC och pg multimaster Ă€r verkligen vĂ€ldigt olika lösningar.
Anta att du redan har flyttat all logik frÄn plsql till pgsql. Och dina regressionstester fungerar ganska bra, nu tÀnker du naturligtvis pÄ skalning, eftersom belastningstesterna inte riktigt glÀdjer dig, sÀrskilt med den hÄrdvara som ursprungligen planerades för det andra DBMS:et. Anta att du har hittat en lösning frÄn den inhemska leverantören »Postgres Professional« med en funktion som kallas »multimaster«, som endast Àr tillgÀnglig i den »maximala« versionen av »Postgres Pro Enterprise« och enligt beskrivningen verkar det vara precis vad du behöver, och vid första ytliga studier kommer du att fÄ tanken: »à h! IstÀllet för RAC, det Àr perfekt! Plus teknisk support i hemlandet!«
Men skynda dig inte att bli glad, och lĂ€ngre fram kommer vi att förklara varför dessa nyanser Ă€r viktiga att kĂ€nna till, eftersom de Ă€r svĂ„ra att förutse, Ă€ven om man studerat dokumentationen för produkten noggrant. ĂvervĂ€g om du Ă€r beredd att ofta uppdatera versionerna av DBMS direkt i produktionsmiljön, eftersom vissa defekter Ă€r inkompatibla med industriexploatering och kan vara svĂ„ra att upptĂ€cka under tester.
Börja med att noggrant lĂ€sa avsnittet »multimaster« â »begrĂ€nsningar« pĂ„ tillverkarens webbplats.
Det första du kan stöta pÄ Àr egenskaperna hos transaktionshantering i det sÄ kallade »tvÄfaslÀget«, och ibland, förutom att skriva om hela logiken i din procedur, gÄr det inte att ÄtgÀrda. HÀr Àr ett enkelt exempel:
skapa tabell test1 (id heltal, id1 heltal);
infoga vÀrden i test1 (1, 1),(1, 2);
ĂNDRA TABELL test1 LĂGG TILL BEGREPP test1_uk UNIK (id,id1) DEFERRABLE INITIALLY DEFERRED;
uppdatera test1
stÀll in id1 =
fall id1
nÀr 1
dÄ 2
annars id1 - tecken(2 - 1)
slut
dÀr id1 mellan 1 och 2;Ett fel uppstÄr:
FEL: [MTM] Transaktion MTM-1-2435-10-605783555137701 (10654) Àr avbruten pÄ nod 3. Kontrollera dess logg för att se felinformationen.Det gÄr att kÀmpa lÀnge med dead lock i versioner 10.5, 10.6 och den enda kÀnda lösningen som dödar hela syftet med klustret - Àr att ta bort "problematiska" tabeller frÄn klustret, dvs. göra make_table_local, men detta kommer Ätminstone att lÄta er arbeta, och inte sÀtta stopp pÄ allt pÄ grund av hÀngande vÀntan pÄ transaktionscommit. Eller sÄ kan ni uppgradera till version 11.2, vilket borde hjÀlpa, kanske inte, glöm inte att kontrollera.
I vissa versioner kan ni fÄ en Ànnu mer mystisk lÄsning:
anvÀndarnamn= mtm och backend_typ = bakgrundsarbetareOch i denna situation kan endast en uppgradering av databashanteraren till version 11.2 och högre hjÀlpa, eller kanske inte.
Vissa operationer med index kan orsaka fel som tydligt anger att problemet ligger i Bi-Directional Replication, i MTM-loggarna ser ni tydligt BDR. Verkligen 2ndQuadrant? Nej, nej⊠vi köpte ju multimaster, det Àr bara en slump, det Àr namnet pÄ teknologin.
[MTM] bdr stödjer inte indexöversyn
[MTM] 12124: REMOTE börja avbryta transaktion 4083
[MTM] 12124: skicka ABORT meddelande för transaktion (5467) lokal xid=4083 till koordinator 3
[MTM] Ta emot ABORT_PREPARED logisk meddelande för transaktion MTM-3-25030-83-605694076627780 frÄn nod 3
[MTM] Avbryt förberedd transaktion MTM-3-25030-83-605694076627780 status InProgress frÄn nod 3 originId=3
[MTM] MtmLogAbortLogicalMessage nod=3 transaktion=MTM-3-25030-83-605694076627780 lsn=9fff448 Om ni anvÀnder temporÀra tabeller, trots försÀkringar om: "Multimaster-tillÀgget replikerar data pÄ ett helt automatiskt sÀtt. Ni kan samtidigt utföra skrivtransaktioner och arbeta med temporÀra tabeller pÄ valfri nod i klustret."
SÄ fÄr ni i praktiken se att replikeringen av alla tabeller som anvÀnds i proceduren inte fungerar, om det finns skapande av temporÀra tabeller i koden, och Àven anvÀndning av multimaster.remote_functions hjÀlper inte, ni mÄste uppgradera eller omstrukturera er logik i proceduren. Om ni behöver anvÀnda tvÄ tillÀgg aktivt, multimaster och pg_pathman, inom "Postgres Pro Enterprise" v 10.5, kontrollera att med ett sÄ enkelt exempel:
SKAPA TABELL mÀtning (
city_id int inte null,
logdate datum inte null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
SKAPA TABELL mĂ€tning_y2019m06 PARTITION OF mĂ€tning FĂR VĂRDEN FRĂ
N ('2019-06-01') TILL ('2019-07-01');
infoga in mÀtning vÀrden (1, till_date('27.06.2019', 'dd.mm.yyyy'), 1, 1);
infoga in mÀtning vÀrden (2, till_date('28.06.2019', 'dd.mm.yyyy'), 1, 1);
infoga in mÀtning vÀrden (3, till_date('29.06.2019', 'dd.mm.yyyy'), 1, 1);
infoga in mÀtning vÀrden (4, till_date('30.06.2019', 'dd.mm.yyyy'), 1, 1);I loggarna pÄ databasnoderna börjar sÄdana fel uppstÄ:
âŠ
PATHMAN_CONFIG innehÄller inte relation 23245
> find_in_dynamic_libpath: försöker "\/opt\/âŠ\/ent-10\/lib\/pg_pathman"
> find_in_dynamic_libpath: försöker "\/opt\/\/âŠ\/ent-10\/lib\/pg_pathman.so"
> DEBUG: find_in_dynamic_libpath: försöker "\/opt\/âŠ\/ent-10\/lib\/pg_pathman"
> find_in_dynamic_libpath: försöker "\/opt\/âŠ\/ent-10\/lib\/pg_pathman.so"
> PrepareTransaction(1) namn: namnlös; blockState: PREPARE; state: INPROGR, xid/subid/cid: 6919/1/40
> StartTransaction(1) namn: namnlös; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0
> vÀxlad till tidslinje 1 giltig tills 0/0
âŠ
Transaktion MTM-1-13604-7-612438856339841 (6919) Àr avbruten pÄ nod 2. Kontrollera dess logg för att se felförklaringar.
...
[MTM] 28295: FJĂRR börja avbryta transaktion 7017
âŠ
[MTM] 28295: skicka ABORT meddelande för transaktion (6919) lokal xid=7017 till koordinator 1
Vad dessa fel Àr kan du ta reda pÄ hos supporten, du köpte den inte för intet.
Vad göra? RÀtt! Uppgradera till "Postgres Pro Enterprise" till v 11.2
Det Àr sÀrskilt viktigt att veta att sekvensen, som Àr ett objekt av en replikerad databas, inte har ett kontinuerligt vÀrde i hela klustret, varje sekvens Àr lokal för varje nod och om du har fÀlt med unika begrÀnsningar som anvÀnder sekvenser, sÄ kan du endast öka med ett vÀrde motsvarande nodnumret i klustret, eftersom ju fler noder i klustret, desto snabbare kommer din sekvens att öka, och int kommer att ta slut snabbare Àn du rÀknade med. För att förenkla arbetet med sekvenser i produkten kommer du till och med att hitta funktionen alter_sequences, som gör nödvÀndiga inkrement pÄ varje sekvens pÄ alla noder, men var beredd att funktionen kanske inte fungerar i alla versioner. SjÀlvklart kan du skriva den sjÀlv, ta grundkod frÄn github eller justera den direkt i databasen. Samtidigt kommer fÀlt av typen serialbigserial att fungera mer korrekt, men för att anvÀnda dem mÄste du troligen skriva om koden för dina procedurer och funktioner. Kanske nÄgon skulle ha nytta av funktionen monotonic_sequences.
Fram till version 11.2 av "Postgres Pro Enterprise" kommer replication endast att fungera om det finns unika primÀrnycklar, tÀnk pÄ detta vid utveckling.
Det Àr sÀrskilt vÀrt att nÀmna de specifika funktionerna hos npgsql i klusterlösningar; dessa problem uppstÄr inte pÄ enstaka noder, men förekommer i multimaster-lösningar.
I vissa versioner kan man stöta pÄ följande fel:
Exception Details: Npgsql.PostgresException: 25001: kommandot SET TRANSACTION ISOLATION LEVEL
Description: Ett ohanterat undantag intrÀffade under körningen av den aktuella webbplatsförfrÄgan. VÀnligen granska stackspÄret för mer information om felet och var det uppstod i koden. Vad kan man göra? Det gÀller helt enkelt att undvika vissa versioner. Man mÄste kÀnna till dem, dÄ felet inte uppstÄr i en version, och Àven efter att det första felet har ÄtgÀrdats kan man stöta pÄ det igen senare. Detta Àr nÄgot man ocksÄ bör förbereda sig pÄ, och det Àr bÀttre att alla identifierade defekter i databashanteraren som rÀttas av tillverkaren Ätföljs av separata regressions tester. SÄ att sÀga, lita pÄ, men kontrollera.
Om applikationen anvÀnder npgsql och vÀxlar mellan noderna under antagandet att de Àr helt identiska, kan följande fel uppstÄ:
EXCEPTION:Npgsql.PostgresException (0x80004005): XX000: cache lookup failed for type ...Ett sÄdant fel kommer att uppstÄ eftersom bindningen utförs
(NpgsqlConnection.GlobalTypeMapper.MapComposite("some_composite_type");) av komposittyper vid applikationens start för alla anslutningar. Som ett resultat fÄr vi ett identifieringsnummer frÄn en nod, och vid en förfrÄgan pÄ en annan nod stÀmmer det inte överens, vilket resulterar i ett fel, det vill sÀga att arbeta transparent med komposittyper i kluster för vissa applikationer kommer att vara omöjligt utan ytterligare omskrivningar pÄ applikationens sida (om du lyckas med det).
Som vi alla vet Àr den allmÀnna bedömningen av klusterstatus mycket viktig för diagnostik och snabba ÄtgÀrder under drift; i produkten kan du hitta vissa funktioner som bör underlÀtta ditt liv, men ibland kan de ge helt andra resultat Àn vad du och tillverkaren förvÀntar dig.
Till exempel:
select mtm.collect_cluster_info();
pÄ varje nod ger samma resultat:
(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")Men varför stÄr det 2 i fÀltet LiveNodes överallt, trots att det i beskrivningen av multimaster ska motsvara antalet AllNodes=3? Svar: versionen av databashanteraren mÄste uppdateras.
Och var beredd att samla loggar frÄn alla noder, eftersom du vanligtvis kommer att se "felet finns i loggen pÄ en annan nod". Teknisk support kommer att ta emot alla problem som du identifierar och rapportera nÀr nÀsta version Àr redo, som ibland behöver installeras med driftstopp, ibland under lÀngre tid (beroende pÄ storleken pÄ din DBMS). Det Àr ingen idé att hoppas att driftsproblem kommer att oroar leverantören, och uppdateringar pÄ grund av identifierade fel kommer att genomföras med leverantörens representanter, eller snarare, undvik att involvera leverantörens representanter, eftersom du till slut kan fÄ en produktionskluster utan backup.
Egentligen varnar tillverkaren Àrligt i licensen för den kommersiella produkten: "Denna programvara tillhandahÄlls pÄ basis av principen 'sÄ som den Àr' och det begrÀnsade ansvarsbolaget 'Postgres Professionell' har ingen skyldighet att tillhandahÄlla support, support, uppdateringar, utvidgningar eller Àndringar."
Om du inte har gissat vilken produkt det handlar om, sÄ har all denna erfarenhet samlats in under ett Ärs drift av Postgres Pro Enterprise-databasen. Du kan dra dina egna slutsatser, det Àr sÄ fuktigt att svampar vÀxer.
Men det skulle fortfarande vara en sak om problemen ÄtgÀrdades i tid och snabbt.
Men det Àr just det som inte hÀnder. Tydligen har tillverkaren inte tillrÀckligt med resurser för att snabbt ÄtgÀrda identifierade buggar.
Endast registrerade anvÀndare kan delta i omröstningen. , tack.
Har du erfarenhet av att migrera frÄn en utlÀndsk/proprietÀr DBMS till en fri/inhemsk?
21,3%Ja, positivt10
10,6%Ja, negativt5
21,3%Nej, vi har inte bytt DBMS10
4,3%Vi har bytt DBMS, men inget har förÀndrats2
42,6%Visa resultat20
47 anvÀndare har röstat. 12 anvÀndare har avstÄtt.
KĂ€lla: habr.com
