Какую функцию выполняет Slave-база данных в архитектуре Master-Slave (репликации)?

«Какую функцию выполняет Slave-база данных в архитектуре Master-Slave (репликации)?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В архитектуре репликации Master-Slave (или Source-Replica) Slave-база выполняет ключевую роль для масштабирования и повышения отказоустойчивости, разделяя операции чтения и записи.

Основные функции Slave:

  1. Масштабирование чтений (Read Scaling):

    • Все запросы на запись (INSERT, UPDATE, DELETE) идут на Master.
    • Запросы на чтение (SELECT) распределяются по одному или нескольким Slave-узлам.
    • Результат: Значительное снижение нагрузки на Master-узел и увеличение общей пропускной способности системы для операций чтения.
  2. Повышение доступности и аварийное восстановление:

    • Slave служит «горячей» резервной копией данных Master.
    • В случае сбоя Master-узла, один из Slave может быть повышен (promoted) до роли нового Master, минимизируя время простоя.
  3. Выполнение ресурсоемких задач:

    • На Slave можно безопасно запускать тяжелые аналитические запросы или создавать бэкапы, не влияя на производительность основного Master-узла, обслуживающего транзакции.

Техническая реализация и важные нюансы:

  • Репликационный лаг (Replication Lag): Изменения с Master на Slave передаются асинхронно. Это означает, что данные на Slave могут быть немного устаревшими (на миллисекунды или секунды). Приложения, требующие строгой консистентности чтения, должны обращаться к Master.
  • Пример настройки в Spring: Используется абстракция AbstractRoutingDataSource для маршрутизации запросов.

    @Bean
    @Primary
    public DataSource dataSource() {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("master", masterDataSource());
        targetDataSources.put("slave", slaveDataSource());
    
        RoutingDataSource routingDataSource = new RoutingDataSource();
        routingDataSource.setTargetDataSources(targetDataSources);
        routingDataSource.setDefaultTargetDataSource(masterDataSource());
        return routingDataSource;
    }

Итог: Slave-база — это не просто копия, а активный компонент для горизонтального масштабирования операций чтения и построения отказоустойчивой системы.