Открыть сервис

Хеш-шардирование

Хеш-шардирование (англ. hash sharding) — это стратегия распределения данных в распределённых базах данных и системах хранения, при которой записи или объекты распределяются по сегментам (шардам) на основе значения хеш-функции от ключа данных. Основной целью хеш-шардирования является обеспечение равномерного распределения нагрузки и данных между узлами кластера, минимизация дисбаланса и упрощение горизонтального масштабирования.

Принцип работы

Хеш-шардирование основано на применении детерминированной хеш-функции к ключу данных (например, идентификатору пользователя, номеру заказа или URL-адресу). Полученное хеш-значение, как правило, приводится к целому числу, которое затем отображается на конкретный шард с помощью простой арифметической операции, чаще всего — взятия остатка от деления (модуля) на количество шардов.

Формально, для ключа \( K \) номер шарда \( S \) определяется как: \[ S = H(K) \mod N \] где \( H(K) \) — хеш-функция, \( N \) — количество шардов.

Выбор хеш-функции

Ключевым требованием к хеш-функции является её равномерность: распределение хеш-значений должно быть как можно более равномерным по всему диапазону, чтобы избежать перегрузки отдельных шардов. На практике часто используются криптографические хеш-функции (например, MD5, SHA-1) или их упрощённые варианты, такие как MurmurHash, CityHash, xxHash, которые обеспечивают высокую скорость вычисления и хорошую равномерность. Выбор конкретной функции зависит от требований к производительности, коллизионной стойкости и объёму данных.

Преимущества

Хеш-шардирование обладает рядом преимуществ, делающих его популярным выбором в крупных распределённых системах:

  • Равномерное распределение данных: при правильном выборе хеш-функции данные распределяются по шардам практически равномерно, что минимизирует «горячие точки» (hot spots) — шарды, на которые приходится непропорционально большая нагрузка.
  • Предсказуемость размещения: зная ключ, можно однозначно определить, на каком шарде находится запись, без необходимости хранения глобальной карты размещения. Это упрощает маршрутизацию запросов и снижает накладные расходы на координацию.
  • Простота реализации: алгоритм шардирования легко реализуется как на стороне клиента, так и на стороне прокси-сервера или балансировщика нагрузки.
  • Горизонтальное масштабирование: добавление новых шардов позволяет увеличить общую ёмкость и пропускную способность системы, хотя этот процесс требует перераспределения данных (ребалансировки).

Недостатки и ограничения

Несмотря на преимущества, хеш-шардирование имеет существенные недостатки:

  • Проблема ребалансировки: при изменении количества шардов (добавлении или удалении узла) формула \( H(K) \mod N \) меняется, что приводит к необходимости перемещения большей части данных между шардами. Это может вызвать значительные простои и нагрузку на сеть и диски. Для смягчения этой проблемы применяются методы консистентного хеширования (consistent hashing) или виртуальных шардов.
  • Отсутствие поддержки диапазонных запросов: данные, относящиеся к одному логическому диапазону (например, все записи за определённый месяц), могут оказаться разбросанными по разным шардам. Это делает выполнение запросов с условиями сравнения (например, WHERE date BETWEEN ...) неэффективными, так как требуется обращение ко всем шардам.
  • Сложность поддержки вторичных индексов: если данные шардируются по первичному ключу, то поиск по вторичному ключу требует сканирования всех шардов (так называемый «scatter-gather» запрос). Для решения этой проблемы применяются глобальные вторичные индексы или двойное шардирование.
  • Неравномерность при малом количестве ключей: при небольшом числе уникальных ключей или при наличии ключей с высокой частотой запросов (например, популярный пользователь в социальной сети) равномерность распределения может нарушиться.

Разновидности

Хеш-шардирование на основе модуля

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

Консистентное хеширование

Метод, предложенный Дэвидом Кагером и др. в 1997 году для кэширующих систем (например, Akamai). Вместо прямого модуля используется кольцевое пространство хеш-значений. Каждый шард и каждый ключ отображаются на кольцо. Ключ назначается на ближайший по часовой стрелке шард. При добавлении или удалении узла перемещается только часть данных, прилегающая к изменённому узлу, а не все данные. Этот метод широко применяется в распределённых базах данных (например, Apache Cassandra, Amazon DynamoDB), а также в системах кэширования (Memcached, Redis Cluster).

Виртуальные шарды

Вместо непосредственного отображения ключа на физический шард используется промежуточный слой — фиксированное количество виртуальных шардов (vnode). Каждый физический шард отвечает за несколько виртуальных шардов. При изменении количества физических узлов перераспределяются только виртуальные шарды, что позволяет более гибко управлять нагрузкой и упрощает ребалансировку. Этот подход используется, например, в Apache Cassandra и Riak.

Применение

Хеш-шардирование является основным механизмом распределения данных во многих современных распределённых системах:

  • Распределённые базы данных: NoSQL-системы, такие как Apache Cassandra, MongoDB (с использованием хеш-шардирования), Amazon DynamoDB, Google Bigtable.
  • Системы кэширования: распределённые кэши, такие как Memcached и Redis Cluster, используют консистентное хеширование для распределения ключей по узлам.
  • Файловые системы: распределённые файловые системы, например, Ceph, используют хеш-шардирование для размещения объектов по хранилищам (PG — placement groups).
  • Балансировка нагрузки: некоторые балансировщики нагрузки (например, на основе IP-адреса клиента) используют хеш-шардирование для привязки сессии к конкретному серверу (sticky sessions).
  • Платформы обмена сообщениями: системы очередей сообщений, такие как Apache Kafka, используют хеш-шардирование по ключу сообщения для распределения записей по партициям топика.

Сравнение с другими методами шардирования

  • Диапазонное шардирование (range sharding): данные распределяются по диапазонам значений ключа (например, ID от 1 до 1000 на шард 1, от 1001 до 2000 на шард 2 и т.д.). Преимущество — эффективная поддержка диапазонных запросов. Недостаток — риск дисбаланса при неравномерном распределении ключей (например, если большинство новых записей попадает в один диапазон).
  • Списочное шардирование (list sharding): каждый шард отвечает за определённый список значений ключа (например, все пользователи из региона «Москва» на шард 1). Применяется редко из-за сложности управления списками.
  • Динамическое шардирование (dynamic sharding): шарды создаются и разбиваются автоматически на основе текущей нагрузки или объёма данных. Часто сочетается с хеш-шардированием (например, в MongoDB).

Интересные факты

  • Концепция хеш-шардирования впервые была формализована в контексте распределённых кэшей в работе «Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web» (1997).
  • В системах, использующих консистентное хеширование, для повышения равномерности распределения часто применяют виртуальные узлы (vnode), количество которых может достигать нескольких сотен на физический сервер.
  • При выборе хеш-функции для шардирования важно учитывать, что криптографические функции (SHA-256) могут быть медленнее некриптографических (MurmurHash3), что критично для систем с высокой пропускной способностью.

Источники

  • Karger, D., Lehman, E., Leighton, T., Panigrahy, R., Levine, M., & Lewin, D. (1997). Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web. Proceedings of the 29th Annual ACM Symposium on Theory of Computing.
  • Dean, J., & Ghemawat, S. (2004). MapReduce: Simplified Data Processing on Large Clusters. Proceedings of the 6th Conference on Symposium on Operating Systems Design & Implementation.
  • Lakshman, A., & Malik, P. (2010). Cassandra: A Decentralized Structured Storage System. ACM SIGOPS Operating Systems Review.
  • DeCandia, G., Hastorun, D., Jampani, M., Kakulapati, G., Lakshman, A., Pilchin, A., ... & Vogels, W. (2007). Dynamo: Amazon’s Highly Available Key-value Store. ACM SIGOPS Operating Systems Review.
  • Документация MongoDB: «Sharding» (раздел «Hash-based Sharding»).
  • Документация Apache Cassandra: «Partitioners» (раздел «Murmur3Partitioner»).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →