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

Обновлено: 2 мая 2026 г. в 17:42

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

средний

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

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

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

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

Кворум

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

Компакция

Фоновые операции хранения нельзя считать второстепенными: они напрямую влияют на p95/p99 и на реальную стоимость записи.

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

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

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

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

База данных типа ключ-значение кажется простой только на уровне 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: , метрики, отставание реплик и очередь фоновых задач

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

ТребованиеЦелевое значениеОбоснование
Задержка чтения (p95)< 20msХранилище используется на горячем пользовательском и инфраструктурном пути.
Задержка записи (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
Запрос на запись
PUT / DELETE / CAS
2
Координатор
хеширование + маршрут
3
Лидер шарда
запись в WAL
4
Подтверждения реплик
кворум W
5
Ответ на запись
версия + метаданные
Путь записи: координатор маршрутизирует ключ в нужную группу шардов, фиксирует обновление через WAL и ждёт подтверждений кворума.

Путь записи

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

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

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

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

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

Читать обзор

У распределённого KV-хранилища нет одного универсального ответа для всех сценариев. Нужно заранее выбрать , понять, где допустима , и отдельно спроектировать механизмы .

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

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

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

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

Фоновые процессы выполняют , , hinted handoff и перебалансировку после потери узла или добавления новой ноды.

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

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

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

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

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

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

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

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