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

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

Ответ

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

Репликация — это стратегия доступности и отказоустойчивости. Данные копируются (реплицируются) с одного сервера (мастера) на один или несколько других (реплик).

  • Цель: Обеспечить резервные копии данных, распределить нагрузку операций чтения, повысить доступность.
  • Как работает: Все операции записи (INSERT, UPDATE, DELETE) идут на мастер, который асинхронно или синхронно передает изменения репликам. Чтение можно выполнять с реплик.
  • Ограничение: Пропускная способность записи не увеличивается, так как запись все еще идет в одну точку (мастер).

Шардирование (партиционирование) — это стратегия масштабируемости производительности. Единый набор данных разбивается (шардируется) на меньшие части (шарды), которые распределяются по разным серверам.

  • Цель: Распределить нагрузку как на запись, так и на чтение, обрабатывая большие объемы данных, которые не помещаются на один сервер.
  • Как работает: Данные распределяются по шардам на основе ключа шардирования (например, user_id). Каждый шард независим и содержит свою часть данных.
  • Сложность: Усложняются операции, затрагивающие несколько шардов (например, JOIN), и требуется механизм маршрутизации запросов.

Практический пример:

-- Репликация в PostgreSQL: Настройка реплики.
-- На реплике выполняется:
$ pg_basebackup -h master-host -D /var/lib/postgresql/data -U replicator -P

-- Шардирование (концептуально): Пользователи разбиты по шардам.
-- Шард A (user_id от 1 до 1000): SELECT * FROM users WHERE user_id = 123;
-- Шард B (user_id от 1001 до 2000): SELECT * FROM users WHERE user_id = 1500;
-- Запрос должен знать, на какой шард идти.

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