Шард
Шард — это крупный фрагмент данных, полученный в результате разделения (сегментирования) единой базы данных или распределённой вычислительной системы на независимые части. Шардирование (от англ. sharding) применяется для повышения производительности, масштабируемости и отказоустойчивости систем, работающих с большими объёмами информации. Каждый шард содержит подмножество данных и обслуживается отдельным сервером или узлом кластера, что позволяет распределять нагрузку и обрабатывать запросы параллельно.
История
Концепция шардирования возникла в конце 1990-х — начале 2000-х годов, когда рост интернет-трафика и объёмов пользовательских данных потребовал новых подходов к организации хранения. Первые коммерческие реализации появились в системах управления базами данных (СУБД) и веб-приложениях с высокой нагрузкой, таких как поисковые системы и социальные сети.
Одним из ранних примеров стала система Google File System (2003), где данные разбивались на фрагменты (чанки) и распределялись по множеству серверов. Позднее, в 2006 году, компания Google представила Bigtable — распределённую систему хранения, использующую шардирование для управления таблицами. В 2007 году Amazon DynamoDB (внутренняя разработка Amazon) также применила шардирование для обеспечения высокой доступности и производительности.
В России шардирование активно внедрялось с середины 2000-х годов в крупных интернет-компаниях, таких как «Яндекс» и «ВКонтакте». Например, «Яндекс.Почта» использует шардирование для обработки миллионов почтовых ящиков, а «ВКонтакте» — для хранения профилей и сообщений пользователей.
Принцип работы
Шардирование основано на разделении данных по определённому ключу (шард-ключу), который может быть хешем от идентификатора записи (например, ID пользователя) или диапазоном значений (например, даты). Каждый шард управляется отдельным экземпляром СУБД или сервером, что позволяет обрабатывать запросы параллельно.
Основные этапы:
- Выбор шард-ключа — определение поля, по которому данные будут распределяться. Например, для пользовательских данных это может быть
user_id. - Разделение данных — на основе шард-ключа данные распределяются по шардам. Используются методы: диапазонное (range-based), хеш-функция (hash-based) или список (list-based).
- Маршрутизация запросов — приложение или прокси-слой определяет, к какому шарду обратиться, на основе шард-ключа.
- Объединение результатов — для запросов, затрагивающих несколько шардов (например, агрегации), результаты собираются и обрабатываются на уровне приложения.
Виды шардирования
По способу распределения данных
- Диапазонное шардирование (range-based) — данные делятся по диапазонам значений шард-ключа. Например, пользователи с ID от 1 до 1000 попадают в шард A, от 1001 до 2000 — в шард B. Простота реализации, но возможен дисбаланс нагрузки (один шард может стать «горячим»).
- Хеш-шардирование (hash-based) — шард-ключ хешируется, и результат определяет номер шарда. Например,
shard_id = hash(user_id) % N, где N — количество шардов. Обеспечивает равномерное распределение, но сложность при добавлении или удалении шардов (требуется рехеширование). - Списочное шардирование (list-based) — данные распределяются по заранее заданному списку значений. Например, все пользователи из России — в шард A, из США — в шард B. Подходит для географического разделения.
По архитектуре
- Горизонтальное шардирование — строки одной таблицы распределяются по разным базам данных. Наиболее распространённый тип.
- Вертикальное шардирование — столбцы одной таблицы распределяются по разным базам данных. Используется реже, обычно для разделения «горячих» и «холодных» данных.
Преимущества и недостатки
Преимущества
- Масштабируемость — добавление новых шардов позволяет увеличивать ёмкость системы без перестройки архитектуры.
- Производительность — запросы обрабатываются параллельно на нескольких серверах, снижая время отклика.
- Отказоустойчивость — выход из строя одного шарда не приводит к потере всех данных, если используется репликация.
- Геораспределение — шарды могут размещаться в разных дата-центрах, уменьшая задержки для пользователей из разных регионов.
Недостатки
- Сложность реализации — требуется продуманная архитектура, включая маршрутизацию, ребалансировку и обработку запросов, затрагивающих несколько шардов.
- Проблемы с транзакциями — распределённые транзакции (например, ACID) сложнее реализовать и они медленнее.
- Ребалансировка — при добавлении или удалении шардов требуется перераспределение данных, что может вызвать временные простои.
- Ограниченность запросов — запросы без указания шард-ключа могут требовать сканирования всех шардов, что снижает производительность.
Применение
Шардирование используется в системах, где объём данных превышает возможности одной машины:
- Социальные сети — «ВКонтакте», «Одноклассники» (Россия) и Facebook (организация Meta признана экстремистской и запрещена в РФ) используют шардирование для хранения профилей, сообщений и лент новостей.
- Поисковые системы — «Яндекс» и Google распределяют индексы по шардам для ускорения поиска.
- Электронная коммерция — интернет-магазины (например, Ozon, Wildberries) шардируют каталоги товаров и заказы.
- Облачные сервисы — Amazon DynamoDB, Google Cloud Spanner и Yandex Database (YDB) поддерживают автоматическое шардирование.
- Криптовалюты — блокчейн-системы, такие как Ethereum (до перехода на Proof-of-Stake), используют шардирование для масштабирования транзакций.
Примеры реализации
MongoDB
СУБД MongoDB поддерживает автоматическое шардирование через конфигурационные серверы и маршрутизаторы (mongos). Данные распределяются по шардам на основе шард-ключа, а система автоматически ребалансирует нагрузку.
PostgreSQL
Для PostgreSQL существуют сторонние расширения, такие как Citus и pg_shard, которые добавляют поддержку шардирования. Citus, например, позволяет распределять таблицы по нескольким серверам и выполнять распределённые запросы.
Yandex Database (YDB)
Российская распределённая СУБД YDB, разработанная «Яндексом», изначально спроектирована для шардирования. Она автоматически разбивает таблицы на шарды (партиции) и балансирует нагрузку между серверами.
Критика
Шардирование критикуется за сложность управления и потенциальные проблемы с согласованностью данных. В распределённых системах часто приходится жертвовать строгой согласованностью (ACID) в пользу доступности и производительности (теорема CAP). Кроме того, неправильный выбор шард-ключа может привести к «горячим точкам» — шардам, которые перегружены запросами, в то время как другие простаивают.
В некоторых современных системах, таких как Google Spanner, используются более сложные подходы, сочетающие шардирование с синхронной репликацией и распределёнными транзакциями, что позволяет достичь высокой согласованности.
Интересные факты
- Термин «шард» заимствован из английского языка, где shard означает осколок или черепок. В контексте баз данных он впервые был использован в 2004 году в сообществе разработчиков игрового сервера Ultima Online.
- В 2020 году компания «Яндекс» открыла исходный код своей системы шардирования YDB под лицензией Apache 2.0.
- Шардирование является ключевым компонентом технологии блокчейн-шардинга, которая используется в некоторых криптовалютах для увеличения пропускной способности сети.
Источники
- «NoSQL Distilled» — P. J. Sadalage, M. Fowler (2012)
- «Designing Data-Intensive Applications» — M. Kleppmann (2017)
- Документация MongoDB: «Sharding»
- Документация Yandex Database: «Шардирование»
- Статья «Sharding in PostgreSQL» — Citus Data (2018)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →