System Design Space
Граф знанийНастройки

Обновлено: 23 июня 2026 г. в 02:35

База данных типа ключ-значение

средний

Распределённое хранилище с партиционированием, репликацией, кворумом и фоновым восстановлением данных.

База данных типа ключ-значение кажется простой только на уровне API, а внутри быстро превращается в разговор о разбиении данных, репликации, кворуме и фоновых процессах хранения.

Глава помогает разобрать путь записи и путь чтения, выбор движка хранения, изменения состава кластера и восстановление после потери узла.

В интервью и инженерных обсуждениях этот кейс полезен тем, что быстро показывает, понимаете ли вы, где заканчивается простота интерфейса и начинается реальная цена надёжного хранения.

Кворум

Выбор параметров R и W определяет не только консистентность, но и профиль задержек для чтения и записи.

Компакция

Фоновые операции хранения нельзя считать второстепенными: они напрямую влияют на 95-й и 99-й перцентили и на реальную стоимость записи.

Горячие партиции

Перекос по ключам быстро превращает отдельный шард в узкое место, поэтому дизайн ключа важен не меньше числа реплик.

Перебалансировка

Добавление узлов и перенос партиций должны проходить без долгих провалов по доступности и без потери контроля над трафиком.

База данных типа ключ-значение кажется простой только на уровне API. Под ним — распределённое хранилище, где , , и стоимость эксплуатации нельзя выкрутить на максимум одновременно: усиление одного параметра почти всегда оплачивается другим. Такое хранилище берут там, где нужны , простой доступ по ключу и горизонтальный рост — без переписывания архитектуры на каждом скачке нагрузки.

Источник

Acing the System Design Interview

Глава 8: проектирование базы данных типа ключ-значение с акцентом на партиционирование, кворум и устойчивость к отказам.

Читать обзор

Примеры систем типа ключ-значение

  • Amazon DynamoDB: управляемое KV-хранилище с партиционированием, репликацией и глобальными таблицами.
  • Redis: хранилище в памяти с очень низкой задержкой и богатым набором структур данных.
  • Cassandra: распределённая база с ширококолоночной моделью, которая во многих сценариях работает как KV-хранилище с настраиваемой консистентностью.
  • Riak: AP-ориентированная архитектура с векторными часами и явным ремонтом данных.
  • etcd/Consul: консистентные KV-хранилища для и хранения конфигурации.

Функциональные требования

Базовый API

  • PUT /kv/:key — записать значение по ключу
  • GET /kv/:key — получить значение по ключу
  • DELETE /kv/:key — удалить ключ
  • BATCH /kv — выполнить пакетные операции

Расширенные возможности

  • и фоновая очистка просроченных ключей
  • для условных обновлений
  • для безопасных повторных записей
  • Операционные API: , метрики, отставание реплик и очередь фоновых задач

Нефункциональные требования

ТребованиеЦелевое значениеОбоснование
Задержка чтения, 95-й перцентиль (P95)< 20msХранилище используется на горячем пользовательском и инфраструктурном пути.
Задержка записи, 95-й перцентиль (P95)< 40msСистема должна выдерживать устойчивый поток обновлений даже под пиком.
Доступность99.99%Для многих сервисов это базовый инфраструктурный компонент, а не опциональная зависимость.
МасштабируемостьЛинейный рост по числу партицийРост объёма данных и трафика не должен требовать полного переписывания системы.
Долговечность данныхПереживать отказ узла и зоныПотеря состояния недопустима для конфигурации, сессий, счётчиков и других критичных данных.

Архитектура верхнего уровня

Теория

Репликация и шардинг

Практический разбор разбиения данных, перебалансировки и выбора моделей консистентности в распределённых хранилищах.

Читать обзор

На верхнем уровне KV-хранилище делится на , , слой маршрутизации на основе , группы шардов с и фоновые процессы . Это разделение держит обработку горячих запросов в стороне от тяжёлых задач ремонта и перебалансировки, чтобы фоновая работа не съедала бюджет задержки на пользовательском пути.

Карта архитектуры

партиционирование + репликация + кворум
Клиент
сервис или API
Координатор + кольцо хеширования
маршрут + карта партиций
Группы шардов
A/B/C: лидер + реплики
WAL + компакция + восстановление
долговечность + обслуживание

Схема разделяет контур запросов, группы шардов и фоновые процессы восстановления и обслуживания.

Карта модели данных

Логическая запись и её физическое размещение в распределённом KV-кластере.

Логическая запись

ключ

user:123:session

значение

opaque blob / json / bytes

метаданные

version: 42ttl: 24hchecksum

Физическое размещение

разбиение по партициям

hash(key) -> partition_id: 17

набор реплик

A-leader, A-r1, A-r2

жизненный цикл

active -> ttl-expired -> background sweep

Идентичность

Ключ определяет место хранения и маршрут запроса внутри кластера.

Консистентность

Поле version помогает безопасно выполнять CAS-обновления и разрешать конфликты.

Надёжность

Контрольная сумма и реплики помогают обнаруживать и восстанавливать повреждённые данные.

Путь чтения и путь записи через компоненты

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

Разбор пути чтения и записи в KV-хранилище

Интерактивная схема того, как запрос проходит через координатор, WAL и группу реплик.

1
Запрос на запись
2
Координатор
3
Лидер шарда
4
Подтверждения реплик
5
Ответ на запись
Путь записи: координатор маршрутизирует ключ в нужную группу шардов, фиксирует обновление через WAL и ждёт подтверждений кворума.

Путь записи

  1. Ключ попадает в нужную группу шардов через согласованное хеширование, что позволяет масштабировать систему горизонтально.
  2. WAL закрывает риск потери данных между приёмом запроса и записью в структуру хранения.
  3. Параметр W задаёт компромисс между задержкой записи и её долговечностью.
  4. Идемпотентность и CAS защищают от дублей и потерянных обновлений при повторах.

Движок хранения: B-дерево и LSM-дерево

Структура хранения задаёт профиль всей системы, и выбрать её придётся под конкретную нагрузку. На одном полюсе важнее быстрый точечный поиск и диапазонные чтения, на другом — пропускная способность записи, за которую потом платят стоимостью компакции.

B-дерево и LSM-дерево: выбор структуры данных

Архитектура B-дерева

[10 | 20 | 30]
[3|5|8]
[12|15|18]
[22|25|28]
Листья содержат указатели на данные
✓ Преимущества
  • Быстрые чтения: O(log N)
  • Эффективные диапазонные запросы
  • Обновления на месте
✗ Недостатки
  • Избыточная запись
  • Случайный ввод-вывод при записи
Где используется:
PostgreSQLMySQL InnoDBOracleSQL ServerSQLite

Консистентность и устойчивость к отказам

Глубже

Designing Data-Intensive Applications, 2nd Edition

Консистентность, отставание реплик, антиэнтропийная синхронизация, кворум и компромиссы распределённых систем.

Читать обзор

Одного режима консистентности на все сценарии не бывает, и решение лучше принять до первого инцидента, а не во время него. Сначала выбираете для каждого класса данных, отмечаете, где можно жить с , и только потом отдельно проектируете механизмы — иначе потеря реплики застаёт систему без плана.

Кворумное чтение и запись

При для числа реплик N выбираются параметры чтения R и записи W. Базовое правило для сильной настраиваемой консистентности выглядит так:

R + W > N
  • W↑, R↓ — запись дороже, но чтение быстрее
  • W↓, R↑ — запись быстрее, но чтение требует больше реплик
  • R=1, W=1 — минимальная задержка, но и минимальные гарантии свежести

Восстановление и обслуживание

Фоновые процессы выполняют , , временное хранение записи для недоступной реплики и перебалансировку после потери узла или добавления новой ноды. Эти пути не менее важны, чем API счастливого сценария: именно на них держится система, когда что-то ломается.

  • Hinted handoff: временно держим запись за недоступную реплику, чтобы не терять принятый запрос
  • Read repair: подравниваем отставшие копии прямо во время чтения
  • Merkle trees: периодически сверяем наборы данных между репликами без полного пересылания всего шарда
  • Rebalancing: переносим партиции так, чтобы новая топология не ломала доступность

Риски и типовые ошибки

  • : неудачный выбор ключа создаёт перекос нагрузки, а отдельная начинает ограничивать весь кластер.
  • : агрессивная компакция, задачи восстановления и конкуренция за диск быстро раздувают .
  • Устаревшие чтения: при слабом режиме консистентности клиент может увидеть уже неактуальное состояние.
  • Слепые повторы: без идемпотентности и версионирования легко потерять корректность состояния.
  • Слишком раннее усложнение: если не зафиксировать рабочий профиль нагрузки, легко выбрать неверный движок хранения или завысить требования к консистентности.

Что важно проговорить на интервью

Сильный ответ не делает вид, что один режим решает всё, а явно называет между задержкой, консистентностью и стоимостью — и показывает, что для разных классов данных он разный.

  • Какой режим консистентности нужен для конкретного класса данных и почему.
  • Как система переживает потерю узла, зоны доступности или временную недоступность части реплик.
  • Как вы ограничиваете размер значения, проектируете ключи и боретесь с горячими партициями.
  • Какие показатели качества важно отслеживать: 95-й и 99-й перцентили задержки, доля ошибок, отставание реплик, очередь на компакцию и время перебалансировки.

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки