Napíšu si za pár minut shrnutí - jako na zkoušce (prostě všechno, co vím), řeknu si to a pak si to přečtu/doplním.
Edit: projedu to znovu a zkusím upravit či doplnit informace
-
plus si dopíšu poznámku na ACID, abych se u Valenty neztrapnil
-
co všechno obnáší databázová administrace,
- správa DB serveru, clusteru, jednotlivých databází (přístupy, zabezpečení…)
- řešení problémů, optimalizace, tuning databáze
- iterativní proces (hledání problematických částí, jejich zlepšování atd.)
- příkaz analyse
- pro aktualizování statistik optimalizátoru dotazů (hlavně po velkým zásahu do databáze - hromadné mazání, hromadný import např.)
- efektivní správa úložného prostoru
- management tablespaces podle typu dat
- příkaz vacuum - po transakcích odstraní nevalidní záznamy (commit/rollback)
- vacuum full - odstraní nevalidní záznamy po transakcích a ještě přerovná “sesype” záznamy k sobě, takže fyzicky se zmenší velikost databáze
- pomalejší, blokující
- vacuum full - odstraní nevalidní záznamy po transakcích a ještě přerovná “sesype” záznamy k sobě, takže fyzicky se zmenší velikost databáze
- autovacuum - probíhá automaticky periodicky a vyřeší 90% věcí
- vacuum chci zase po větších zásazích do databáze
- většinou po tomhle chci udělat analyse
- správa uživatelů databáze, přístupy, autorizace, autentizace
- ta probíhá hlavně v souboru
pg_hba.conf
- ta probíhá hlavně v souboru
- provádění dotazů, hledání neefektivních dotazů (explain, explain analyze)
- provádění zátěžových testů nad databází
- benchmarky, pgbench extension
- sleduju pak výsledky a výkon v pgBadger
- migrace databází, zajištění konzistence dat
- zálohování databáze, inkrementální zálohy
- replikace serveru, logická replikace serveru
- monitoring a zabezpečení databáze
-
architektura PostgreSQL a důležité komponenty,
- obecně u databázových strojů máme dvě hlavní části
- instance/cluster a samotnou databázi
- na databázi se uživatelé nemohou připojit přímo, musí přes cluster/instanci
- abychom “spustili databázi”, tak musíme nejdřív nahodit instanci/cluster
- 80% případů je to 1:1 (1 instance na 1 databázi)
- ale občas může být více databází na 1 instanci
- instance/cluster
- řeší připojování klientů (pomocí TCP/IP)
- běží tam procesy, memory procesy atd.
- obsluha databáze
- databáze
- obsahuje disk, logy, indexy, tabulky atd.
- instance/cluster a samotnou databázi
- běží hlavní proces Postmaster, který přijímá spojení
- Postmaster také startuje celý cluster - bere si postgres.conf, i pg_hba.conf
- a pak jednotlivé klienty deleguje na podprocesy (Postgres), které ty klienty obsluhují dokud jsou připojený (dotazy)
- obslužné procesy tady fsyncem zapisují WAL logy - které se pak událostí checkpoint zapíšou perzistentně na disk (defaultně cca co 5 min) taky fyncem
- fsync je systémová funkce, která periodicky zapisuje věci z cache perzistentně na disk
- proč? - no stejně je potřeba tvořit WAL logy na např. logickou replikaci nebo obnovu PITR
- ale hlavně jde o omezení I/O na disk, které jsou pomalé
- obslužné procesy tady fsyncem zapisují WAL logy - které se pak událostí checkpoint zapíšou perzistentně na disk (defaultně cca co 5 min) taky fyncem
- shared memory buffer - tam se tahají často přistupované objekty, většina často přistupovaných tabulek se tam nachází
- struktura tabulek
- v rootu clusteru jsou hlavní konfigurační soubory (spolu s pg_ident.conf)
- adresář base/
- každý podadresář je pro jednu databázi - jedna tabulka je pak 1 binární soubor
- každá databáze se tvoří podle template (0 neupravuji, do 1 si můžu přidat triggery, funkce atd.)
- výchozí databáze postgres - obsahuje tabulky s informacemi o systému, dotazech, statistiky, nastavení apod. (schéma pg_catalog - to je v podstatě Data dictionary)
- pgAdmin a další GUIčka jsou jenom grafický dotazy do těchto tabulek
- databázový stroj postgres může obsahovat více clusterů
- každý cluster může obsahovat více databází
- každý cluster musí běžet na jiném portu
- uživatelé “žijí” na úrovni clusteru
- obecně u databázových strojů máme dvě hlavní části
-
k čemu je WAL,
- write-ahead logs
- jsou to v podstatě změnové vektory, které obsahují id transakce, id řádku, starou hodnotu, novou hodnotu
-
- informace o commitu, rollbacku a checkpointu
- obsahují informace o provedených DML operací
-
- využití
- optimalizování a omezení I/O zápisů na perzistentní disk
- využití v obnově databáze
- online hot file-system based backup, PITR
- logická replikace (jsou uložené v replikačním slotu publishera a ten si pomocí LSN = log sequence number; trackuje, které se už přenesly a které ne
- jsou důležité v PITR = point in time recovery
- kdy my jsme schopni obnovit databázi z jakkéhokoliv časového okamžiku (nebo spíš do jakéhokoliv časového okamžiku)
- protože v rámci PITR se dělají pravidelné zálohy (např. na týdenní bázi), ale když to klekne v půlce týdne, tak přijdu o důležitá data
- a tady se právě hodí WAL logy, které si mohu přehrát od-do, co chci
-
koncepty (způsoby/možnosti) zálohování databáze,
- je možné udělat cold backup a hot backup (to se liší podle toho, jestli je databáze v provozu nebo ne)
- cold backup
- jednoduchý, neběží se, nikoho to neovlivní, v klidu si zazálohuju, co potřebuju, všechno je sesynchronizované
- ale vyžaduje to, aby byla databáze (tedy i systém) nějakou dobu mimo provoz
- hot backup - zálohování za provozu
- máme na to extension - pg_backup???
- musí pracovat s konzistentností databáze, aby zachytil do backupu konzistentní databázi a zároveň nedošlo k výpadku
- zamrazí si kontext databáze (aby byla na začátku a konci backupu konzistentní)
- mezitím sleduje ukládané WAL logy během provozu a ty pak taky dosychronizuje
- online hot file system based backup - přístup, kdy se používá PITR - pravidelně se provádí hot backup a od té doby se pak ukládají WAL logy, které je pak možné libovolně přehrát a dostat databázi do konzistentního stavu
- teoreticky se tady dá zmínit i logická replikace - kdy při selhání serveru lze nahrát data z replikovaného serveru (ale jenom DML operace) a na tyhle účely to spíš není dělaný (nebo se to v praxi nepoužívá)
-
logická struktura PostgreSQL clusteru,
- cluster je takový “obal” pro celé fungování databáze
- můžeme tam mít více databází, máme jeden port
- na úrovni clusteru nám žijí uživatelé s různými oprávněními
- adresářovou strukturu jsem už zmínil
- databáze postgres
- je to třetí defaultní databáze vedle template0, template1 - to je pak základ pro nově vytvářené DATABÁZE
- template0 se většinou nemění, to slouží jako holý základ
- template1 se může upravit pro specifické use-cases, pokud chci, aby vytvořené tabulky nějak vypadaly (už měly nějakou strukturu, pohledy, trigerry apod.)
- templatů můžu mít více
- je to třetí defaultní databáze vedle template0, template1 - to je pak základ pro nově vytvářené DATABÁZE
- databáze postgres
- v rámci clusteru je zafixovaná verze postgresu - můžu mít více clusterů s různými verzemi
- v clusteru se nachází
- databáze - ze začátku postgres, template0 a template1
- schémata - pg_catalog, information_schema (což jsou takový “vydestilovaný, lépe popsaný, s metadatama, splňují standard SQL” pohledy do pg_catalogu (aka data dictionary))
- defaultní je public, můžu přidávat další
- databázové objekty - tabulky, trigerry, pohledy, sekvance, indexy…
- uživatelé (roles) a oprávnění (privileges)
- adresářově (v PGDATA) jsou i konfigurační soubory, adresáře na WAL logy
-
jak lze přistupovat k ladění DB serveru,
- je to iterativní proces
- mohu sbírat statistiky (např. pomocí pg_stat_statements rozšíření) a sledovat, jaké dotazy jsou náročné (trvají dlouho, jsou často vykonávané) apod.
- pak mohu tyto dotazy pomocí explain či explain analyse zobrazit prováděcí plán a jejich cost - pak mohu optimalizovat jednotlivé části
- optimalizace např. pomocí - indexů (které bych taky měl sledovat, protože zase nevyužívané indexy zabírají celkem dost místa a zpomalují DML operace - protože index se musí udržovat aktuální
- pomocí materializovaných pohledů - klauzule REFRESH na aktualizaci
- to je uložený výsledek dotazu - není aktualizovaný
- pomocí materializovaných pohledů - klauzule REFRESH na aktualizaci
- další způsob, jak zlepšit výkon je příkaz Analyse - aktualizuje interní statistiky pro optimalizátor
- můžu provádět zátěžové testy databáze - pgbench
- také mohu odhalit nějaké problematické části např. v HTML vygenerovém z pgBadger
- tablespaces - můžu ovlivňovat, kam se jaká data ukládají podle jejich nátury
- diskový prostor pak můžu zlepšovat i přes vacuum a vacuum full
- chci provádět monitoring, sledovat databázi a všímat si anomálií
-
co je to data dictionary a k čemu se používá,
- je to soubor tabulek a pohledů, která drží metadata o databázových objektech a jejich stavu
- nachází se ve schématu pg_catalog, kde jsou tabulky, které drží informace k ostatním db objektům (tabulky, schémata, funkce apod.), statistiky, metadata apod.
- information_schema pak je schema, které přidává další metadata (hlavně pro lehčí využití adminama, a pro GUIčka jako je pgAdmin
- db administrátor pomocí správných dotazů do data dictionary může zjistit prakticky cokoliv a změnit prakticky cokoliv
-
jak PostgreSQL pracuje s koncepty role a uživatel,
- nic jako přímo uživatel v postgresu neexistuje
- uživatel je ROLE s atributem LOGIN
- v rámci clusteru mám tedy různé role s různými atributy a oprávněními
- jiné možnosti přístupu či manipulace s konkrétními daty
- roli mohu přiřadit i skupinám uživatelů
- grant a revoke
- hierarchie rolí - mohou se dědit
-
jak se konfiguruje přístup, autentizace a autorizace k PostgreSQL,
- autorizace se dělá podle rolí a jejich atributů (tedy jestli mohou vytvářet db (CREATEDB), či upravovat data/mazat data atd., přistupovat k různým databázím atd.)
- grant a revoke práv
- autentizace se konfiguruje v rámci pg_hba.conf souboru
- můžu povolit přístup jenom z konkrétních IP adres (host, připojování přes TCP/IP)
- peer - přístup je, že se autentizuju uživatelem na stroji
- trust - bez omezení přístupu (jenom pro testovací účely)
- local - přes sockety (db stroj musí být na stejném serveru/stroji)
- password
- cert
- v postgres.conf je nastavení na listen_adresses
- existuje něco jako row-level-security - omezování přístupu na bázi řádků (pokročilejší)
- autorizace se dělá podle rolí a jejich atributů (tedy jestli mohou vytvářet db (CREATEDB), či upravovat data/mazat data atd., přistupovat k různým databázím atd.)
-
co je to extension a jak se s ní pracuje,
- rozšíření funkcionality postgresu - jsou nějaké oficiální a přímo podporované vývojáři postgresu - ale většina je ze 3. stran
- jsou jich tisíce
- rozšíření se musí aktivovat příkazem ? a pak už ho mohu normálně používat
- existuje na to tabulka v rámci data dictionary
- např.
- pg_stat_statements
- fdw - foreign data wrappers
- PL/pgSQL - procedural language - přidává logiku procedurálního jazyka do funkcí, procedur, trigerrů atd. (cykly, podmínky apod.) a umožňuje tvořit komplexnější databázové aplikace
-
jak byste postupovali při ladění problematického SQL dotazu,
- můžu si ze statistik zjistit, kdy a jak často se provádí a jaký je kontext jeho provádění, abych to na to mohl přizpůsobit
- nejdřív EXPLAIN → prováděcí plán + cost
- zjistím, kde jsou ty “náročné” části a které mohu optimalizovat
- např. předpočítat si nějakou část, vytvořit index nad nějakým sloupcem
- nějaká data dát dohromady v tabulkách atd.
- rozdělit náročný dotaz na menší dotazy (tím ulevím i optimalizátoru)
- opakovaně pouštím explain a dívám se na prováděcí plán a jak se mění cost
- zjistím, kde jsou ty “náročné” části a které mohu optimalizovat
- mohu také používat explain analyse
- což by mělo skutečně ten dotaz provést a zobrazit skutečnou cenu dotazu
- většinou je to iterativní proces
-
co je databázový benchmark,
- je to test výkonu databázového stroje
- jedná se o sled operací, které testují nějakou část systému
- často se jedná o zátěžový test (který simuluje velkou zátěž od hodně klientů, či náročné operace), někdy se můžou testovat krajní a nepravděpodobné scénáře a sleduje se, jak se s tím databáze poradí
- sledují se statistiky a výsledky a podle toho se pak administrátor může zaměřit na konkrétní části systému, které selhaly/jsou pomalé/neoptimální apod.
- pg_bench, sleduju pomocí pgBadger
- TBC-B test
-
princip možnosti a omezení logické replikace v PostgreSQL,
- logická replikace funguje na principu publisher - subscriber problému
- hlavní databáze (publisher) provádí změny, odbavuje dotazy apod. a vytváří WAL logy, které jsou pak posílány na subscribery (těch může být víc) a ty je pak aplikují na data u sebe
- tvoří se 2 hlavní objekty - publication (to jsou tabulky či schémata, která se budou replikovat) a subscription (kde se specifikuje, která publication se bude replikovat)
- pak se provede intitial snapshot (první převedení/zkopírování dat)
- a pak se samotné replikování děje přes WAL logy generované publisherem - ty si pak ukládá do replication slotu (který má pro každou “přihlášenou” subscription), kde si drží a ukládá WAL logy, které použije pro replikaci - drží si tak LSN - log sequence number, aby jsme věděli, v jakém stavu replikace je
- v tom slotu jsou proto, že se WAL logy mohou checkpointem smazat / zneplatnit, tak aby to nenarušilo tu logickou replikaci
- nemusí se replikovat celá databáze, ale třeba jenom nějaké tabulky či schémata
- je to jednosměrný proces, tedy změny dat na subscriber databázi neovlivní data na publisher databázi
- omezení: není to plnohodnotné, myslím, že se propagují jenom DML operace (data manipulation language), takže vytváření tabulek atd. se nereplikuje
- další omezení je, že to není plnohodnotná záloha
- takže, když to chci nastavit, tak se musí manuálně vytvořit tabulky, které se budou mezi sebou replikovat na obou serverech najednou
- v případě výpadku publishera se dají data zpětně nahrát z subcribera
- synchronní a asynchronní replikace
- synchronní funguje tak, že než se skutečně provede nějaká operace, tak se čeká na potvrzení, že i subcriber je připraven zapsat/změnit, a až to udělá, tak se pošle výstup/zpětná vazba
- je to pomalejší, ale mám jistotu, že jsou data synchronizovaná
- moc se to nepoužívá
-
co je to grafová databáze,
- je to typ NoSQL databáze, která ukládá data specifickým způsobem - jako grafy
- tedy můžeme definovat vrcholy, hrany, atributy i u obou
- ideální pro reprezentaci grafových dat a problémů, blbý pro agregační funkce
- např. sociální sítě, vztahy mezi entitami apod.
- jsou mnohem výkonnější v řešení grafových problémů (hledání vztahů, hledání cesty apod.)
- nejsou tak dobré v horizontálním škálování na další serverech (synchronizace dat mezi jednotlivými servery je složitější než u jiných NoSQL databází)
- mají svoje specifální dotazové jazyky, které zohledňují grafová data
- využití
- sociální sítě - vztahy mezi uživateli, dosahy apod.
- bankovní podvody
- znalostní grafy pro AI
- optimalizace dopravy
- rodokmeny
- doporučovací systémy
-
jak vypadá datový model grafové databáze Neo4j,
- je to multilabeled property multigraph
- máme entity jako vrcholy - které mají svoje atributy (vlastnosti, properties)
- vztahy mezi těmito vrcholy (entitami) udávají hrany - každá hrana je orientovaná (ale nějak vyhledávat, či “chodit” po hranách se dá oboustranně, jenom má tu informaci) a může mít několik labelů, které charakterizují či upřesňují typ hrany/relace
- každou hranu můžeme pomocí labelů a properties “charakterizovat” jinak a tam můžeme modelovat komplexní vztahy
- data se dají hezky vizualizovat
-
jaký je koncept jazyka Cypher
- je to jazyk trochu založený na ASCII artu
- jednotlivé vrcholy a hrany reprezentuje
()->---<-
takhle nějak
- jednotlivé vrcholy a hrany reprezentuje
- je to dotazovací jazyk pro databázi Neo4j
- myslím, že se dá použít i na jiné grafové databáze než Neo4j
- mohu s ním modelovat vztahy a doptávat se na vrcholy a další vtahy apod.
- je to deklarativní jazyk na bázi ASCII artu
- hlavní klauzule MATCH, která udává pattern, který v databázi hledáme
- sekundární jazyk Gremlin
- je to jazyk trochu založený na ASCII artu