Какие типы масштабирования баз данных используются для распределения записей?

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

Ответ

Для распределения данных (записей) в БД применяются два основных типа масштабирования: горизонтальное (шардинг) и вертикальное.

1. Горизонтальное масштабирование (Шардинг)

Данные одной таблицы разделяются по разным серверам (шардам) на основе ключа шардирования.

  • Как работает: Определяется правило (например, хэш от user_id или диапазон значений), по которому запись попадает на конкретный шард.
  • Преимущества: Теоретически неограниченное масштабирование, отказоустойчивость.
  • Недостатки: Сложность реализации, операции JOIN между шардами затруднены.

Пример логики шардирования по модулю:

int shardCount = 4;
int shardIndex = Math.abs(userId.hashCode()) % shardCount;
String shardConnectionUrl = "jdbc:postgresql://shard-" + shardIndex + "/app_db";

2. Вертикальное масштабирование

Разные таблицы или группы таблиц размещаются на отдельных серверах.

  • Как работает: Например, таблицы users и profiles на одном сервере, а orders и payments — на другом.
  • Преимущества: Проще в реализации, изоляция нагрузки.
  • Недостатки: Предел роста одного сервера (CPU/RAM/диск), сложность выполнения запросов, затрагивающих несколько серверов.

Выбор подхода: Для высоких нагрузок и больших объемов данных шардинг предпочтительнее, несмотря на операционную сложность.