Какой сервер MySQL обеспечивает лучшую производительность для Magento


30

Что вы используете в качестве сервера MySQL для Magento?

  • MySQL (Oracle)
  • Percona
  • другие (MariaDB)

Percona предоставляет набор улучшений для хранилища InnoDB, интенсивно используемых Magento, но эти улучшения действительно имеют значение при запуске магазина Magento.

Как улучшить производительность (общие подходы к архитектуре, а не конкретная информация о настройке конкретных переменных, например innodb_flush_log_at_trx_commit=2и т. Д.). Я знаю, что NBS попробовал репликацию мастер-мастер, но это не стабильно.

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

Выходите из MySQL как можно больше? (поиск, чтобы решить и так далее).


1
FlorinelChis, Спасибо за вопрос, но это очень очень широкий вопрос (повышение производительности), и выбор механизма базы данных - это само по себе поле. Если в этом вопросе нет сильной стороны, относящейся конкретно к Magento, этот вопрос лучше задать в наших вопросах и ответах DBA . Но где бы вы ни задавали свой вопрос, вам придется предоставлять гораздо больше информации о конкретных проблемах, с которыми вы сталкиваетесь. Извините за путаницу и удачи!
Роберт Картейно

Я понимаю, что вопрос неоднозначен и кажется очень широкой темой. Относительно Magento не так широко, это связано с очень конкретными деталями. MySQL является узким местом, когда вам нужно масштабировать Magento, и, исходя из моего опыта, просто переход на percona в некоторых настройках повышает производительность. Я хочу знать, как это делают другие сисадмины Magento. Я искал не очень конкретную информацию, например, вам нужно установить innodb-flush-log-at-trx-commit = 2, а скорее подход к использованию Mysql, percona или других (MariaDB) для достижения лучшей производительности.
FlorinelChis

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

Ответы:


73

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

Определить производительность

Вы имеете в виду время загрузки страницы для одного пользователя или общую емкость / общий параллелизм? Эти два совершенно разные - и не строго связаны. Вполне возможно иметь быстрый магазин с ограниченной емкостью; или медленный магазин с большой емкостью.

Поэтому при рассмотрении любого типа производительности:

  1. Время загрузки страницы воспринимается одним пользователем
  2. Общая емкость / параллелизм

Вы должны справиться с каждым независимо со своими собственными решениями - тем более что у каждого есть свои узкие места.

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

Время загрузки страницы воспринимается одним пользователем

Является ли MySQL узким местом
Нет. Не напрямую. Все дело в задержке, в большинстве случаев при тестировании времени загрузки страницы - только кеши будут поражены. Таким образом, ключ здесь заключается в том, чтобы минимизировать задержки.

  • Настройте размеры кэша MySQL соответствующим образом (нет правильного ответа, мы настраиваем настройки совершенно по-разному, ежемесячно, для магазина)
  • Уменьшите задержку сети. Для 64-байтовых кадров; 51,2 мкс для 10 Мбит / с, 5,12 мкс для 100 Мбит / с и 4,096 мкс для 1 Гбит / с. Это дает улучшение на 20% только путем перехода от 100 Мбит / с к 1 Гбит / с. s1
  • Увеличьте емкость сети. Вы будете удивлены тем, как много мегабайт в секунду обмениваются между сервером Web и БД, обычно превышающим 10 МБ / с, поэтому требуется минимум 100 МБ / с s1 . Или просто переместите сервер БД локально.
  • Использование SOLR. Внешние движки иногда лучше подходят, SOLR, конечно, быстрее для БОЛЬШИХ каталогов (и я бы подчеркнул, большие каталоги ). Даже ненастроенный SOLR будет производить многоуровневую навигацию и результаты поиска быстрее, чем MySQL.

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

  • Настройте приложение. В Magento есть довольно большие ошибки, связанные с тем, как он создает коллекции и кэширует их; мы столкнулись с рядом серьезных проблем с кодом, которые могут снизить производительность. В некоторых случаях простое удаление отображения количества товаров в многослойных результатах навигации сокращало 2 секунды загрузки большой коллекции.
  • Просмотрите медленные журналы MySQL. Проверяйте медленные запросы и добавляйте индексы по мере необходимости. Разница между выполнением сложного запроса с несколькими объединениями с соответствующими индексами и без них может составлять десятки секунд .

Приложение является узким местом. Не программное обеспечение. Так что простое улучшение кода ядра или уменьшение веса вашего шаблона окажет гораздо более существенное влияние на производительность, чем ЛЮБОЕ изменение конфигурации MySQL.

Что бы нас не беспокоило

  • Смена движка хранилища. MariaDB и Percona используют один и тот же движок InnoDB - Percona XtraDB. Они могут рассматриваться как одно и то же. С точки зрения времени выполнения отдельного запроса, производительность будет точно отражать ванильную сборку MySQL. Это входит в игру под нагрузкой / параллелизмом.
  • Запуск ведомого MySQL. Это не улучшит производительность, если ведомое устройство не находится физически ближе (с точки зрения сети) или если ведомое устройство имеет лучшее оборудование, чем ведущее. Это входит в игру под нагрузкой / параллелизмом.
  • Запуск внешнего сервера БД. Это, безусловно, худший совет, который мы неоднократно раздавали многим хостам / агентствам. Пока вы не достигли предела в отношении аппаратного обеспечения / ресурсов или у вас есть несколько веб-серверов (читай: высокая доступность), MySQL на локальном компьютере для магазина Magento является хорошей идеей. Это устраняет все издержки сети и задержки. Даже сеть со скоростью 100 Гбит / с (да, сто гигабит в секунду) не сравнится с локальным Unix-сокетом по необработанному объему, пропускной способности и задержке.

s1 Только для отдельных серверов баз данных. Не относится к локальным серверам БД.

Общая емкость / параллелизм


Может быть, MySQL является узким местом ? Но только после того, как вы снизили производительность и мощность PHP до такой степени, что MySQL замедляет работу. Если у вас правильно сконфигурированы Varnish и FPC (не заставляйте нас начинать с того, сколько неудачных попыток мы уже видели), - тогда MySQL становится узким местом.

Так что в дополнение к вышеуказанным модификациям.

  • Изменить движок MySQL. XtraDB может преуспеть под нагрузкой и действительно демонстрирует реальные преимущества по сравнению со стандартным дистрибутивом MySQL.
  • Будьте в курсе с MySQL. 5.5 работает лучше, чем 5.0 под нагрузкой.
  • Изменить драйвер PHP MySQL. В PHP 5.3 и новее есть собственный драйвер MySQL, но в некоторых случаях мы нашли PHP 5.2 с отдельным драйвером, который превосходит MySQLND для Magento. Проверьте это сами
  • Сменить поисковик. Перемещение поиска в SOLR / Sphinx (или даже в некоторые сторонние внешние сервисы) может реально облегчить бремя нетранзакционной нагрузки (т. Е. Люди, не размещающие заказы)
  • Поменять многослойный навигационный движок. Опять же, SOLR - это великолепный движок для многоуровневой навигации, который благодаря своей неблокирующей природе намного быстрее, чем MySQL.
  • Добавьте MySQL раб. Это делает помощь посещенной (нетранзакционную) нагрузку, но не поможет вам обрабатывать больше заказов в час - как это зависит от Учителя к процессу и повторить эти данные

Что бы нас не беспокоило

  • Master / Master. Из-за довольно высокой точки перелома аппаратного насыщения установки Master / Slave (более 1000 заказов в час) - мы никогда не считали необходимым использование Master / Master в производстве. Мы провели обширное тестирование, но никогда не находили его выгодным с точки зрения производительности, и, учитывая риски и проблемы, присущие Мастеру / Мастеру, оно просто не стоит.

Масштабирование чтения и записи

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

Учитывая, что соотношение чтений к письмам у Magento составляет около 0,1%, учитывая, что записи не должны вызывать беспокойства. Вот почему я не потрудился упомянуть MySQL Cluster и его умные функции, такие как автоматическое разделение (разделение таблиц на отдельные машины).

Аппаратное, аппаратное, аппаратное обеспечение

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

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

  • Низкокачественные коммутаторы с ограниченными буферами
  • Слишком насыщенные сетевые ссылки
  • Географически удаленные серверы
  • Плохая сеть QoS / CoS
  • Ограниченный общий объем оперативной памяти
  • ОЗУ с низкой пропускной способностью памяти
  • Подсистема HDD с низким IOP
  • Программный RAID-контроллер
  • Низкая тактовая частота процессора
  • Чипсет с низкой пропускной способностью
  • Аппаратная виртуализация (почти все типы, кроме виртуализации на уровне ядра)

В настоящее время существует очень высокий потолок того, насколько высоко вы можете масштабировать оборудование. Давайте проигнорируем миф о бесконечном масштабировании «в облаке», поскольку облачное оборудование имеет тенденцию быть довольно посредственным. Например, у флагманских моделей Amazon всего 12 ядер при 3,3 ГГц. Но помимо этого есть несколько очень мощных серверов - наш топ-сервер имеет 160 ядер и 2 ТБ (да, терабайта) оперативной памяти. Мы еще не видели, чтобы кто-то превосходил возможности этого.

Таким образом, у вас есть широкие возможности для вертикального масштабирования, прежде чем вам даже нужно будет рассмотреть горизонтальное масштабирование.

Вечно движущаяся цель

Стоит отметить, что в погоне за производительностью узкое место всегда будет двигаться.

Для стокового магазина Magento.

Включите тайники. Узким местом является PHP.
Добавьте кеш сервера. Узким местом является PHP.
Добавьте кеш страницы на уровне приложения. Узким местом является PHP.
Добавьте кеш на уровне сервера (например, Varnish). Узкое место в MySQL
Добавьте альтернативный поисковый / многоуровневый механизм навигации (например, SOLR / Sphinx). Узким местом является PHP.
Добавьте больше серверов приложений. Узкое место
- MySQL. Добавьте подчиненный MySQL. Внешнее кэширование является узким местом.
Добавьте больше серверов внешнего кэширования. Узким местом является PHP.
Добавьте больше серверов приложений. SOLR / Sphinx является узким местом

Etcetera.

Это в значительной степени превращается в случай повторного полоскания. Но ясно, что MySQL определенно не является первым портом вызова для оптимизации - и действительно вступает в игру только тогда, когда MySQL потребляет больше ресурсов процессора пропорционально PHP - и это ТОЛЬКО когда-либо происходит, когда используются FPC и Varnish. и сервер (ы) просто обрабатывают заказы и ничего больше (потому что все остальное находится в кеше).

Не вносите изменения вслепую

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

Чтобы положить вещи в перспективе - некоторые примеры из реального мира.

Пример 1 - 300 заказов в час

Мы использовали следующее оборудование для обслуживания 300 заказов в час ; и только в этот переломный момент - тогда мы почувствовали необходимость добавить выделенный сервер MySQL и локальный подчиненный MySQL.

1 Сервер
ЦП: 2x Intel E5-4620
ОЗУ: 64 ГБ HDD: 4x 80k IOP / s SSDs
RAID: Аппаратный RAID 10
Magento Версия: Magento EE
ОС: MageStack

В течение всего времени средние нагрузки оставались ниже 3,00.

Пример 2 - 180 заказов в час

Всего два дня назад наш новый клиент легко впитал большой всплеск трафика. Обработка 180 заказов в час с одним сервером и Magento Community Edition .

1 Сервер
ЦП: 2x Intel E5-4620
ОЗУ: 64 ГБ HDD: 4x 80k IOP / s SSDs
RAID: Аппаратный RAID 10
Magento Версия: Magento CE
ОС: MageStack
Веб-сайт: Wellgosh.com

В течение всего времени средние нагрузки оставались ниже 6,00. В этом сценарии нагрузка была выше, и это было связано с несколькими факторами.

  1. Настройка магазина не была выполнена, как в примере 1
  2. Отсутствие FPC уровня приложения

И учитывая недавнюю ситуацию, у нас все еще есть подробная статистика, чтобы дать некоторую обратную связь с помощью графиков. Они отлично рассказывают о том, как распределяется нагрузка между ключевыми компонентами отдельной архитектуры Magento (балансировщик нагрузки, веб-сервер, сервер БД и т. Д. - с использованием MageStack ).

Итак, спереди назад ... дата, на которую вы хотите посмотреть, - в 12:00 22 февраля.

Пакеты межсетевого экрана
Пакеты межсетевого экрана

Лак Трафик
Лак Трафик

Nginx Traffic
Nginx Traffic

MySQL Load
MySQL Threads MySQL Bytes MySQL Queries

Загрузка процессора
Загрузка процессора

И самое главное, распределение нагрузки

Это изображение действительно говорит обо всем. И это то, что MySQL, конечно, не является бременем - по крайней мере, пока. Так что наш совет, сфокусируйте свои проблемы с производительностью в другом месте, если только вы не обрабатываете более нескольких тысяч заказов в час.

Распределение нагрузки

И в заключение

Внесение изменений в производительность не "один размер подходит всем". Это случай анализа ваших текущих узких мест и тонких изменений / корректировок в соответствии с вашим магазином и инфраструктурой.

Но помимо производительности, есть и другие преимущества использования Percona.

Мы используем Percona XtraDB, почти исключительно. Мы запускаем специально скомпилированные сборки MySQL, которые мы разработали специально для Magento и консультировались с Percona в ходе этого процесса. Но не только производительность повлияла на этот выбор.

  • Percona Toolkit
    • PT-запрос-дайджест
    • XtraBackup
    • и т.п.
  • Частота выпусков Percona
  • Percona консультативная поддержка
  • Теплый кэш перезапускается с сохранением пула InnoDB

И многое другое. Таким образом, использование его над MySQL имело и другие преимущества, помимо производительности. Фактически, MySQL является и всегда был наименьшим из наших беспокойств в стремлении к производительности и стабильности.

Атрибуты: wellgosh.com , sonassi.com , iebmedia.com .


это длинный ответ :) Очень признателен, спасибо. Относительно масштаба и нагрузки на MySQL вот диаграмма Мунина из MySQL: twitter.com/ze_m0n5t3r/status/232864932482396160 . Оптимизация Magento - это постоянный процесс (различные ошибки, неоптимизированный код и т. Д.). Уменьшение нагрузки (перемещение search / nav к solr, лучшее кэширование) - это первый подход. Но также, БД должна вести себя лучше с холодным кешем. И когда это происходит, я ищу более медленный веб-сайт с большей емкостью.
FlorinelChis

Добро пожаловать. Нет никаких оснований утверждать, что у вас не может быть быстрого веб-сайта и большой емкости - это делают наши клиенты . Очевидно, что производительность MySQL немного выше, чем я хотел упомянуть выше. Но это несколько отдает наш «секретный соус». Я подготовил этот ответ для владельцев небольших магазинов (<25 тыс. Уникальных единиц в день) в качестве руководства для начинающих пользователей MySQL.
Бен Лессани - Сонасси

Так же, как sidenote. Глядя на ваш график, ваши вставки достигли пика примерно в 10 раз больше обычной загрузки, обновления оставались низкими, а выбор показывал наибольшую нагрузку. Я бы рискнул, вставки были в журналах клиентов, поисковой релевантности / запросах или, не дай бог, сеансах. Но все же достаточно небольшая цифра, чтобы не ставить проблему и даже не рассматривать Master / Master. Итак, исходя из вашего графика, простое добавление большего количества оборудования будет более чем адекватным; с рабом (ами) после этого. А держать кеш в тепле между перезапусками легко с Percona
Бен Лессани - Sonassi

поиск решен, сессии - memcache. Вы знаете кого-нибудь, кто управляет успешным мастером-мастером? (NBS потерпел неудачу в этом, мы также потерпели неудачу с этим, он нестабилен с Magento, хорошо работает на других более легких приложениях php)
FlorinelChis

1
Это невероятный ответ. Просто хотел сказать это.
мусорщик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.