7 вопросов
Репликация - копирование данных с одного сервера (master/primary) на другие (replicas/secondaries). Цели: отказоустойчивость (failover), масштабирование чтения (read scaling), географическое распределение. Запись обычно на primary; чтение можно распределять по репликам. Реплики могут быть синхронными или асинхронными.
Синхронная - primary ждет подтверждения от реплики перед коммитом. Гарантирует, что при падении primary данные есть на реплике. Минус: задержка записи, при недоступности реплики запись блокируется. Асинхронная - primary не ждет; реплика догоняет. Меньше задержка записи, но при падении primary возможна потеря последних данных (replication lag). Для большинства сценариев используют асинхронную с приемлемым RPO.
Физическая - копируются блоки данных (WAL в PostgreSQL). Реплика идентична побайтово. Быстрее, но версия СУБД должна совпадать. Логическая - реплицируются логические изменения (INSERT/UPDATE/DELETE). Можно реплицировать выборочно (таблицы, строки), в другую СУБД или в очередь. PostgreSQL logical replication, MySQL binlog row format. Гибкость в обмене данными между системами.
Горизонтальное разделение данных: строки одной логической таблицы распределяются по разным узлам (шардам) по ключу шардирования (user_id, region, hash(id)). Каждый шард - отдельная БД. Цель - масштабирование записи и объема данных. Минусы: сложность запросов по нескольким шардам, перебалансировка, транзакции и JOIN между шардами затруднены. Применяют когда один узел не справляется с объемом или нагрузкой.
Партиционирование - логическая таблица разделена на партиции внутри одной СУБД (один сервер). Запросы с условием по ключу партиционирования обращаются только к нужным партициям. Упрощает архивацию и удаление. Шардирование - данные на разных серверах (разные инстансы БД). Масштабирование по объему и нагрузке. Партиционирование не решает лимит одного сервера; шардирование усложняет операции и администрирование.
Способ распределения ключей по узлам так, что при добавлении или удалении узла перераспределяется минимум ключей. Обычный hash(key) % N при изменении N инвалидирует почти все ключи. Consistent hashing: ключи и узлы размещаются на кольце (hash space); ключ принадлежит следующему узлу по часовой стрелке. При добавлении узла только соседние ключи переезжают. Используется в распределенных кешах (Memcached), шардировании, CDN.
Ситуация, когда после разрыва связи оба узла (или группы) считают себя primary и принимают записи. При восстановлении связи данные расходятся, возможны конфликты и потеря. Предотвращение: quorum, единственный arbiter (судья), fencing (отключение старого primary при смене). Решения: PostgreSQL с Patroni/etcd, MySQL Group Replication, ручной failover с проверкой. Важно иметь только один писатель в момент времени.