До 10%Рекомендуйте нас и получайте процент за каждого приведённого клиента

Базы данных под нагрузкой: репликация и шардирование

Базы данных под нагрузкой: репликация, веб-кластер и шардирование для магазина на 1С-Битрикс

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

Эта статья — о том, как масштабировать базу данных под нагрузкой в проекте на 1С-Битрикс: чем репликация отличается от шардирования, как работает веб-кластер, как разделять чтение и запись, зачем нужны highload-блоки и почему начинать всегда стоит не с новых серверов, а с оптимизации. Тема опирается на нашу практику аудита и оптимизации 1С-Битрикс под высокие нагрузки.

Коротко

  • База — типичное узкое место магазина: с ростом нагрузки она упирается в потолок первой.
  • Репликация масштабирует чтение (master пишет, slave читают), шардирование делит данные и масштабирует запись.
  • В 1С-Битрикс репликацию и разделение чтения/записи даёт штатный модуль «Веб-кластер».
  • Начинать надо с оптимизации запросов, индексов, кэша и композита — часто этого достаточно без репликации.

Когда база становится узким местом

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

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

Вертикальное и горизонтальное масштабирование

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

ПодходСутьПлюсы и пределы
ВертикальноеБолее мощный сервер БДПросто, но упирается в потолок железа и цену
РепликацияКопии базы для чтенияМасштабирует чтение и отказоустойчивость
ШардированиеДанные делятся между серверамиМасштабирует запись и объём, но сложно

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

Слои кэширования ускоряют ответ БраузерзапросCDN / кэшготовый ответКомпозиткэш страницБазатолько при промахеБольшинство запросов отдаётся из кэша, до базы доходят единицы
Схема: между браузером и базой стоят слои кэша (CDN, композит). Большинство запросов отдаётся мгновенно из кэша, а до базы доходят единицы — сайт держит нагрузку.

Репликация: чтение против записи

Репликация — основной инструмент масштабирования базы магазина, и работает она на простом наблюдении: у интернет-магазина операций чтения многократно больше, чем записи. Пользователи листают каталог, открывают карточки, ищут — это всё чтение; заказы и изменения — редкая запись.

Схема master-slave использует этот дисбаланс:

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

Веб-кластер 1С-Битрикс

Хорошая новость для проектов на 1С-Битрикс: репликацию не нужно строить с нуля. В редакциях с модулем «Веб-кластер» платформа умеет работать с репликацией MySQL штатно.

Что даёт веб-кластер:

То есть на Битрикс горизонтальное масштабирование — это в первую очередь правильная настройка веб-кластера, а не самописные надстройки. Всё это работает поверх подготовленной инфраструктуры, о развёртывании которой мы писали в статье про хостинг и инфраструктуру BitrixVM.

Отставание реплик и целостность данных

У репликации есть коварная особенность — отставание (lag). Slave-сервер применяет изменения с master не мгновенно, а с некоторой задержкой. В большинстве случаев она незаметна, но создаёт риск: чтение с отстающей реплики сразу после записи может вернуть старые данные.

Классический сценарий: клиент оформил заказ (запись на master), тут же обновил страницу, а чтение ушло на отстающую реплику — и он видит старый остаток или «заказ не найден». Пользователь в замешательстве, хотя технически всё работает.

Решается это направлением критичного чтения. Данные, которые нужны сразу после записи и должны быть точными (только что созданный заказ, актуальный остаток при оформлении), читают с master. А то, где небольшая задержка не важна — каталог, карточки, списки товаров, — спокойно отдают с реплик. Веб-кластер Битрикс поддерживает такую логику, но её нужно осознанно настроить под сценарии проекта.

Шардирование: когда оно нужно

Репликация масштабирует чтение, но не запись — master остаётся один. Когда упирается уже запись или объём данных превышает возможности одного сервера, применяют шардирование: данные делят на части (шарды) по какому-то признаку, и каждый сервер хранит и обслуживает только свою часть.

Шардирование мощно, но дорого в сложности:

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

Highload-блоки для больших объёмов

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

Highload-блок — это механизм хранения больших объёмов однотипных данных отдельно от инфоблоков, с оптимизированным доступом через D7. Он разгружает основную структуру и лучше масштабируется на больших объёмах. Типичные применения — крупные справочники, характеристики товаров, данные, которых очень много и которые часто читаются. Правильная работа с ними идёт через ORM — про это мы писали в статье про D7 и ORM в Битрикс.

Кэш и композит снимают нагрузку с базы

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

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

Оптимизация запросов и индексы

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

  1. Медленные запросы. Находят самые тяжёлые обращения к базе по логам и профилированию.
  2. Индексы. Проверяют, что частые выборки опираются на индексы, а не на полный перебор.
  3. Лишние запросы. Убирают дублирующиеся и избыточные обращения, в том числе в циклах.
  4. Тяжёлые операции. Оптимизируют или выносят в фон долгие выборки и отчёты.

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

Порядок действий при росте нагрузки

Правильная последовательность масштабирования идёт от дешёвого и простого к дорогому и сложному:

  1. Измерьте. Найдите реальное узкое место по данным, а не по догадкам.
  2. Оптимизируйте запросы. Индексы, медленные запросы, лишние обращения.
  3. Настройте кэш и композит. Снимите с базы массовые чтения.
  4. Масштабируйте вертикально. Дайте базе более мощное железо, пока это оправдано.
  5. Введите репликацию. Разделите чтение и запись через веб-кластер.
  6. Рассмотрите шардинг. Только если упёрлись в запись и объём на действительно больших данных.

Каждый следующий шаг сложнее и дороже предыдущего, поэтому переходят к нему, только исчерпав предыдущий. Как безопасно выкатывать такие инфраструктурные изменения без простоя, мы разбирали в статье про CI/CD и деплой в Битрикс.

Частые ошибки масштабирования

Чек-лист

  1. Узкое место найдено. Проблема подтверждена данными профилирования, а не догадками.
  2. Запросы оптимизированы. Медленные запросы, индексы и лишние обращения проработаны.
  3. Кэш и композит настроены. Массовое чтение снято с базы.
  4. Вертикаль исчерпана. Мощность сервера БД поднята до разумного предела.
  5. Веб-кластер настроен. Репликация с разделением чтения и записи работает.
  6. Отставание учтено. Критичное чтение идёт на master, некритичное — на реплики.
  7. Highload где нужно. Большие объёмы однотипных данных вынесены в highload-блоки.
  8. Шардинг обоснован. Вводится только при реальной потребности в масштабировании записи.

Вывод

База данных — типичное узкое место растущего магазина, потому что масштабировать хранилище состояния сложнее, чем серверы приложения. Но паниковать и сразу строить кластеры не нужно: путь масштабирования идёт от дешёвого к дорогому. Сначала измерение и оптимизация запросов, затем кэш и композит, потом более мощное железо — и очень часто на этом всё заканчивается.

Когда оптимизация исчерпана, а нагрузка растёт, в дело вступает репликация через штатный веб-кластер 1С-Битрикс: master пишет, реплики читают, критичное чтение направляется точно. Шардирование и highload-блоки — инструменты для действительно больших объёмов, и вводят их осознанно. Главное правило: не масштабируйте неоптимизированную базу — сначала уберите неэффективность, иначе вы просто оплатите её размножение на нескольких серверах.

Частые вопросы

Когда магазину на 1С-Битрикс действительно нужна репликация базы?

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

Чем репликация отличается от шардирования?

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

Поддерживает ли 1С-Битрикс репликацию из коробки?

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

Что такое отставание реплики и чем оно опасно?

Slave-сервер применяет изменения с master не мгновенно, а с задержкой — это и есть отставание (lag). Опасность в том, что сразу после записи чтение с отстающей реплики может вернуть старые данные: клиент оформил заказ, а на странице ещё старый остаток. Поэтому критичное чтение сразу после записи направляют на master, а на реплики отдают то, где небольшая задержка допустима, — каталог, карточки, списки.

Что такое highload-блоки и как они связаны с нагрузкой?

Highload-блоки — механизм Битрикс для хранения больших объёмов однотипных данных (справочники, характеристики, большие таблицы) отдельно от обычных инфоблоков, с оптимизированным доступом через D7. Они разгружают основную структуру и лучше масштабируются. Для проектов с миллионами записей highload-блоки — штатный способ не раздувать инфоблоки и держать выборки быстрыми.

С чего начинать масштабирование базы?

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

Нужен ли шардинг обычному интернет-магазину?

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

Поделиться:

Магазин упирается в базу на пиках нагрузки?

Найдём узкое место, оптимизируем запросы и кэш, настроим веб-кластер и репликацию под ваш трафик. Рассчитаем работу по масштабированию проекта на 1С-Битрикс.

Аудит и оптимизация 1С

Игорь Воскресенский

Команда B2Bsite. С 2014 года разрабатываем и масштабируем высоконагруженные проекты на 1С-Битрикс: оптимизацию базы, веб-кластер, репликацию и highload-блоки для среднего и крупного бизнеса.

← Все статьи блога