PostgreSQL / Replication үндэс

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 серверт дамжуулж, тэр нь хэрэгжүүлнэ.

sql
-- 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 файлд өөрчлөлт оруулна:

bash
# postgresql.conf — Primary сервер дээр
wal_level = replica          # WAL-д replication мэдээлэл нэмэх
max_wal_senders = 3          # Хамгийн ихдээ 3 standby зэрэг холбогдож болно
wal_keep_size = 1GB          # Standby хоцорсон үед WAL хадгалах хэмжээ
listen_addresses = '*'       # Гаднаас холбогдох зөвшөөрөл
bash
# pg_hba.conf — Primary сервер дээр
# Standby серверийн IP хаягаас replication эрх олгох
host replication replicator 192.168.1.101/32 scram-sha-256
sql
-- Primary сервер дээр: replication хэрэглэгч үүсгэх
CREATE ROLE replicator REPLICATION LOGIN PASSWORD 'нууцүг456';
bash
# Standby сервер дээр: Primary-аас анхны хуулбар авах
pg_basebackup \
    --host=192.168.1.100 \
    --username=replicator \
    --pgdata=/var/lib/postgresql/data \
    --wal-method=stream \
    --progress \
    --verbose

Synchronous vs Asynchronous

sql
-- 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 горимд уншилтын асуулгыг зөвшөөрдөг:

bash
# postgresql.conf — Standby сервер дээр
hot_standby = on
sql
-- Standby серверийн хоцрогдлыг шалгах
SELECT
    NOW() - pg_last_xact_replay_timestamp() AS хоцрогдол;
-- Жишээ: 00:00:00.5 — хагас секундын хоцрогдолтой байна

Уншилтын хүсэлтийг standby рүү чиглүүлснээр primary серверийн ачааллыг хөнгөлж болно — энэ нь read scaling буюу уншилтын хүчин чадлыг нэмэгдүүлэх нийтлэг арга юм.

Logical Replication — сонгомол хуулалт

Streaming replication нь бүх өгөгдлийг хуулдаг. Logical replication нь зөвхөн тодорхой хүснэгтүүдийг хуулж болдог:

sql
-- 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 хийж, сэргээх аргуудыг сурна — системийн аюулгүй байдлын хамгийн чухал хэсэг.