Upload files to "/"
This commit is contained in:
178
POSTGRESQL.md
Normal file
178
POSTGRESQL.md
Normal file
@@ -0,0 +1,178 @@
|
||||
# 🐘 PostgreSQL
|
||||
|
||||
## Přehled
|
||||
|
||||
PostgreSQL je nejpokročilejší open-source relační databáze s důrazem na rozšiřitelnost, standardy SQL a spolehlivost. Vývoj od 1996, silná komunita, aktivní release cyklus (major verze každý rok).
|
||||
|
||||
## Architektura
|
||||
|
||||
### Procesový model
|
||||
|
||||
```text
|
||||
Postmaster (supervisor)
|
||||
├── Backend process (1 per connection)
|
||||
├── WAL writer
|
||||
├── Checkpointer
|
||||
├── Autovacuum launcher
|
||||
├── Stats collector
|
||||
├── Logical replication launcher
|
||||
└── Archiver (WAL archiving)
|
||||
```
|
||||
|
||||
Každé spojení = vlastní OS proces (ne vlákno). Výhoda: izolace, stabilita. Nevýhoda: vyšší memory footprint u tisíců spojení → nutný connection pooler (PgBouncer).
|
||||
|
||||
### MVCC (Multi-Version Concurrency Control)
|
||||
|
||||
Každá transakce vidí snapshot dat z okamžiku startu. Staré verze řádků (tuple) zůstávají v tabulce:
|
||||
|
||||
- INSERT vytvoří nový tuple s `xmin = current_xid`
|
||||
- DELETE označí tuple `xmax = current_xid` (nezmizí hned)
|
||||
- UPDATE = DELETE old + INSERT new
|
||||
- VACUUM fyzicky maže tuple starší než nejstarší aktivní snapshot
|
||||
|
||||
### VACUUM a autovacuum
|
||||
|
||||
| Parametr | Popis | Výchozí |
|
||||
|----------|-------|---------|
|
||||
| `autovacuum_vacuum_threshold` | Min. mrtvých řádků pro spuštění | 50 |
|
||||
| `autovacuum_vacuum_scale_factor` | % z tabulky jako threshold | 0.2 (20 %) |
|
||||
| `autovacuum_analyze_threshold` | Min. změněných řádků pro ANALYZE | 50 |
|
||||
| `autovacuum_vacuum_cost_limit` | Limituje I/O vacuum (prevence zátěže) | 200 |
|
||||
| `autovacuum_naptime` | Interval mezi kontrolami | 1 min |
|
||||
| `deadlock_timeout` | Detekce deadlocků | 1 s |
|
||||
|
||||
**Příznaky nedostatečného vacuum**: růst tabulky (bloat), zhoršení výkonu index scanů, XID wraparound hazard.
|
||||
|
||||
### WAL (Write-Ahead Log)
|
||||
|
||||
Append-only log všech změn pro crash recovery a replikaci:
|
||||
|
||||
```conf
|
||||
wal_level = replica # nebo logical
|
||||
archive_mode = on
|
||||
archive_command = 'aws s3 cp %p s3://backups/pg-wal/%f'
|
||||
```
|
||||
|
||||
**PITR (Point-In-Time Recovery)**:
|
||||
1. Restore base backup (pg_basebackup)
|
||||
2. Replay WAL archivů až k cílovému času
|
||||
3. `recovery_target_time = '2026-06-03 10:30:00 UTC'`
|
||||
|
||||
### Replication slots
|
||||
|
||||
- **Physical** — zaručuje, že WAL není smazán masterem, dokud ho replica nespotřebuje
|
||||
- **Logical** — pro logickou replikaci (selektivní tabulky, transformace dat)
|
||||
- **Riziko**: pokud replica spadne, WAL naroste na disku (disk full)
|
||||
- Monitoring: `pg_replication_slots`, `pg_stat_replication`
|
||||
|
||||
### Konfigurace
|
||||
|
||||
Hlavní soubory (dle Obe & Hsu):
|
||||
- `postgresql.conf` — paměť, síť, logování, storage
|
||||
- `pg_hba.conf` — přístupová práva
|
||||
- `pg_ident.conf` — mapování OS uživatelů na PostgreSQL role
|
||||
|
||||
### AI-Ready PostgreSQL 18
|
||||
|
||||
(Kumar, Linster, 2026) — PostgreSQL 18 jako unified platform pro transakce, analytiku a AI:
|
||||
|
||||
| Oblast | Technika |
|
||||
|--------|----------|
|
||||
| Vektory | pgvector — embeddingy přímo v řádcích tabulky |
|
||||
| Hybridní pattern | Semantic recall → SQL filtrování |
|
||||
| LLM integrace | PostgreSQL + MCP (Model Context Protocol) |
|
||||
| Embedding pipeline | Batch i stream generování embeddingů |
|
||||
|
||||
**Hybridní dotaz**:
|
||||
```sql
|
||||
SELECT p.*, pm.name
|
||||
FROM products p
|
||||
JOIN product_embeddings pe ON p.id = pe.product_id
|
||||
WHERE pe.embedding <-> '[0.1, 0.3, ...]' < 0.8
|
||||
AND p.in_stock = true
|
||||
AND p.price < 100.00
|
||||
ORDER BY pe.embedding <-> '[0.1, 0.3, ...]'
|
||||
LIMIT 10;
|
||||
```
|
||||
|
||||
### Rozšíření (extensions)
|
||||
|
||||
| Extension | Účel |
|
||||
|-----------|-------|
|
||||
| pgvector | Vektorové vyhledávání pro AI/embeddings |
|
||||
| PostGIS | Geografická data, prostorové dotazy |
|
||||
| pg_stat_statements | Monitoring výkonu dotazů |
|
||||
| pg_duckdb | Analytické dotazy (DuckDB engine uvnitř PG) |
|
||||
| pg_search | Full-text a hybridní vyhledávání |
|
||||
| pg_cron | Scheduling úloh v DB |
|
||||
| citus | Horizontální škálování (sharding) |
|
||||
| timescaledb | Time-series optimalizace |
|
||||
| pgaudit | Auditní logování |
|
||||
|
||||
## Connection pooling
|
||||
|
||||
| Pooler | Typ | Protokol |
|
||||
|--------|-----|----------|
|
||||
| PgBouncer | Proxy (transaction/session) | PostgreSQL wire |
|
||||
| Odyssey | Proxy (multithreaded) | PostgreSQL wire |
|
||||
| pgpool-II | Proxy (replication, load balancing) | PostgreSQL wire |
|
||||
| RDS Proxy | Managed proxy (AWS) | PostgreSQL wire |
|
||||
|
||||
**PgBouncer režimy**:
|
||||
- **Session pooling** — spojení drženo po celou dobu session (aplikace) → overhead
|
||||
- **Transaction pooling** — spojení vráceno po dokončení transakce → efektivnější (vyžaduje bezstavovost)
|
||||
|
||||
## Doporučení — v čem je PostgreSQL lepší
|
||||
|
||||
| Oblast | PostgreSQL | Konkurence | Proč PG |
|
||||
|--------|-----------|------------|---------|
|
||||
| **Rozšiřitelnost** | Extensions, custom types, operators, index methods | MySQL omezené | Lze přidat cokoliv od vektorů po full-text v DB |
|
||||
| **SQL standard** | Nejbližší ANSI SQL | MySQL odbočky (GROUP BY, ALTER TABLE) | Přenositelnost, méně překvapení |
|
||||
| **Geoprostorová data** | PostGIS (zlatý standard GIS) | MySQL GIS (omezený) | Jediná reálná open-source volba pro GIS |
|
||||
| **Konzistence** | SSI serializable, foreign keys, CHECK, exclusions | MySQL MyISAM bez FK, InnoDB jen RC | Vhodné pro finanční a kritické systémy |
|
||||
| **Concurrent读写** | MVCC bez reader/writer blokování | MySQL InnoDB reader blokuje writer (a naopak) u starších verzí | Lepší škálovatelnost čtení |
|
||||
| **AI/vektory** | pgvector nativně v DB | Samostatná vektorová DB (zvýšení latence) | Hybridní dotazy v jediném SQL |
|
||||
| **Licence** | PostgreSQL license (MIT-like) | MySQL dvojí licence (Oracle) | Žádná vendor lock-in |
|
||||
|
||||
### Kdy použít PostgreSQL
|
||||
|
||||
- **Enterprise aplikace** — vyžadují ACID, referenční integritu, komplexní transakce
|
||||
- **Geografické systémy** — GIS, mapové aplikace, lokalitní služby
|
||||
- **Finanční systémy** — účetnictví, banking, compliance (audit logging, SSI)
|
||||
- **AI / RAG aplikace** — hybridní vektorové + relační dotazy v jedné DB
|
||||
- **Analytika na relačních datech** — pg_duckdb, materializované views, window functions
|
||||
- **Multi-tenant aplikace** — row-level security, schemas per tenant
|
||||
|
||||
## PostgreSQL licensing
|
||||
|
||||
| Varianta | Licence | Cena | Omezení |
|
||||
|----------|---------|------|---------|
|
||||
| **PostgreSQL** | PostgreSQL license (MIT-like) | $0 | Žádná — lze používat, modifikovat, distribuovat v komerčních produktech. Není potřeba žádný "commercial license" |
|
||||
| **Amazon Aurora PostgreSQL** | Proprietary (AWS) | ~$0.10-1.00/hod | AWS managed, PostgreSQL compatible. AWS smí používat PG kód díky PostgreSQL license |
|
||||
| **YugabyteDB** | Apache 2.0 | $0 (core) | PostgreSQL kompatibilní distributed SQL, postaveno na PG query layer |
|
||||
| **TimescaleDB** | Apache 2.0 (community) / Timescale License (enterprise) | $0 (community) | Časově řadová rozšíření PostgreSQL. Enterprise: tiered storage, compression, multi-node |
|
||||
|
||||
**Klíčové**: PostgreSQL license je jedna z nejliberálnějších — umožňuje cloud providerům (AWS, GCP, Azure) nabízet PostgreSQL jako managed službu bez omezení. To je rozdíl oproti MongoDB (SSPL) a Redis (RSALv2). Díky tomu má PostgreSQL nejširší cloud podporu ze všech databází.
|
||||
|
||||
**Dopad na výběr**: Žádný license risk, žádný vendor lock-in, žádné skryté náklady. PostgreSQL je bezpečná volba pro jakýkoliv projekt.
|
||||
|
||||
### Kdy použít něco jiného
|
||||
|
||||
- **Jednoduchý web / blog** → SQLite (v embedded scénáři lehčí)
|
||||
- **High-throughput key-value** → Redis (o řád nižší latence)
|
||||
- **Time-series v masivním měřítku** → TimescaleDB, InfluxDB
|
||||
- **Globálně distribuovaná data** → CockroachDB, Spanner
|
||||
- **Full-text search primárně** → Elasticsearch
|
||||
|
||||
## Zdroje
|
||||
|
||||
Odkazy, knihy a standardy: [sources/databases/sources.md](sources/databases/sources.md)
|
||||
|
||||
### Doporučená literatura
|
||||
|
||||
| Kniha | Autoři | ISBN | Popis |
|
||||
|-------|--------|------|-------|
|
||||
| PostgreSQL: Up and Running (3rd ed.) | Regina Obe, Leo Hsu | 978-1491962935 | Praktický průvodce administrací, konfigurací a extensions |
|
||||
| AI-Ready PostgreSQL 18 | Kumar, Linster | — | PostgreSQL jako unified platform pro AI workloads |
|
||||
|
||||
*Poslední revize: 2026-06-03*
|
||||
Reference in New Issue
Block a user