Просто о сложном: что такое репликация, партиционирование и шардирование?

Мы уже опубликовали подробную техническую статью про способы масштабирования систем хранения данных — про репликацию, партиционирование и шардирование. Эти подходы работают для реляционных СУБД, для NoSQL и для любых других хранилищ данных. Сейчас же попробуем объяснить эти подходы максимально кратко и понятно, без технических сложностей, без рассказов про особенности распределённых систем и без отсылок к теоремам CAP и PACELC.

Для этого воспользуемся простой метафорой: представим, что наши данные — это шкаф с книгами. Допустим, у нас есть шкаф и там много разных книг: и бизнес‑литература, и художественная, и книги с кулинарными рецептами. Эти книги кроме нас читает вся наша семья. Изначально этот шкаф у нас один и стоит он, например, в гостинной. И этот шкаф — наша система хранения данных, одним из пользователей которой мы являемся.

Репликация (зеркалирование)

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

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

Партиционирование (секционирование)

Если книги никак не упорядочены по полкам, то в таком шкафу сложно что‑то найти. А если их отсортировать по какому‑то нужному признаку, то искать станет сильно проще. Можно сгруппировать на отдельных полках книги по разным тематикам, можно поставить на отдельную полку новинки, можно каждому члену семьи выделить свою полку. Принцип тут простой — ориентируемся на то, по каким критериям осуществляется выбор.

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

Шардирование (сегментирование)

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

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

Общие особенности масштабирования

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

Резюме

Эта статья не описывает всех нюансов масштабирования систем хранения данных и особенностей проектирования распределённых систем. Для более глубокого погружения в эти темы рекомендуем ознакомиться со статьями из списка ниже.

Тематические статьи

Масштабирование баз данных — партиционирование, репликация и шардирование

СУБД — это очень часто «узкое место» в производительности веб‑приложений. В момент, когда сервер баз данных не может справится с нагрузками, производится масштабирование. В современных высоконагруженных системах эффективное управление данными невозможно без использования методов масштабирования и обеспечения отказоустойчивости. Репликация, партиционирование и шардирование — ключевые подходы, которые позволяют распределять данные, повышать производительность и гарантировать доступность. Разберем каждый из них подробно.

Статья обновлена в 2025 году
Теоремы CAP и PACELC — ограничения в распределённых системах

Теоремы CAP и PACELC объясняют ограничения, возникающие в распределённых системах, и позволяют проектировать решения, обеспечивающие правильный баланс между доступностью, согласованностью и быстродействием.

Статья опубликована в 2025 году
Реляционные базы данных и NoSQL‑хранилища

Базы данных служат для хранения и обработки данных. Бывают реляционные (SQL) и нереляционные (NoSQL) системы управления базами данных. Реляционные системы управления базами данных (SQL) хранят данные в таблицах и наиболее часто используются в качестве основного хранилища для веб‑приложений. Они очень стабильны и их надёжность проверена временем. Нереляционные СУБД (NoSQL) заметно отличаются по структуре хранения данных и работе с ними. Большинство нереляционных хранилищ превосходят классические SQL СУБД по скорости доступа или при работе со специфическими типами данных, но обычно эта скорость достигается за счёт снижения надёжности хранения.

Статья обновлена в 2021 году