EC2 MySQL постоянно сбой

У меня есть экземпляр EC2, установленный на x64 amazon linux ami.

Я использую PHP и Wordpress с общим кэшем W3 и php-apc, поддерживаемым MySQL, чтобы протестировать блог, который может обрабатывать приличное количество соединений относительно дешево.

Однако мой mysql продолжает сбой.

Взято из /var/log/mysqld.log

120912  8:44:24 InnoDB: Completed initialization of buffer pool
120912  8:44:24 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120912  8:44:24 [ERROR] Plugin 'InnoDB' init function returned error.
120912  8:44:24 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120912  8:44:24 [ERROR] Unknown/unsupported storage engine: InnoDB

Кто-нибудь знает причину этого?

Текущее использование памяти (ниже)

[[email protected] mysql]# free -m
             total       used       free     shared    buffers     cached
Mem:           594        363        230          0          3         67
-/+ buffers/cache:        293        301
Swap:            0          0          0

Ответ 1

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

Считаете ли вы использование RDS для MySQL? Это действительно предпочтительная методология в мире AWS (по крайней мере, для DB taht не требуется высокая степень пользовательской настройки) и даст вам намного лучшую производительность, чем запуск MySQL на EBS-накопителе (что, я полагаю, вы делаете, так как иначе вы не сохраняйте свой контент БД).

Ответ 2

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

Будьте осторожны при создании SWAP файлов, снова вы только перевязываете симптомы.

Будьте осторожны с изменением настроек конфигурации (и ограничением производительности вашего apache или mysql), который работает очень хорошо в течение некоторого времени, но только теперь внезапно сервер не будет долго оставаться на месте.

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

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

Будьте осторожны при переходе с apache на другой http-сервер, такой как NginX, решительный шаг, который может решить проблему..... но по неправильным причинам

Я был виновен в большинстве из них и поднял много ложной надежды, пока не посмотрел файл apache/var/log/httpd/ACCESS_LOG и не увидел, что мой сайт попадает несколько раз в секунду из того же самого IP-адреса файл под названием XMLRPC.PHP, некоторая DDOS-атака, хорошо известная в кругах Wordpress.

example access_log entry....

191.96.249.80 - - [21/Ноябрь/2016: 20: 27: 53 +0000] "POST/xmlrpc.php HTTP/1.0" 200 370

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

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

example.htaccess

<Files xmlrpc.php>

order allow,deny

deny from 191.96.249.80

allow from all

</Files>"

Надеюсь, мои тяжелые выигранные результаты помогут кому-то еще!

Очевидно, что если ваш журнал доступа не показывает эффект DDOS, это может быть что-то еще, попробуйте все вышеперечисленное!;-), но теперь я видел несколько сайтов wordpress/apache, связанных с этой атакой.... тот же IP тоже! Жаль, что Amazon AWS не позволяет черным спискам в своих группах безопасности. [Вздох]

Ответ 3

Ошибка говорит обо всем - недостаточно памяти для хранения пула.

Если это тестовый экземпляр, подверженный малым нагрузкам, вы можете попробовать установить небольшой образец cnf

http://fts.ifac.cnr.it/cgi-bin/dwww/usr/share/doc/mysql-server-5.0/examples/my-small.cnf

(официальный находится где-то на сайте MySQL, и я не могу найти его).

В противном случае, для производственных целей, я бы серьезно рассмотрел решение Майка Бранта; в противном случае вам нужен более крупный экземпляр Amazon.

Ответ 4

Я исправил его, настроив apache - он использовал всю память, пытаясь запустить слишком много запасных серверов:

#MinSpareServers    5
#MaxSpareServers   20
MinSpareServers    2
MaxSpareServers   4

Конечно, для запуска вашего сайта требуется определенная сумма, но у меня низкий трафик.

Ответ 5

Следуя от ответа Binthere выше, сервер MySQL, сбой на моем экземпляре EC2, также был вызван атакой DDOS и не связан с тем, что микроэкземпляр заканчивается из-за нехватки памяти (что также очень вероятно). Основываясь на некоторых отличных ссылках, которые я нашел в Интернете, вот шаги, которые я предпринял, чтобы быстро проверить проблему.

1 - SSH в экземпляр

2 - sudo tail -200/var/log/httpd/access_log

Затем я увидел много запросов POST от 1 IP-адреса в XMLRPC файле Wordpress. Это была атака.

3 - Снимок экрана об этом, чтобы сообщать группе оскорбления Amazon, если они свяжутся со мной (они делают этот шаг сначала, я узнал после того, как позвонил Amazon)

4 - sudo cp/var/lock/subsys/mysqld/root/mysqld

5 - sudo rm/var/lock/subsys/mysqld

6 - sudo service httpd stop

7 - sudo service mysqld restart

8 - Теперь перед перезапуском веб-сервера я внес некоторые изменения в файл .htaccess в корневом каталоге веб-сайта в /var/www/html (Это касается моей проблемы с атакой) sudo nano/var/www/html.htaccess

разрешить заказ, отрицать отрицать разрешить всем

9 - sudo service httpd start

10 - Дышите признаком облегчения (в любом случае!)

Надеюсь, что это поможет кому угодно:)

Ответ 6

Хорошо, это декабрь 2016 года и, по-видимому, это все еще вокруг.

Клиент сообщил, что один из его сайтов (не управляемый моей компанией) отключился и попросил поддержки. Когда мы начали искать проблему, стало очевидно, что из-за этой уязвимости его веб-сервер был DDoS'ed.

Процедуры смягчения в значительной степени рассматриваются в других ответах, поэтому я просто хочу добавить свои 2 цента: кроме правил .htaccess вы также можете заблокировать IP-адреса, отправляющие запросы с помощью iptables. См. здесь для быстрого обзора. В основном вы получаете от этого:

  • Apache (или то, что вы используете) не потребляет накладные ресурсы, отвечающие 403 на начало атаки или даже записывая их (экономя много места на диске) - ваш компьютер будет просто игнорировать запросы;

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

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

В основном, я grep 'ed запросы на xmlrpc.php записываются Apache и считаются наиболее опасными:

cat  /var/log/apache2/access.log | grep xmlrpc.php | awk '{print $1;}' | sort -n | uniq -c | sort -nr | head -20

Это распечатает отсортированный список из 20 наиболее опасных IP-адресов. Я заметил, что в моих пятерках самых оскорбительных 4 пришли из одной подсети.

Затем, после того, как вы определили, какие из них хотите заблокировать, если у них есть IP-адрес, например 123.123.123.123:

sudo iptables -A INPUT -s 123.123.123.123 -j DROP

Или, если вы хотите настроить таргетинг на определенную подсеть:

sudo iptables -A INPUT -s 123.123.123.123/24 -j DROP

/24 указывает, что вы нацеливаете 123.123.123.XXX, где XXX может быть любой комбинацией. Повторите эту процедуру столько, сколько сочтете нужным. Я закончил блокировку 90% + запросов с помощью всего лишь нескольких правил, но YMMV.

Кроме того, обратите внимание, что это прекратит протоколировать эти оскорбительные запросы, если вы не удалите правила iptables, которые вы указали выше.

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

Ответ 7

У меня была аналогичная проблема с моим экземпляром t2.small EC2. Я бы запустил и перезапустил mysql, и веб-сайт будет примерно в течение 5 минут, прежде чем появится знакомое сообщение об ошибке базы данных.

Это был веб-сайт Wordpress с эластичным IP. После выполнения этих шагов я не потерял никаких данных. Я понимаю, что это произошло из-за хранения EBS в этом экземпляре.

Шаги:

  • Вход в консоль AWS

  • Перейдите в EC2 и выберите экземпляр

  • Действия → Состояние экземпляра → Стоп (требуется около 3 минут для остановки)

  • Действия → Настройки экземпляра → Изменить тип экземпляра (я перешел от t2.small к t2.medium)

  • Действия → Состояние экземпляра → Пуск

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

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

Дополнительная информация: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-resize.html