Встречается на 25% собеседований по Go

Что такое репликация

Репликация — это процесс копирования и поддержания данных в синхронном или асинхронном порядке между несколькими базами данных или серверами. Она обеспечивает доступность данных на разных узлах, повышая отказоустойчивость, производительность и географическую распределённость систем. Репликация используется в распределённых базах данных (Cassandra, MongoDB) и реляционных СУБД, где основная цель — гарантировать доступность и надёжность данных.

Как это работает

Репликация основана на модели «ведущий-ведомый» (master-slave) или «ведущий-ведущий» (master-master). В ведущем узле выполняются операции записи, а изменения передаются на ведомые узлы (реплики). Реплики могут обслуживать запросы на чтение, снижая нагрузку на основной сервер. Передача изменений может быть синхронной или асинхронной, что определяет уровень согласованности и производительности.

Типы репликации

Синхронная репликация

При синхронной репликации данные одновременно записываются в основную и реплицированные базы. Транзакция считается завершённой только после подтверждения записи на всех репликах. Это обеспечивает высокую согласованность, но увеличивает задержки из-за ожидания подтверждений.

Асинхронная репликация

При асинхронной репликации изменения сначала записываются на основной сервер, а затем передаются на реплики в фоновом режиме. Основная система не ждёт подтверждения от реплик, что ускоряет операции записи. Однако возрастает риск рассинхронизации данных между узлами.

Цели репликации

  • Увеличение доступности: при сбое одного сервера система переключается на реплику, сохраняя работоспособность.
  • Распределение нагрузки: запросы чтения распределяются между репликами, снижая нагрузку на основной узел и улучшая время отклика.
  • Геораспределение: размещение реплик в разных регионах сокращает задержки для пользователей, находящихся ближе к конкретной реплике.
  • Безопасность данных: хранение копий на разных физических носителях защищает от потери данных при катастрофах.

Подводные камни

  • Согласованность: асинхронная репликация может привести к чтению устаревших данных, если реплика не успела получить обновления.
  • Конфликты записи: в топологиях с несколькими ведущими узлами возможны конфликты при одновременной записи в разные узлы.
  • Задержки: синхронная репликация увеличивает время отклика, что критично для высоконагруженных систем.
  • Сложность управления: необходимо мониторить состояние реплик, обрабатывать сбои и обеспечивать согласованность.

Пример на Go

В Go для работы с репликацией часто используют драйверы, поддерживающие настройку чтения с реплик. Например, в PostgreSQL через библиотеку pgx можно указать несколько адресов:

go
package main

import (
    "context"
    "fmt"
    "github.com/jackc/pgx/v5/pgxpool"
)

func main() {
    // Пул подключений с несколькими хостами: основной и реплика
    config, err := pgxpool.ParseConfig("postgres://user:pass@primary,replica1,replica2/dbname")
    if err != nil {
        panic(err)
    }

    pool, err := pgxpool.NewWithConfig(context.Background(), config)
    if err != nil {
        panic(err)
    }
    defer pool.Close()

    // Выполнение запроса на чтение (может быть направлено на реплику)
    var version string
    err = pool.QueryRow(context.Background(), "SELECT version()").Scan(&version)
    if err != nil {
        panic(err)
    }
    fmt.Println(version)
}

Коротко

  • Репликация — копирование данных на несколько узлов для доступности и надёжности.
  • Синхронная репликация гарантирует согласованность, но медленнее; асинхронная — быстрее, но возможны расхождения.
  • Основные цели: отказоустойчивость, распределение нагрузки, геораспределение, защита данных.
  • При использовании репликации важно учитывать компромисс между согласованностью и производительностью.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы