В чем разница между шардированием и репликацией?

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

Ответ

Шардирование и репликация — это взаимодополняющие, но принципиально разные техники масштабирования.

Аспект Шардирование (Sharding) Репликация (Replication)
Цель Горизонтальное масштабирование записи и хранения. Распределить разные части данных (шарды) по разным серверам. Повышение доступности, отказоустойчивости и масштабирование чтения. Копировать одни и те же данные на несколько серверов.
Данные Данные разделены (партиционированы). На каждом узле — своё подмножество. Данные скопированы. На каждом узле — полная копия (или почти полная).
Нагрузка Распределяет нагрузку как на запись, так и на чтение для разных данных. Распределяет нагрузку только на чтение. Все записи идут на primary-узел.
Сложность Высокая: сложные запросы (JOIN), транзакции, ребалансировка. Относительно низкая: консистентность, лаг репликации.

Визуализация:

// ШАРДИРОВАНИЕ (данные разделены)
Шард A: [Пользователи 1-500]  -> Сервер 1
Шард B: [Пользователи 501-1000] -> Сервер 2

// РЕПЛИКАЦИЯ (данные скопированы)
Primary: [Пользователи 1-1000] -> Сервер 1
Replica 1: [Пользователи 1-1000] -> Сервер 2 (копия)
Replica 2: [Пользователи 1-1000] -> Сервер 3 (копия)

Комбинированный подход: В реальных системах (например, MongoDB, PostgreSQL с Citus) часто используют шардирование с репликацией. Каждый шард представляет собой набор реплик (replica set), что обеспечивает и горизонтальное масштабирование, и отказоустойчивость внутри каждого шарда.