Налаштування Read Replicas для масштабування читання бази даних
Read Replicas — реплік бази даних, які приймають лише SELECT-запити. Дозволяють горизонтально масштабувати навантаження на читання без зміни архітектури програми.
Сценарії застосування
- Розділена навантаження: API-запити читають з реплік, транзакції пишуть у мастер
- Аналітичні запити (складні JOIN, агрегації) йдуть на виділену реплік
- Різні програми використовують різні реплік (CMS-бекенд, публічний API, звіти)
PostgreSQL: кілька реплік
# Створення реплік через pg_basebackup
pg_basebackup -h master-host -U replication_user \
-D /var/lib/postgresql/14/main -P -Xs -R
Маршрутизація у програмі
Laravel (PHP)
// config/database.php
'pgsql' => [
'read' => [
['host' => '192.168.1.11'],
['host' => '192.168.1.12'],
],
'write' => [
'host' => '192.168.1.10',
],
'sticky' => true,
]
Node.js (Sequelize)
const sequelize = new Sequelize('myapp', 'user', 'password', {
dialect: 'postgres',
replication: {
read: [
{ host: '192.168.1.11', port: 5432 },
{ host: '192.168.1.12', port: 5432 },
],
write: { host: '192.168.1.10', port: 5432 },
},
})
pgBouncer read/write split
# pgbouncer.ini
[databases]
myapp = host=192.168.1.10 port=5432 dbname=myapp
myapp_read = host=192.168.1.11,192.168.1.12 port=5432 dbname=myapp
Управління лагом репліцирування
Критична проблема: запис → негайне читання може прочитати старі дані, якщо репліка відстає.
-- На мастері: відправити LSN клієнту
SELECT pg_current_wal_lsn();
Паттерн у програмі:
def read_after_write(lsn):
replica = get_replica()
if replica.is_caught_up(lsn):
return replica.execute(query)
else:
return master.execute(query)
AWS RDS Read Replicas
aws rds create-db-instance-read-replica \
--db-instance-identifier myapp-replica-1 \
--source-db-instance-identifier myapp-master \
--db-instance-class db.r6g.large
Моніторинг реплік
-- На мастері: статус усіх реплік
SELECT application_name, client_addr, state,
round(EXTRACT(EPOCH FROM replay_lag)) as replay_lag_sec
FROM pg_stat_replication;
Тривалість
Налаштування двох Read Replicas з балансуванням у програмі — 1–2 робочих дні.







