У меня есть 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 один из них. Перейдите по ссылке, и вы также найдете несколько полезных советов и распространенных ошибок.
Надеюсь это поможет!