PostgreSQL Π½Π° VPS: ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΈ Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅
PostgreSQL Π΅ ΡΡΡΠ²ΡΡΡΠ΅Π½ΡΡΠ²Π°Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠ½ΠΎ-ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ (ORDBMS) Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π·Π°ΡΠ²ΠΊΠΈ ΡΡΠ΅Π· SQL ΠΈ JSON, ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ Π½Π° ACID, ΠΈ ΡΠ°Π·ΡΠΈΡΡΠ΅ΠΌΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ. ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΠ°Π·Π³ΡΡΠ½Π΅ Π½Π° Virtual Private Server, ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΈΠ·ΡΠΈΡΠ»ΠΈΡΠ΅Π»Π½ΠΈ ΡΠ΅ΡΡΡΡΠΈ, ΠΏΡΠ»Π΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° Π½ΠΈΠ²ΠΎ ΡΠ΄ΡΠΎ ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²Π° ΠΈΠ·ΠΎΠ»Π°ΡΠΈΡ β Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈΡΡ Ρ ΠΎΡΡΠΈΠ½Π³ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈ.
ΠΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½ΠΈΡ ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Π΅ ΠΎΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅: Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ shared_buffers ΠΏΡΠΈ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ Ρ
ΠΎΡΡΠΈΠ½Π³ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½Π°, Π½Π΅ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½Π° Π·Π°ΡΠ²ΠΊΠ° ΠΎΡ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ Π½Π° ΡΡΡΠ΅Π΄ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅ΡΠΏΠΈ Π²Π°ΡΠΈΡ I/O, ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠΎ PostGIS ΠΈΠ»ΠΈ pg_partman Π±Π΅Π· root Π΄ΠΎΡΡΡΠΏ. VPS Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ° ΠΈ ΡΡΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΠ°ΡΠΎ PostgreSQL ΠΏΡΠ΅Π²ΡΠ·Ρ ΠΎΠΆΠ΄Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΈ Π·Π° RDBMS Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ°, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° VPS, ΡΠΈ ΡΡΡΡΠ²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ°Π²ΠΈ PostgreSQL ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π½ΠΈΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» ΠΏΡΠ΅Π΄ MySQL/MariaDB Π·Π° ΡΠ»ΠΎΠΆΠ½ΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½ΠΈΡ.
| Π€ΡΠ½ΠΊΡΠΈΡ | PostgreSQL | MySQL 8.x | MariaDB 10.x |
|---|---|---|---|
| ACID ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ | ΠΡΠ»Π½ΠΎ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ DDL | ΠΡΠ»Π½ΠΎ | ΠΡΠ»Π½ΠΎ |
| JSON/JSONB ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ | ΠΠ°ΡΠΈΠ²Π΅Π½ JSONB Ρ GIN ΠΈΠ½Π΄Π΅ΠΊΡΠΈ | JSON (Π±Π΅Π· Π΄Π²ΠΎΠΈΡΠ½ΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅) | JSON (Π±Π΅Π· Π΄Π²ΠΎΠΈΡΠ½ΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅) |
| ΠΠ΅ΠΎΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° | PostGIS (ΠΈΠ½Π΄ΡΡΡΡΠΈΠ°Π»Π΅Π½ ΡΡΠ°Π½Π΄Π°ΡΡ) | ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ | ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ |
| ΠΡΠ»Π½ΠΎΡΠ΅ΠΊΡΡΠΎΠ²ΠΎ ΡΡΡΡΠ΅Π½Π΅ | ΠΠ³ΡΠ°Π΄Π΅Π½ΠΎ, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΠΌΠΎ | ΠΡΠ½ΠΎΠ²Π΅Π½ FULLTEXT ΠΈΠ½Π΄Π΅ΠΊΡ | ΠΡΠ½ΠΎΠ²Π΅Π½ FULLTEXT ΠΈΠ½Π΄Π΅ΠΊΡ |
| Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ | ΠΠ΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎ, range/list/hash | ΠΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ | ΠΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ |
| ΠΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ | ΠΠ° (ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΠΌΠΈ workers) | ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ | ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ |
| ΠΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ | ΠΠ° (CREATE TYPE) | ΠΠ΅ | ΠΠ΅ |
| Π‘ΡΡ ΡΠ°Π½Π΅Π½ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ (PL/pgSQL) | ΠΡΠ»Π΅Π½ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅Π½ Π΅Π·ΠΈΠΊ | ΠΡΠ½ΠΎΠ²Π΅Π½ | ΠΡΠ½ΠΎΠ²Π΅Π½ |
| Write-ahead logging (WAL) | ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΠΌΠΎ, ΠΏΠΎΡΠΎΡΠ½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ | Binary log | Binary log |
| ΠΠΎΠ΄Π΅Π» Π½Π° ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΡΡ | MVCC (Π±Π΅Π· Π·Π°ΠΊΠ»ΡΡΠ²Π°Π½ΠΈΡ ΠΏΡΠΈ ΡΠ΅ΡΠ΅Π½Π΅) | MVCC | MVCC |
| ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ | ΠΠ° (ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ/Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ) | ΠΠ° | ΠΠ° |
| ΠΠ±Π²ΠΈΠ²ΠΊΠΈ Π·Π° Π²ΡΠ½ΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ | ΠΠ° (postgres_fdw ΠΈ Π΄Ρ.) | ΠΠ΅ | ΠΠ΅ |
ΠΠΎΠ΄Π΅Π»ΡΡ Multi-Version Concurrency Control (MVCC) Π½Π° PostgreSQL Π·Π°ΡΠ»ΡΠΆΠ°Π²Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΠ°Ρ ΠΏΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅ ΠΈ ΠΏΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΠ°Ρ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅. Π’ΠΎΠ²Π° Π΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΎ ΠΏΡΠ΅Π²ΡΠ·Ρ ΠΎΠ΄ΡΡΠ²ΠΎ Π·Π° ΡΠΌΠ΅ΡΠ΅Π½ΠΈ OLTP/OLAP Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½ΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ Π΄ΡΠ»Π³ΠΎΡΡΠ°ΠΉΠ½ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΈΠ½Π°ΡΠ΅ Π±ΠΈΡ Π° Π·Π°ΠΊΠ»ΡΡΠΈΠ»ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠΈ.
ΠΠΊΠΎΠ½ΠΎΠΌΠΈΡΠ΅ΡΠΊΠ° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ: Π Π°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈ Π±Π΅Π· ΡΠ²ΡΡΡ ΠΏΡΠΎΠ²ΠΈΠ·ΠΈΡΠ°Π½Π΅
ΠΠ»Π°Π½ΡΡ Π·Π° VPS Π₯ΠΎΡΡΠΈΠ½Π³ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°Π½ΠΈ CPU ΡΠ΄ΡΠ°, RAM ΠΈ NVMe SSD ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ°Π»ΠΊΠ° ΡΠ°ΡΡ ΠΎΡ ΡΠ΅Π½Π°ΡΠ° Π½Π° ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ Ρ
Π°ΡΠ΄ΡΠ΅Ρ. ΠΠΊΠΎΠ½ΠΎΠΌΠΈΡΠ΅ΡΠΊΠ°ΡΠ° Π»ΠΎΠ³ΠΈΠΊΠ° Π΅ ΠΏΡΠΎΡΡΠ°: ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° ΠΏΠ°ΠΌΠ΅Ρ Π½Π° PostgreSQL ΡΠ΅ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Ρ Ρ max_connections ΠΈ work_mem, Π° Π½Π΅ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°. ΠΡΠ°Π²ΠΈΠ»Π½ΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½ VPS Ρ 4 GB RAM, ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Ρ 50 Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ Π²ΡΡΠ·ΠΊΠΈ, ΡΠ΅ ΠΏΡΠ΅Π²ΡΠ·Ρ
ΠΎΠΆΠ΄Π° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ Ρ 8 GB RAM Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈ 200 Π½Π΅Π°ΠΊΡΠΈΠ²Π½ΠΈ Π²ΡΡΠ·ΠΊΠΈ, ΠΊΠΎΠ½ΡΡΠΌΠΈΡΠ°ΡΠΈ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ.
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°ΡΠ° ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ Π·Π° ΠΈΠΊΠΎΠ½ΠΎΠΌΠΈΡΠ΅ΡΠΊΠ° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ Π΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Ρ VPS ΠΎΡ ΡΡΠ΅Π΄Π½ΠΎ Π½ΠΈΠ²ΠΎ, Π΄Π° ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ°ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ ΡΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ pg_stat_activity ΠΈ pg_stat_bgwriter ΡΠ»Π΅Π΄ Π΄Π²Π΅ ΡΠ΅Π΄ΠΌΠΈΡΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°ΡΠ΅ Π²Π΅ΡΡΠΈΠΊΠ°Π»Π½ΠΎ. Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄, ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π° ΡΠ΅ΡΡΠ°ΡΠ° Π³ΡΠ΅ΡΠΊΠ° Π½Π° ΡΠ²ΡΡΡ
ΠΏΡΠΎΠ²ΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅.
ΠΠ΄ΠΈΠ½ ΡΠ΅ΡΡΠΎ ΠΏΡΠ΅Π½Π΅Π±ΡΠ΅Π³Π²Π°Π½ ΡΠ°ΠΊΡΠΎΡ Π·Π° ΡΠ°Π·Ρ
ΠΎΠ΄ΠΈΡΠ΅: Π΄Π΅ΠΌΠΎΠ½ΡΡ autovacuum Π½Π° PostgreSQL ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ΅Π·Π΅ΡΠ² ΠΎΡ CPU. ΠΡΠΈ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ Ρ
ΠΎΡΡΠΈΠ½Π³ autovacuum ΡΠ΅ΡΡΠΎ ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π° ΠΎΡ Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ°, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΈΡΠΈΠ½ΡΠ²Π° ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅ ΠΈ Π²Π»ΠΎΡΠ΅Π½ΠΈ ΠΏΠ»Π°Π½ΠΎΠ²Π΅ Π·Π° Π·Π°ΡΠ²ΠΊΠΈ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ. ΠΠ° VPS Π²ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΡΠ΅ autovacuum_vacuum_cost_delay ΠΈ autovacuum_max_workers Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ.
ΠΡΠ»Π΅Π½ root Π΄ΠΎΡΡΡΠΏ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°
ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ Π·Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈΠ»ΠΈ Π‘ΠΏΠΎΠ΄Π΅Π»Π΅Π½ Π£Π΅Π± Π₯ΠΎΡΡΠΈΠ½Π³, VPS Π²ΠΈ Π΄Π°Π²Π° Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠ»ΠΎΡ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. Π’ΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ β ΡΠΎ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ Π·Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° PostgreSQL.
ΠΠ°ΠΊΠ²ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° root Π΄ΠΎΡΡΡΠΏΡΡ, ΠΊΠΎΠ΅ΡΠΎ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ Π±Π»ΠΎΠΊΠΈΡΠ°Ρ:
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π·Π° PostgreSQL (
CREATE EXTENSION postgis,CREATE EXTENSION pg_trgm,CREATE EXTENSION timescaledb) - ΠΡΠΎΠΌΡΠ½Π° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ, ΠΊΠΎΠΈΡΠΎ ΠΏΡΡΠΊΠΎ Π²Π»ΠΈΡΡΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° PostgreSQL (
vm.overcommit_memory,vm.swappiness,huge_pages) - ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π°
pg_hba.confΡ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ (SCRAM-SHA-256, LDAP, ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ ΡΡΠ΅Π· ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ) - ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π°
pg_upgradeΠ·Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π±Π΅Π· Π½Π°ΠΌΠ΅ΡΠ° Π½Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° - ΠΠΎΠ½ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠΎΠΌΠΎΠ²Π΅ Π·Π° tablespace Π½Π° ΠΎΡΠ΄Π΅Π»Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π·Π° I/O ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΈ heap ΡΠ°ΠΉΠ»ΠΎΠ²Π΅
ΠΡΠΈΡΠΈΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π·Π° PostgreSQL Π½Π° Linux:
# Disable transparent huge pages (causes latency spikes in PostgreSQL)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# Set vm.overcommit_memory to allow PostgreSQL shared memory allocation
sysctl -w vm.overcommit_memory=2
sysctl -w vm.overcommit_ratio=80
# Reduce swappiness to prevent paging PostgreSQL shared buffers
sysctl -w vm.swappiness=1
# Persist these settings
echo "vm.overcommit_memory=2" >> /etc/sysctl.conf
echo "vm.overcommit_ratio=80" >> /etc/sysctl.conf
echo "vm.swappiness=1" >> /etc/sysctl.confΠ’Π΅Π·ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ° Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠΈ Π·Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ Π·Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ° ΡΠ΅ΡΡΠ° ΠΎΡΠ½ΠΎΠ²Π½Π° ΠΏΡΠΈΡΠΈΠ½Π° Π·Π° Π½Π΅ΠΎΠ±ΡΡΠ½ΠΈΠΌΠΎ Π²Π»ΠΎΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π² PostgreSQL ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ, Ρ ΠΎΡΡΠ²Π°Π½ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ°.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°: ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π² postgresql.conf, ΠΊΠΎΠΈΡΠΎ Π½Π°ΠΈΡΡΠΈΠ½Π° ΠΈΠΌΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° Π½Π° PostgreSQL ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΠ° ΡΠΌΠΈΡΠ»Π΅Π½ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½ΠΈ β ΡΠ΅ ΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Ρ 256 MB RAM ΠΎΡ Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° 2000-ΡΠ΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ. ΠΠ° ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π΅Π½ VPS Ρ 4β16 GB RAM ΠΈ NVMe ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΎΡΡΠ°Π²ΡΡ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΡΠ°ΡΡ ΠΎΡ Ρ Π°ΡΠ΄ΡΠ΅ΡΠ½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π΅ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°
# postgresql.conf β tuned for a 8 GB RAM VPS, OLTP workload
# Set to 25% of total RAM
shared_buffers = 2GB
# Estimate of OS cache available to PostgreSQL (typically 50-75% of RAM)
effective_cache_size = 6GB
# Per-sort/hash operation memory (multiply by max_connections for worst case)
work_mem = 32MB
# For VACUUM, CREATE INDEX, ALTER TABLE operations
maintenance_work_mem = 512MB
# Enable huge pages if kernel supports it
huge_pages = tryΠΠ°ΠΏΠ°Π½ΡΡ work_mem: ΠΠ°Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° work_mem = 256MB Ρ max_connections = 100 ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ PostgreSQL ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΠΈ 25,6 GB RAM ΡΠ°ΠΌΠΎ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠΎΡΡΠΈΡΠ°Π½Π΅ β Π΄Π°Π»Π΅Ρ Π½Π°Π΄Π²ΠΈΡΠ°Π²Π°ΠΉΠΊΠΈ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠ°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ ΠΈ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΉΠΊΠΈ OOM ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½ΠΈΡ. ΠΠΈΠ½Π°Π³ΠΈ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°ΠΉΡΠ΅ work_mem ΠΊΠ°ΡΠΎ: (available_RAM - shared_buffers) / (max_connections * 2).
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ ΠΈ WAL
# For NVMe SSD storage β set to 1 for spinning disks, 200 for NVMe
random_page_cost = 1.1
effective_io_concurrency = 200
# WAL configuration for durability vs. performance tradeoff
wal_buffers = 64MB
checkpoint_completion_target = 0.9
checkpoint_timeout = 10min
# For write-heavy workloads, consider asynchronous commit
# (risk: last ~1 transaction lost on crash, not data corruption)
synchronous_commit = on # Keep 'on' for financial dataΠ£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²ΡΡΠ·ΠΊΠΈΡΠ΅
# Avoid setting this above what your application actually needs
max_connections = 100
# Use PgBouncer in transaction pooling mode for high-concurrency apps
# A VPS allows you to install and configure PgBouncer locallyPgBouncer Π½Π΅ Π΅ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»Π΅Π½ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 50 Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ. ΠΡΠ΅ΠΊΠΈ backend ΠΏΡΠΎΡΠ΅Ρ Π½Π° PostgreSQL ΠΊΠΎΠ½ΡΡΠΌΠΈΡΠ° ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½ΠΎ 5β10 MB RAM. ΠΡΠΈ 200 Π²ΡΡΠ·ΠΊΠΈ ΡΠΎΠ²Π° ΡΠ° 1β2 GB, ΠΊΠΎΠ½ΡΡΠΌΠΈΡΠ°Π½ΠΈ ΠΎΡ Π½Π΅Π°ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ. PgBouncer Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΌΡΠ»ΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠ° ΡΡΠΎΡΠΈΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ½ΠΈ Π²ΡΡΠ·ΠΊΠΈ ΠΊΡΠΌ ΠΌΠ°Π»ΡΠΊ ΠΏΡΠ» ΠΎΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈ PostgreSQL backends.
# Install PgBouncer on Debian/Ubuntu
apt install pgbouncer
# Minimal pgbouncer.ini configuration
cat /etc/pgbouncer/pgbouncer.ini[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
listen_port = 6432
listen_addr = 127.0.0.1
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20Π£ΠΊΡΠ΅ΠΏΠ²Π°Π½Π΅ Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ°: ΠΡΠ²ΡΠ΄ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅
ΠΡΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ Π½Π° PostgreSQL Π½Π° VPS ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠ° Π² ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ°, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°ΡΠ²ΠΎΡΠ΅Π½ΠΈ, ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΡΠ° Π΄Π° ΡΡΠ°Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΎΡ ΠΌΡΠ΅ΠΆΠ°ΡΠ°.
ΠΠ·ΠΎΠ»Π°ΡΠΈΡ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΎ Π½ΠΈΠ²ΠΎ
PostgreSQL Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ»ΡΡΠ° Π½Π° ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ IP, ΠΎΡΠ²Π΅Π½ Π°ΠΊΠΎ Π½Π΅ Π΅ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. Π‘Π²ΡΡΠΆΠ΅ΡΠ΅ Π³ΠΎ Ρ localhost ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ SSH ΡΡΠ½Π΅Π»ΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ VPN Π·Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠ°Π½Π΅.
# In postgresql.conf
listen_addresses = 'localhost'
# For replication or application servers on a private network only
# listen_addresses = '127.0.0.1,10.0.0.1'ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅ pg_hba.conf Π·Π° Π½Π°Π»Π°Π³Π°Π½Π΅ Π½Π° SCRAM-SHA-256 ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ (ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΡ md5 Π΅ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΡΠΊΠΈ ΡΠ»Π°Π±):
# /etc/postgresql/16/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all all scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
# Reject all other connections by default (no catch-all line)SSL/TLS ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Π·Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ Π²ΡΡΠ·ΠΊΠΈ
ΠΠΊΠΎ Π²Π°ΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ ΡΡΡΠ²ΡΡ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π° Ρ PostgreSQL ΠΏΠΎ ΠΌΡΠ΅ΠΆΠ°, ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ. ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΠΉΡΠ΅ ΡΠΎΠ²Π° Ρ SSL Π‘Π΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π·Π° Π²Π°ΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ ΡΠ»ΠΎΠΉ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡ TLS ΡΡΠ΅ΠΊ Π½Π° PostgreSQL:
# Generate a self-signed certificate for internal use
openssl req -new -x509 -days 365 -nodes
-out /etc/postgresql/16/main/server.crt
-keyout /etc/postgresql/16/main/server.key
chmod 600 /etc/postgresql/16/main/server.key
chown postgres:postgres /etc/postgresql/16/main/server.{crt,key}# postgresql.conf
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_min_protocol_version = 'TLSv1.2'ΠΠΎΠ½ΡΡΠΎΠ» Π½Π° Π΄ΠΎΡΡΡΠΏΠ°, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΡΠΎΠ»ΠΈ
ΠΡΠΈΠ½ΡΠΈΠΏΡΡ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΡΠ΅ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΡΡΡΠΈΠΊΡΠ½ΠΎ ΠΊΡΠΌ ΡΠΎΠ»ΠΈΡΠ΅ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ:
-- Create an application role with minimal permissions
CREATE ROLE app_user WITH LOGIN PASSWORD 'strong_password_here';
GRANT CONNECT ON DATABASE mydb TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
-- Create a read-only analytics role
CREATE ROLE analytics_reader WITH LOGIN PASSWORD 'another_strong_password';
GRANT CONNECT ON DATABASE mydb TO analytics_reader;
GRANT USAGE ON SCHEMA public TO analytics_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO analytics_reader;
-- Never use the superuser 'postgres' role for application connectionsΠΡΠ°Π²ΠΈΠ»Π° Π½Π° Π·Π°ΡΠΈΡΠ½Π°ΡΠ° ΡΡΠ΅Π½Π°
# Allow PostgreSQL only from specific application server IP
ufw allow from 10.0.0.5 to any port 5432
ufw deny 5432
# Verify
ufw status verboseΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π·Π° Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅
PostgreSQL ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π΄Π²Π° ΠΏΡΠΈΠ½ΡΠΈΠΏΠ½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅, Π²ΡΠ΅ΠΊΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΅Π»ΠΈ Π·Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅.
| ΠΠ΅ΡΠΎΠ΄ Π·Π° Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ | ΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ | Π’ΠΈΠΏ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ | RPO | RTO | Π‘Π»ΡΡΠ°ΠΉ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° |
|---|---|---|---|---|---|
| ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎ Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ | pg_dump / pg_dumpall | ΠΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° Π½ΠΈΠ²ΠΎ ΠΎΠ±Π΅ΠΊΡ | Π§Π°ΡΠΎΠ²Π΅ | Π‘ΡΠ΅Π΄Π½ΠΎ | ΠΠΈΠ³ΡΠ°ΡΠΈΠΈ Π½Π° ΡΡ Π΅ΠΌΠΈ, ΡΠ΅Π»Π΅ΠΊΡΠΈΠ²Π½ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ |
| Π€ΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎ Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ | pg_basebackup | ΠΡΠ»Π½ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° | ΠΠΈΠ½ΡΡΠΈ (Ρ WAL) | ΠΡΡΠ·ΠΎ | ΠΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΏΡΠΈ Π±Π΅Π΄ΡΡΠ²ΠΈΠ΅, ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° standby |
| ΠΠ΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ | WAL Π°ΡΡ
ΠΈΠ²ΠΈΡΠ°Π½Π΅ + pg_basebackup | ΠΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ | Π‘Π΅ΠΊΡΠ½Π΄ΠΈ | ΠΠ°Π²ΠΈΡΠΈ ΠΎΡ ΠΎΠ±Π΅ΠΌΠ° Π½Π° WAL | ΠΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ Π·Π° Π½ΡΠ»Π΅Π²Π° Π·Π°Π³ΡΠ±Π° Π½Π° Π΄Π°Π½Π½ΠΈ |
| Π‘Π½ΠΈΠΌΠΊΠ° | Π‘Π½ΠΈΠΌΠΊΠ° ΠΎΡ VPS Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° | ΠΡΠ»Π½ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ° | ΠΡΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΡΠ½ΠΈΠΌΠΊΠ°ΡΠ° | ΠΡΡΠ·ΠΎ | ΠΡΠ΅Π΄ΠΏΠ°Π·Π½Π° ΠΌΡΠ΅ΠΆΠ° ΠΏΡΠ΅Π΄ΠΈ Π½Π°Π΄Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ |
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎ Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ Ρ ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡ:
# Dump a single database in custom format (supports parallel restore)
pg_dump -U postgres -Fc -Z 9 mydb > /backup/mydb_$(date +%Y%m%d).dump
# Restore
pg_restore -U postgres -d mydb_restored /backup/mydb_20240115.dump
# Dump all databases including roles and tablespaces
pg_dumpall -U postgres | gzip > /backup/full_cluster_$(date +%Y%m%d).sql.gzΠ€ΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎ Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ Π·Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΏΡΠΈ Π±Π΅Π΄ΡΡΠ²ΠΈΠ΅:
# Take a base backup (can run while PostgreSQL is live)
pg_basebackup -U replication_user -D /backup/base -Ft -z -Xs -P
# This creates base.tar.gz and pg_wal.tar.gz
# Combined with WAL archiving, enables point-in-time recoveryΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Ρ cron:
# /etc/cron.d/postgres-backup
0 2 * * * postgres pg_dump -Fc mydb > /backup/mydb_$(date +%Y%m%d_%H%M).dump
0 3 * * 0 postgres pg_dumpall | gzip > /backup/full_$(date +%Y%m%d).sql.gz
# Prune backups older than 30 days
0 4 * * * root find /backup/ -name "*.dump" -mtime +30 -deleteΠΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡ: ΠΠ΅ΡΡΠΈΠΊΠ°Π»Π½Π°, Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½Π° ΠΈ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ ΠΏΡΠΈ ΡΠ΅ΡΠ΅Π½Π΅
ΠΠ΅ΡΡΠΈΠΊΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅
ΠΠ° VPS Π²Π΅ΡΡΠΈΠΊΠ°Π»Π½ΠΎΡΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ (Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° CPU, RAM, ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅) ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈΠ»ΠΈ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ°ΠΌΠΎ ΠΊΡΠ°ΡΠΊΠΎ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅. Π‘Π»Π΅Π΄ Π½Π°Π΄Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° RAM Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ shared_buffers, effective_cache_size ΠΈ work_mem ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΎΠ½Π°Π»Π½ΠΎ. Π‘Π»Π΅Π΄ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° CPU ΡΠ΄ΡΠ° ΡΠ²Π΅Π»ΠΈΡΠ΅ΡΠ΅ max_parallel_workers_per_gather ΠΈ max_parallel_maintenance_workers.
# After upgrading from 4 to 8 CPU cores
max_parallel_workers_per_gather = 4
max_parallel_maintenance_workers = 2
max_parallel_workers = 8ΠΠΎΡΠΎΡΠ½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π·Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ ΠΏΡΠΈ ΡΠ΅ΡΠ΅Π½Π΅
ΠΠ³ΡΠ°Π΄Π΅Π½Π°ΡΠ° ΠΏΠΎΡΠΎΡΠ½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π½Π° PostgreSQL ΡΡΠ·Π΄Π°Π²Π° Π³ΠΎΡΠ΅Ρ standby, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π° Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅, ΡΠ°Π·ΡΠΎΠ²Π°ΡΠ²Π°ΠΉΠΊΠΈ Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈΡΠ΅ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½ΠΈΡ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΡΡΡΠ²ΡΡ:
# On primary: create replication user
psql -U postgres -c "CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'rep_password';"
# In pg_hba.conf on primary
# host replication replicator 10.0.0.2/32 scram-sha-256
# In postgresql.conf on primary
# wal_level = replica
# max_wal_senders = 3
# wal_keep_size = 1GB# On standby: initialize from primary
pg_basebackup -h 10.0.0.1 -U replicator -D /var/lib/postgresql/16/main
-P -Xs -R
# The -R flag creates standby.signal and populates primary_conninfo automaticallyΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π·Π° ΡΠ΅Π»Π΅ΠΊΡΠΈΠ²Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ ΠΊΡΠΌ Π΄ΡΡΠ³Π° PostgreSQL ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π° ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄ΠΈ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ:
-- On publisher
CREATE PUBLICATION analytics_pub FOR TABLE orders, customers, products;
-- On subscriber
CREATE SUBSCRIPTION analytics_sub
CONNECTION 'host=10.0.0.1 dbname=mydb user=replicator password=rep_password'
PUBLICATION analytics_pub;ΠΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠΈ Dedicated Server Π·Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ VPS ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΡΠΈ ΡΡΠ°ΡΠΈΠΊΠ° Π·Π° ΡΠ΅ΡΠ΅Π½Π΅, ΡΠ°Π·ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΠΈ ΠΈΠΊΠΎΠ½ΠΎΠΌΠΈΡΠ΅ΡΠΊΠ° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ.
Π Π°Π·ΡΠΈΡΠ΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° PostgreSQL, ΠΊΠΎΠΈΡΠΎ ΡΠΈ ΡΡΡΡΠ²Π° Π΄Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅
JSONB Π·Π° Ρ ΠΈΠ±ΡΠΈΠ΄Π½ΠΈ ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈ/Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ½ΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½ΠΈΡ
-- Create a table with JSONB column
CREATE TABLE events (
id BIGSERIAL PRIMARY KEY,
occurred_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
payload JSONB NOT NULL
);
-- Create a GIN index for fast JSONB queries
CREATE INDEX idx_events_payload ON events USING GIN (payload);
-- Query nested JSON efficiently
SELECT * FROM events
WHERE payload @> '{"type": "purchase", "currency": "USD"}';
-- Extract and index a specific JSON key
CREATE INDEX idx_events_user_id ON events ((payload->>'user_id'));Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ Π·Π° Π³ΠΎΠ»Π΅ΠΌΠΈ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ
-- Range partitioning by month (ideal for time-series data)
CREATE TABLE measurements (
id BIGSERIAL,
recorded_at TIMESTAMPTZ NOT NULL,
sensor_id INT,
value NUMERIC
) PARTITION BY RANGE (recorded_at);
CREATE TABLE measurements_2024_01
PARTITION OF measurements
FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
CREATE TABLE measurements_2024_02
PARTITION OF measurements
FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
-- PostgreSQL automatically routes inserts and prunes partitions in queriesPostGIS Π·Π° Π³Π΅ΠΎΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
# Install PostGIS extension
apt install postgresql-16-postgis-3
# Enable in database
psql -U postgres -d mydb -c "CREATE EXTENSION postgis;"-- Store and query geographic coordinates
CREATE TABLE locations (
id SERIAL PRIMARY KEY,
name TEXT,
geom GEOMETRY(Point, 4326)
);
-- Find all locations within 10km of a point
SELECT name, ST_Distance(geom::geography, ST_MakePoint(-73.935242, 40.730610)::geography) AS distance_m
FROM locations
WHERE ST_DWithin(geom::geography, ST_MakePoint(-73.935242, 40.730610)::geography, 10000)
ORDER BY distance_m;ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³: Π‘ΡΠ΅ΠΊ Π·Π° Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΡΡ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ PostgreSQL
Π Π΅Π°ΠΊΡΠΈΠ²Π½ΠΎΡΠΎ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅ΠΈΠ·ΠΏΡΠ°Π²Π½ΠΎΡΡΠΈ Π΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ. ΠΡΠΎΠ°ΠΊΡΠΈΠ²Π½ΠΈΡΡ ΡΡΠ΅ΠΊ Π·Π° Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΡΡ ΠΎΡΠΊΡΠΈΠ²Π° Π²Π»ΠΎΡΠ°Π²Π°Π½Π΅ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΠ½Π΅ Π² ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅.
ΠΠ³ΡΠ°Π΄Π΅Π½ΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ Π½Π° PostgreSQL
-- Identify slow queries (requires pg_stat_statements extension)
CREATE EXTENSION pg_stat_statements;
SELECT query, calls, total_exec_time / calls AS avg_ms,
rows / calls AS avg_rows
FROM pg_stat_statements
ORDER BY avg_ms DESC
LIMIT 20;
-- Check for table bloat and vacuum status
SELECT schemaname, relname, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
-- Monitor replication lag
SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn,
(sent_lsn - replay_lsn) AS replication_lag_bytes
FROM pg_stat_replication;
-- Find long-running queries
SELECT pid, now() - pg_stat_activity.query_start AS duration, query, state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';Π‘ΡΠ΅ΠΊ Prometheus + postgres_exporter
# Install postgres_exporter
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.15.0/postgres_exporter-0.15.0.linux-amd64.tar.gz
tar xzf postgres_exporter-0.15.0.linux-amd64.tar.gz
mv postgres_exporter-0.15.0.linux-amd64/postgres_exporter /usr/local/bin/
# Create a monitoring role in PostgreSQL
psql -U postgres -c "CREATE ROLE postgres_exporter WITH LOGIN PASSWORD 'monitor_pass';"
psql -U postgres -c "GRANT pg_monitor TO postgres_exporter;"
# Run the exporter
export DATA_SOURCE_NAME="postgresql://postgres_exporter:monitor_pass@localhost:5432/postgres?sslmode=disable"
postgres_exporter --web.listen-address=":9187"ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΠΉΡΠ΅ postgres_exporter Ρ Grafana ΡΠ°Π±Π»ΠΎ (ID Π½Π° ΡΠ°Π±Π»ΠΎΡΠΎ 9628 ΠΎΡ grafana.com ΠΎΠ±Ρ
Π²Π°ΡΠ° Π²ΡΠΈΡΠΊΠΈ ΠΊΡΠΈΡΠΈΡΠ½ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π½Π° PostgreSQL) ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΈ Π·Π°: ΠΈΠ·ΠΎΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ°, Π½Π°Π΄Π²ΠΈΡΠ°Π²Π°ΡΠΎ 30 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ°Π²Π°Π½Π΅ Π½Π° ΠΎΠ±Π²ΠΈΠ²Π°Π½Π΅ Π½Π° ID Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°, ΡΠΏΠ°Π΄Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½ΡΠ° Π½Π° ΠΏΠΎΠΏΠ°Π΄Π΅Π½ΠΈΡ Π² ΠΊΠ΅ΡΠ° ΠΏΠΎΠ΄ 95% ΠΈ Π±ΡΠΎΠΉ ΠΌΡΡΡΠ²ΠΈ ΠΊΠΎΡΡΠ΅ΠΆΠΈ, Π½Π°Π΄Π²ΠΈΡΠ°Π²Π°Ρ 10% ΠΎΡ ΠΆΠΈΠ²ΠΈΡΠ΅ ΠΊΠΎΡΡΠ΅ΠΆΠΈ.
ΠΠ°ΡΡΠΈΡΠ° Π½Π° ΡΠ»ΡΡΠ°ΠΈΡΠ΅ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°: Π‘ΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° PostgreSQL Ρ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ
| ΠΠ°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ | ΠΠ»ΡΡΠΎΠ²ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ | Π Π°Π·ΡΠΈΡΠ΅Π½ΠΈΡ | Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ Π·Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ |
|---|---|---|---|
| OLTP (Π΅-ΡΡΡΠ³ΠΎΠ²ΠΈΡ, SaaS) | ΠΠΈΡΡΠΊ work_mem, PgBouncer, synchronous_commit=on | pg_stat_statements, pgcrypto | ΠΠ΅ΡΡΠΈΠΊΠ°Π»Π½ΠΎ + ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ |
| ΠΠ½Π°Π»ΠΈΠ·ΠΈ / OLAP | ΠΠΈΡΠΎΠΊ work_mem, ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΈ workers, synchronous_commit=off | pg_partman, tablefunc | Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ + ΠΊΠΎΠ»ΠΎΠ½Π½ΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ |
| ΠΡΠ΅ΠΌΠ΅Π²ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ IoT | Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅, Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° autovacuum | TimescaleDB, pg_partman | ΠΠ·ΡΡΠ·Π²Π°Π½Π΅ Π½Π° Π΄ΡΠ»ΠΎΠ²Π΅ + ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡ |
| ΠΠ΅ΠΎΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½ΠΎ / GIS | ΠΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, effective_io_concurrency | PostGIS, pg_routing | Dedicated server Π·Π° Π³ΠΎΠ»Π΅ΠΌΠΈ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ |
| API backend (JSON) | GIN ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π²ΡΡΡ
Ρ JSONB, work_mem Π·Π° Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ | pg_trgm, uuid-ossp | Π Π΅ΠΏΠ»ΠΈΠΊΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ Π·Π° API Ρ ΠΏΡΠ΅ΠΎΠ±Π»Π°Π΄Π°Π²Π°ΡΠΈ GET Π·Π°ΡΠ²ΠΊΠΈ |
| ΠΡΠ»Π½ΠΎΡΠ΅ΠΊΡΡΠΎΠ²ΠΎ ΡΡΡΡΠ΅Π½Π΅ | ΠΠΎΠ»ΠΎΠ½ΠΈ tsvector, GIN ΠΈΠ½Π΄Π΅ΠΊΡΠΈ | pg_trgm, unaccent | Π‘ΠΊΠ°Π½ΠΈΡΠ°Π½ΠΈΡ ΡΠ°ΠΌΠΎ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, ΡΠ°ΡΡΠΈΡΠ½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ |
ΠΠ° Π΅ΠΊΠΈΠΏΠΈ, ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΡΠΈ API backends ΠΈΠ»ΠΈ ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° PostgreSQL Ρ VPS Ρ cPanel ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Π½ ΠΏΠ°Π½Π΅Π» Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΏΡΠ»Π½Π° Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. ΠΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΠΈ Π΅ΠΊΠΈΠΏΠΈ, ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ΅Π· CLI, VPS Control Panels ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΠΏΠΎ-ΡΠΈΡΠΎΠΊ ΠΈΠ·Π±ΠΎΡ ΠΎΡ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΏΠ°Π½Π΅Π»ΠΈ.
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Π½ ΡΠΏΠΈΡΡΠΊ ΠΏΡΠ΅Π΄ΠΈ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° PostgreSQL Π½Π° VPS
ΠΡΠ°Π·ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Ρ Π°ΡΠ΄ΡΠ΅ΡΠ°:
- ΠΠ·ΡΠΈΡΠ»Π΅ΡΠ΅
shared_buffersΠΊΠ°ΡΠΎ 25% ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ° RAM - ΠΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ NVMe SSD ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ β WAL Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π½Π° PostgreSQL ΡΠ° ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈ ΠΊΡΠΌ Π»Π°ΡΠ΅Π½ΡΠ½ΠΎΡΡ
- Π Π°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅ΡΠ΅ ΠΏΠΎΠ½Π΅ 2 ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ CPU ΡΠ΄ΡΠ° Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½ΠΈΡ
ΠΠ°Π·ΠΎΠ²Π° Π»ΠΈΠ½ΠΈΡ Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ°:
- Π‘Π²ΡΡΠΆΠ΅ΡΠ΅
listen_addressesΡΠ°ΠΌΠΎ Ρ ΡΠ°ΡΡΠ΅Π½/localhost - ΠΠ°ΠΌΠ΅Π½Π΅ΡΠ΅
md5Ρscram-sha-256Π²pg_hba.conf - ΠΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅ SSL Ρ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ TLS 1.2 Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ Π²ΡΡΠ·ΠΊΠΈ
- Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΎΠ»ΠΈ, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ β Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΡΠΏΠ΅ΡΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
postgresΠ² ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ - ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅
ufwΠΈΠ»ΠΈiptablesΠ·Π° ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°Π½Π΅ ΡΠ°ΠΌΠΎ Π½Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ IP Π°Π΄ΡΠ΅ΡΠΈ Π½Π° ΠΏΠΎΡΡ 5432
ΠΠ°Π·ΠΎΠ²Π° Π»ΠΈΠ½ΠΈΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°:
- ΠΠ΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅ transparent huge pages Π½Π° Π½ΠΈΠ²ΠΎ ΠΠ‘
- ΠΠ°Π΄Π°ΠΉΡΠ΅
vm.swappiness=1Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠ΅ΠΉΠ΄ΠΆΠΈΠ½Π³ Π½Π° ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈΡΠ΅ Π±ΡΡΠ΅ΡΠΈ - ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅ PgBouncer, Π°ΠΊΠΎ Π±ΡΠΎΡΡ Π½Π° Π²ΡΡΠ·ΠΊΠΈΡΠ΅ Π½Π°Π΄Π²ΠΈΡΠ°Π²Π° 50
- ΠΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅
pg_stat_statementsΠΎΡ ΡΠ°ΠΌΠΎΡΠΎ Π½Π°ΡΠ°Π»ΠΎ β ΡΠ΅ΡΡΠΎΠ°ΠΊΡΠΈΠ²Π½ΠΎΡΠΎ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ
ΠΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅:
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅
pg_dumpΡ cron, ΡΠ΅ΡΡΠ²Π°ΠΉΡΠ΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½ΠΈΡΡΠ° ΠΌΠ΅ΡΠ΅ΡΠ½ΠΎ - ΠΠ½Π΅Π΄ΡΠ΅ΡΠ΅ WAL Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅, Π°ΠΊΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° RPO ΡΠ° ΠΏΠΎΠ΄ 1 ΡΠ°Ρ
- ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΠΉΡΠ΅ Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π½ΠΈΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΡ ΡΠ½ΠΈΠΌΠΊΠΈ ΠΎΡ VPS Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° Π·Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠ»Π°ΡΡΠΎΠ²Π° Π·Π°ΡΠΈΡΠ°
ΠΠ°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΡΡ:
- Π Π°Π·Π³ΡΡΠ½Π΅ΡΠ΅
postgres_exporter+ Prometheus + Grafana ΠΏΡΠ΅Π΄ΠΈ ΠΏΡΡΠΊΠ°Π½Π΅ Π² Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠ°ΡΠΈΡ - ΠΠ°Π΄Π°ΠΉΡΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΈ Π·Π° ΠΈΠ·ΠΎΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ°, Π²ΡΠ·ΡΠ°ΡΡ Π½Π° ID Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ° ΠΈ ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½Ρ Π½Π° ΠΏΠΎΠΏΠ°Π΄Π΅Π½ΠΈΡ Π² ΠΊΠ΅ΡΠ°
- ΠΡΠ΅Π³Π»Π΅ΠΆΠ΄Π°ΠΉΡΠ΅
pg_stat_bgwriterΡΠ΅Π΄ΠΌΠΈΡΠ½ΠΎ Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΡΠΊ ΠΏΡΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈ ΡΠΎΡΠΊΠΈ
Π§ΠΠ
ΠΠΎΡ Π²Π΅ΡΡΠΈΡ Π½Π° PostgreSQL ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌ Π½Π° Π½ΠΎΠ² VPS?
ΠΠΈΠ½Π°Π³ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΡΡΠ°Π±ΠΈΠ»Π½ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (PostgreSQL 16 ΠΊΡΠΌ 2024 Π³.) ΠΎΡ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎΡΠΎ PGDG Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, Π° Π½Π΅ Π²Π΅ΡΡΠΈΡΡΠ°, Π²ΠΊΠ»ΡΡΠ΅Π½Π° Π² Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΡΠ° Π½Π° Linux. ΠΠ°ΠΊΠ΅ΡΠΈΡΠ΅ Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠΈΡΠ΅ ΡΠ΅ΡΡΠΎ ΠΈΠ·ΠΎΡΡΠ°Π²Π°Ρ Ρ 1β2 ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π²Π΅ΡΡΠΈΠΈ ΠΈ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΏΡΠ΅Π½Π°ΡΡΠ½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡ upstream. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ apt.postgresql.org ΠΈΠ»ΠΈ yum.postgresql.org Π·Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ.
ΠΠΎΠ»ΠΊΠΎ RAM Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ VPS Ρ PostgreSQL?
ΠΠ° ΠΌΠ°Π»ΠΊΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠ΄ 50 Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ Π²ΡΡΠ·ΠΊΠΈ ΠΈ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ ΠΏΠΎΠ΄ 50 GB, 4 GB RAM Π΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ. ΠΠ°Π΄Π°ΠΉΡΠ΅ shared_buffers = 1GB, work_mem = 16MB ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ PgBouncer. ΠΠ° Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ, Π½Π°Π΄Π²ΠΈΡΠ°Π²Π°ΡΠΈ Π½Π°Π»ΠΈΡΠ½Π°ΡΠ° RAM, ΡΠΎΠΊΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠ΅ Π²ΡΡΡ
Ρ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΠ»Π°Π½Π° Π·Π° Π·Π°ΡΠ²ΠΊΠΈ, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Ρ
Π°ΡΠ΄ΡΠ΅Ρ β Π»ΠΈΠΏΡΠ²Π°Ρ ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΡΠ°Π±Π»ΠΈΡΠ° ΠΎΡ 100 GB Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½ Ρ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° RAM.
ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π»ΠΈ Π΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ PostgreSQL ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ VPS?
ΠΠ°, Π·Π° ΠΌΠ°Π»ΠΊΠΈ Π΄ΠΎ ΡΡΠ΅Π΄Π½ΠΈ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½ΠΈΡ. Π ΠΈΡΠΊΡΡ Π΅ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡ Π·Π° ΡΠ΅ΡΡΡΡΠΈ: ΡΠΊΠΎΠΊ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° OOM ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ Π΄Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΡΡ PostgreSQL. Π‘ΠΌΠ΅ΠΊΡΠ΅ΡΠ΅ ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ oom_score_adj Π½Π° PostgreSQL Π½Π° ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ (ΠΏΡΠ°Π²Π΅ΠΉΠΊΠΈ Π³ΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π²Π΅ΡΠΎΡΡΠ΅Π½ Π·Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΡΠ²Π°Π½Π΅) ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ cgroups Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π²Π°Π½Π° Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
ΠΠ°ΠΊΠ²Π° Π΅ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ pg_dump ΠΈ pg_basebackup?
pg_dump ΡΡΠ·Π΄Π°Π²Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎ Π°ΡΡ
ΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΠ½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ β Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ° SQL ΠΈΠ·ΡΠ°Π·ΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Π΄Π²ΠΎΠΈΡΠ΅Π½ ΡΠΎΡΠΌΠ°Ρ, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²Π΅Π½ ΡΠ΅Π»Π΅ΠΊΡΠΈΠ²Π½ΠΎ (ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ, ΡΡ
Π΅ΠΌΠΈ). pg_basebackup ΠΊΠΎΠΏΠΈΡΠ° ΡΡΠ»Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Ρ Π΄Π°Π½Π½ΠΈ Π½Π° PostgreSQL Π½Π° Π΄Π²ΠΎΠΈΡΠ½ΠΎ Π½ΠΈΠ²ΠΎ, ΡΡΠ·Π΄Π°Π²Π°ΠΉΠΊΠΈ ΠΏΡΠ»Π½ΠΎ Π°ΡΡ
ΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°, ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΎ Π·Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΏΡΠΈ Π±Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° standby ΡΡΡΠ²ΡΡ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΈ Π΄Π²Π΅ΡΠ΅: pg_dump Π·Π° Π΄Π΅ΡΠ°ΠΉΠ»Π½ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½ΠΈΡ, pg_basebackup Π·Π° ΡΡΠ΅Π½Π°ΡΠΈΠΈ Π½Π° ΠΏΡΠ»Π½ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅.
ΠΠ°ΠΊ Π΄Π° Π½Π°Π΄Π³ΡΠ°Π΄Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ PostgreSQL Π΄ΠΎ Π½ΠΎΠ²Π° ΠΎΡΠ½ΠΎΠ²Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° VPS?
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ pg_upgrade Ρ ΡΠ»Π°Π³Π° --check ΠΏΡΡΠ²ΠΎ, Π·Π° Π΄Π° Π²Π°Π»ΠΈΠ΄ΠΈΡΠ°ΡΠ΅ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ°, Π±Π΅Π· Π΄Π° ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠ°ΠΏΡΠ°Π²Π΅ΡΠ΅ ΠΏΡΠ»Π½ΠΎ pg_basebackup ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅. Π‘Π°ΠΌΠΎΡΠΎ Π½Π°Π΄Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΎΡΠ»Π°ΠΉΠ½ (PostgreSQL ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΡΠΏΡΡΠ½). ΠΠ° Π½Π°Π΄Π³ΡΠ°ΠΆΠ΄Π°Π½ΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π±Π΅Π· ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ: Π½Π°ΡΡΡΠΎΠΉΡΠ΅ Π½ΠΎΠ²Π° PostgreSQL 16 ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ ΠΊΠ°ΡΠΎ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ Π°Π±ΠΎΠ½Π°Ρ Π½Π° PostgreSQL 15 ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΡΡΡΠ²ΡΡ, ΠΈΠ·ΡΠ°ΠΊΠ°ΠΉΡΠ΅ Π΄Π° ΡΠ΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ° ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ·Π²ΡΡΡΠ΅ΡΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠ°Π½ΠΎ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅.
ΠΎΡ Π²ΡΠΈΡΠΊΠΈ Ρ
ΠΎΡΡΠΈΠ½Π³ ΡΡΠ»ΡΠ³ΠΈ