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

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

Рассмотрим основные способы увеличения производительности СУБД.

Масштабирование SQL и NoSQL

Описанные ниже схемы масштабирования применимы как для реляционных баз данных, тах и для NoSQL-хранилищ. Разумеется, что у всех баз данных и хранилищ есть своя специфика, поэтому мы рассмотрим только основные направления и в детали реализации вдаваться не будем.

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

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

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

Репликация (replication)

Репликация — это синхронное или асинхронное копирование данных между несколькими серверами. Ведущие сервера называют мастерами (master), а ведомые сервера — слэйвами (slave). Мастера используются для изменения данных, а слэйвы — для считывания. В классической схеме репликации обычно один мастер и несколько слэйвов, так как в большей части веб-проектов операций чтения на несколько порядков больше, чем операций записи. Однако в более сложной схеме репликации может быть и несколько мастеров.

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

Шардинг (sharding)

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

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

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

PostgreSQL — свободная объектно-реляционная система управления базами данных, основанная на языке SQL.

СУБД отличается высокой надёжностью и хорошей производительностью. PostgreSQL поддерживает транзакции (ACID), репликация реализована встроенными механизмами. При этом система расширяемая — можно создавать свои типы данных и индексов, а также расширять поведение при помощи языков программирования.

Узнать больше →

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

Скорость работы веб-приложений очень важна для коммерческих проектов: пользователи не любят ждать и если сайт работает недостаточно быстро, то это их раздражает и они просто уходят. В системах для автоматизации бизнес-процессов показатель скорости работы тоже очень важен — продуктивность работы страдает, если система «зависает» или «тормозит».

Узнать больше →

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

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

В основе отказоустойчивости всегда лежит дублирование компонентов системы и исключение единой точки отказа — это либо решения с «горячей заменой», либо горизонтальное масштабирование.

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

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

Узнать больше →

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

Cтатьи по теме:

Реляционные базы данных и NoSQL-хранилища
13.03.2019  |  Статьи  —  СУБД  /  хранение данных  /  SQL  /  NoSQL  /  серверное ПО
Базы данных служат для хранения и обработки данных. Бывают реляционные (SQL) и нереляционные (NoSQL) системы управления базами данных.
Быстрый поиск на сайте, используя ElasticSearch или Sphinx
Sphinx и ElasticSearch — это поисковые «движки», которые обеспечивают более быстрый поиск и фильтрацию по сравнению с реляционными базами данных, а также обеспечивают возможность использования многих полезных функций поиска, например, учитывают морфологию языка, осуществляют фасеточный поиск, работают со стоп-словами, обеспечивают выборочную индексацию и позволяют производить настройку формулы определения релевантности документов.
Ускоряем работу сайта при помощи кеширования на базе Memcached
Memcached — это хранилище «ключ => значение», использование которого очень эффективно для ускорения работы сайта или веб-приложения.
Ускоряем работу сайта: используем Redis для кеширования и хранения данных
Redis — сетевое журналируемое хранилище данных типа «ключ — значение», которое обрабатывает данные в оперативной памяти и обладает механизмами снимков и журналирования для обеспечения постоянного хранения. Хранилище поддерживает работу с пятью типами данных: со строками, списками, хешами, обычными и сортируемыми множествами.
MongoDB — документо-ориентированная база данных (NoSQL)
MongoDB — это NoSQL хранилище данных, крайне удобное для хранения информации, которая не может быть нормально структурирована в рамках реляционных баз данных.
MySQL — система управления базами данных
MySQL — это реляционная система управления базами данных с открытым исходным кодом. В настоящее время эта СУБД одна из наиболее популярных в веб-приложениях — подавляющее большинство CMS использует именно MySQL (часто только её, без альтернатив), а почти все веб-фреймворки поддерживают MySQL уже на уровне базовой конфигурации (без дополнительных модулей).
MariaDB — система управления реляционными базами данных
MariaDB — ответвление реляционной СУБД MySQL, разрабатываемое сообществом под лицензией GPL. MariaDB полностью совместима с приложениями, использующими MySQL, а переход на эту СУБД оправдан тем, что MySQL уже не так активно развивается.

Тематические технологии:

Поисковая система ElasticSearch
СУБД Redis
Колоночная СУБД Scylla
Колоночная СУБД Cassandra
Хранилище Memcached