Replication үндэс
Нэг л PostgreSQL сервер ажиллаж байвал тэр сервер унавал бүх систем зогсоно. Replication нь нэг серверийн өгөгдлийг автоматаар нөгөө серверт хуулж байдаг механизм юм. Энэ нь хоёр том зорилготой: найдвартай байдал (primary унавал standby引き継ぐ) ба гүйцэтгэл (уншилтын хүсэлтийг олон сервер дээр тараах). Энэ хичээлд онол болон тохиргооны үндсийг авч үзнэ.
Primary ба Standby — үндсэн ойлголт
PostgreSQL replication нь primary (мастер) серверт бичигдсэн бүх өөрчлөлтийг нэг буюу хэд хэдэн standby (replica) серверт дамжуулдаг:
Хэрэглэгч
│
▼
┌─────────────┐ WAL stream ┌──────────────────┐
│ Primary │ ─────────────► │ Standby (read) │
│ (бичих) │ │ (зөвхөн унших) │
└─────────────┘ └──────────────────┘
WAL (Write-Ahead Log) нь PostgreSQL-н дотоод өөрчлөлтийн бүртгэл юм. Replication нь энэ WAL-г standby серверт дамжуулж, тэр нь хэрэгжүүлнэ.
-- Primary серверийн replication статусыг харах
SELECT
client_addr AS replica_хаяг,
state AS төлөв,
sent_lsn AS илгээсэн_байрлал,
write_lsn AS бичсэн_байрлал,
flush_lsn AS хадгалсан_байрлал,
replay_lsn AS хэрэгжүүлсэн_байрлал,
sync_state AS синхрон_төрөл
FROM pg_stat_replication;
Streaming Replication тохиргоо
Бодит тохиргоо хийхийн тулд postgresql.conf ба pg_hba.conf файлд өөрчлөлт оруулна:
# postgresql.conf — Primary сервер дээр
wal_level = replica # WAL-д replication мэдээлэл нэмэх
max_wal_senders = 3 # Хамгийн ихдээ 3 standby зэрэг холбогдож болно
wal_keep_size = 1GB # Standby хоцорсон үед WAL хадгалах хэмжээ
listen_addresses = '*' # Гаднаас холбогдох зөвшөөрөл
# pg_hba.conf — Primary сервер дээр
# Standby серверийн IP хаягаас replication эрх олгох
host replication replicator 192.168.1.101/32 scram-sha-256
-- Primary сервер дээр: replication хэрэглэгч үүсгэх
CREATE ROLE replicator REPLICATION LOGIN PASSWORD 'нууцүг456';
# Standby сервер дээр: Primary-аас анхны хуулбар авах
pg_basebackup \
--host=192.168.1.100 \
--username=replicator \
--pgdata=/var/lib/postgresql/data \
--wal-method=stream \
--progress \
--verbose
Synchronous vs Asynchronous
-- postgresql.conf дээр synchronous_commit тохируулах
-- Асинхрон (default) — хурдан, гэхдээ primary унавал
-- сүүлийн хэдхэн transaction алдагдаж болно
synchronous_commit = off
-- Синхрон — аюулгүй, арай удаан
-- Primary нь standby WAL бүртгэснийг баталгаажуулсны дараа л COMMIT буцаана
synchronous_commit = on
synchronous_standby_names = 'standby1'
| | Asynchronous | Synchronous | |---|---|---| | Хурд | Хурдан | Арай удаан | | Өгөгдөл алдагдах эрсдэл | Бага зэрэг | Огт байхгүй | | Хэрэглээ | Ерөнхий систем | Санхүү, банк |
Standby сервер дээр уншилт
Standby сервер нь ердийн байдлаар зөвхөн standby горимд байдаг ба хэрэглэгчид холбогдож уншилт хийх боломжгүй. Hot Standby горимд уншилтын асуулгыг зөвшөөрдөг:
# postgresql.conf — Standby сервер дээр
hot_standby = on
-- Standby серверийн хоцрогдлыг шалгах
SELECT
NOW() - pg_last_xact_replay_timestamp() AS хоцрогдол;
-- Жишээ: 00:00:00.5 — хагас секундын хоцрогдолтой байна
Уншилтын хүсэлтийг standby рүү чиглүүлснээр primary серверийн ачааллыг хөнгөлж болно — энэ нь read scaling буюу уншилтын хүчин чадлыг нэмэгдүүлэх нийтлэг арга юм.
Logical Replication — сонгомол хуулалт
Streaming replication нь бүх өгөгдлийг хуулдаг. Logical replication нь зөвхөн тодорхой хүснэгтүүдийг хуулж болдог:
-- Primary сервер дээр
ALTER SYSTEM SET wal_level = 'logical';
-- (restart шаардлагатай)
-- Publication үүсгэх — хуулах хүснэгтийг зааж өгөх
CREATE PUBLICATION my_pub FOR TABLE orders, products;
-- Standby сервер дээр
CREATE SUBSCRIPTION my_sub
CONNECTION 'host=192.168.1.100 dbname=myapp user=replicator password=нууцүг456'
PUBLICATION my_pub;
Logical replication нь PostgreSQL хувилбар хооронд өгөгдөл шилжүүлэхэд, зөвхөн тодорхой хүснэгтүүдийг нөөцлөхөд маш хэрэгтэй.
Дараагийн хичээлд:
pg_dump, pg_restore ашиглан өгөгдлийн санг backup хийж, сэргээх аргуудыг сурна — системийн аюулгүй байдлын хамгийн чухал хэсэг.