Какую архитектуру базы данных вы использовали в последнем проекте: одиночную (single) или кластерную?

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

Ответ

В последнем проекте использовалась кластерная архитектура базы данных на основе PostgreSQL с репликацией streaming replication (master-slave).

Цели и преимущества такого подхода:

  • Отказоустойчивость (High Availability): При сбое master-узла можно выполнить failover на одну из реплик.
  • Масштабирование чтения (Read Scaling): Нагрузка операций SELECT распределяется между репликами, разгружая master, который обрабатывает операции INSERT/UPDATE/DELETE.
  • Резервное копирование: Резервные копии можно создавать с реплик, не нагружая основной узел.

Реализация на уровне приложения (Spring Boot):

  1. Настройка двух источников данных:
    spring:
      datasource:
        master:
          url: jdbc:postgresql://master-host:5432/db
          username: admin
          password: master_pass
        replica:
          url: jdbc:postgresql://replica-host:5432/db
          username: reader
          password: replica_pass
          hikari:
            read-only: true # Важно для реплик
  2. Использование AbstractRoutingDataSource: Создаётся роутер, который определяет, к какому DataSource (master или replica) направить запрос, обычно на основе флага "только для чтения" в контексте транзакции (@Transactional(readOnly = true)).

Альтернативы: Для более сложных сценариев рассматривались решения вроде Citus (горизонтальное шардирование) или облачные managed-сервисы (Amazon RDS Multi-AZ, Google Cloud SQL с high-availability).