Назад | Перейти на главную страницу

MySQL уходит, когда объем трафика резко возрастает

У меня есть 2 сервера, на которых работает 1 сайт. Сервер №1 предназначен для Apache, обслуживающего файлы веб-сайта в Интернете. Сервер №2 выделен для MySQL и обслуживает базу данных на сервере №1. Gigabit Ethernet соединяет 2 сервера.

Проблема, с которой я сталкиваюсь, связана с Сервером №2, когда трафик увеличивается, MySQL уходит, и мне приходится перезапускать MySQL, чтобы снова вернуть его в сеть. Когда мы достигаем слишком большого объема трафика в Интернете, страницы просто зависают, и у всех появляется экран с ошибкой базы данных.

Я думаю, что файл my.cnf набран неправильно и нуждается в оптимизации.

Оба сервера идентичны серверам Dell PowerEdge, вот их характеристики:

http://www.day32.com/MySQL/ есть сценарий, который дает вам некоторые очень простые параметры настройки. Что говорят ваши журналы ошибок, действительно ли происходит сбой сервера? Что-то принудительно меняет местами, заставляя машину работать невероятно медленно, но она восстанавливается?

нужно подождать, чтобы отправить сообщение, serverfault думает, что я робот.

(опубликовано как ответ, поэтому я могу использовать форматирование)

Разместите следующее:

grep -vE '^#' /etc/my.cnf
for db in $(mysql -e 'show databases' | sed 1d); do mysql -e 'show table status' $db | awk '{print $2,$5}'; done
mysqlreport

Получите mysqlreport из http://hackmysql.com/mysqlreport если не получается - получи.

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

Также, возможно, ваш сервер приложений пытается подключиться к mysql, но выдает ошибки, в этом случае через некоторое время он будет занесен в черный список. Попробуйте выполнить mysqladmin flush-hosts вместо полного перезапуска. Если это поможет, поместите команду в crontab, и тогда у вас будет время исследовать проблему без простоев в вашей производственной среде. Включите все журналы на стороне клиента и вперед.

Я подозреваю, что max_connect_errors переменная в MySQL заполняется. По умолчанию это только 10, после чего MySQL начинает отклонять тот конкретный сервер, который превысил значение max_connect_errors.

Вы можете временно увеличить это значение с помощью SET GLOBAL max_connect_errors='10000' или так и навсегда, поставив

max_connect_errors = 10000

на ваш /etc/mysql/my.cnf файл (или где он у вас есть).

Я думаю, вам нужно правильно настроить my.cnf. Конфигурации MySQL по умолчанию слишком консервативны.

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

С другой стороны, регистрируйте медленные запросы, активируя slow_query_log. Это будет регистрировать все запросы, выполнение которых занимает более 2 секунд (это также можно настроить). Затем взгляните на этот журнал и посмотрите, какие запросы можно оптимизировать. Иногда это просто вопрос создания индекса.

Вы также можете запустить show processlist в оболочке MySQL и посмотрите, какие запросы продолжают появляться. Эти запросы также заслуживают внимания, поскольку их, вероятно, можно оптимизировать.

Вы также можете воспользоваться кешем запросов MySQL.

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

Надеюсь это поможет!