БпСстСтС 15% ΠΎΡ‚ всички хостинг услуги

ВСствай умСнията си ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠžΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° Π·Π° всСки хостинг ΠΏΠ»Π°Π½

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ΄: Skills Π—Π° Π½Π°Ρ‡Π°Π»ΠΎ
Заглавия
Linux Администрация Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ

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 Π·Π° слоТни натоварвания.

ЀункцияPostgreSQLMySQL 8.xMariaDB 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 logBinary log
МодСл Π½Π° конкурСнтностMVCC (Π±Π΅Π· Π·Π°ΠΊΠ»ΡŽΡ‡Π²Π°Π½ΠΈΡ ΠΏΡ€ΠΈ Ρ‡Π΅Ρ‚Π΅Π½Π΅)MVCCMVCC
ЛогичСска рСпликацияДа (публикация/Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ‚)Π”Π°Π”Π°
Обвивки Π·Π° външни Π΄Π°Π½Π½ΠΈΠ”Π° (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 locally

PgBouncer Π½Π΅ Π΅ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ Π·Π° прилоТСния с ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 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 прСдоставя Π΄Π²Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅, всСки подходящ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ†Π΅Π»ΠΈ Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅.

ΠœΠ΅Ρ‚ΠΎΠ΄ Π·Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π’ΠΈΠΏ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅RPORTOΠ‘Π»ΡƒΡ‡Π°ΠΉ Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°
ЛогичСско Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅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 queries

PostGIS Π·Π° гСопространствСни прилоТСния

# 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=onpg_stat_statements, pgcryptoΠ’Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»Π½ΠΎ + Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅
Анализи / OLAPВисок work_mem, ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΈ workers, synchronous_commit=offpg_partman, tablefuncРаздСлянС + ΠΊΠΎΠ»ΠΎΠ½Π½ΠΎ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅
Π’Ρ€Π΅ΠΌΠ΅Π²ΠΈ Ρ€Π΅Π΄ΠΎΠ²Π΅ IoTРаздСлянС ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅, настройванС Π½Π° autovacuumTimescaleDB, pg_partmanΠ˜Π·Ρ€ΡΠ·Π²Π°Π½Π΅ Π½Π° дяловС + компрСсия
ГСопространствСно / GISΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π΅Π½ΠΈ индСкси, effective_io_concurrencyPostGIS, pg_routingDedicated 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 основния ΡΡŠΡ€Π²ΡŠΡ€, ΠΈΠ·Ρ‡Π°ΠΊΠ°ΠΉΡ‚Π΅ Π΄Π° сС синхронизира ΠΈ слСд Ρ‚ΠΎΠ²Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ΅Ρ‚Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€Π°Π½ΠΎ ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅.