Ответ
Шардирование и репликация — это взаимодополняющие, но принципиально разные техники масштабирования.
| Аспект | Шардирование (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), что обеспечивает и горизонтальное масштабирование, и отказоустойчивость внутри каждого шарда.