Фреймворк Fresh, построенный на базе Deno, ориентирован на создание высокопроизводительных веб-приложений с минимальной нагрузкой на сервер. В современных приложениях критически важна надежная работа с базой данных и обеспечение высокой доступности данных. Репликация баз данных является ключевым механизмом для масштабирования и отказоустойчивости.
Репликация — это процесс копирования данных с одной базы данных (мастера) на одну или несколько других баз (реплик), обеспечивая синхронизацию и доступность информации. В контексте Fresh репликация тесно связана с архитектурой серверной части, где каждый запрос может обрабатываться как чтением с реплики, так и записью на мастер.
Мастер-слейв (Master-Slave)
Мульти-мастер (Multi-Master)
Логическая и физическая репликация
Fresh не предоставляет собственный встроенный слой для работы с базой данных, но интегрируется с современными базами данных, такими как PostgreSQL, MySQL или SQLite через Deno-совместимые драйверы.
Пример конфигурации для PostgreSQL с мастер-слейв репликацией:
import { Client } from "https://deno.land/x/postgres/mod.ts";
const master = new Client({
user: "user",
database: "app",
hostname: "master.db.local",
password: "password",
port: 5432,
});
const replica = new Client({
user: "user",
database: "app",
hostname: "replica.db.local",
password: "password",
port: 5432,
});
// Подключение
await master.connect();
await replica.connect();
В приложении Fresh запись следует направлять на мастер, а чтение — на реплику:
async function createUser(data: User) {
await master.queryArray("INSERT INTO users (name, email) VALUES ($1, $2)", data.name, data.email);
}
async function getUsers() {
const result = await replica.queryArray("SELECT * FROM users");
return result.rows;
}
Такой подход позволяет разделять нагрузку на чтение и запись, предотвращая узкие места на мастер-сервере.
Асинхронная репликация может приводить к лагу данных, когда реплика отстает от мастера. В Fresh важно учитывать это при построении бизнес-логики. Для критически точных операций чтение лучше выполнять с мастера, а для менее критичных — с реплик.
Механизмы контроля:
Fresh поддерживает рендеринг на сервере и может использовать кеширование на уровне страниц или компонентов. Репликация влияет на стратегию кеширования:
// Пример стратегии кеширования с учетом реплики
const users = await getUsers(); // чтение с реплики
const html = renderPage({ users });
cache.se t("users_page", html, { ttl: 30 }); // ttl в секундах
Для крупных приложений необходимо:
Пример запроса для PostgreSQL:
SELECT
client_addr,
state,
sync_state,
write_lag,
flush_lag,
replay_lag
FROM pg_stat_replication;
Эти данные помогают своевременно выявлять узкие места и поддерживать отказоустойчивость приложения.
Репликация в Fresh становится основой для построения надежных, масштабируемых и высокопроизводительных веб-приложений, позволяя эффективно распределять нагрузку, поддерживать отказоустойчивость и обеспечивать актуальность данных.