Автоматичний перезапуск mysql, коли він вмирає


15

У мене є сервер стійок, який я здаю в оренду для запуску своїх особистих проектів. Оскільки я дешевий, у нього є 256 Мб оперативної пам’яті і, чесно кажучи, не можна багато працювати. Раз у раз, коли відбувається різкий перебіг у трафіку, сервер вирішує розпочати процеси вбивства, і здається, що mysqld є популярним для його вбивства. Я намагаюся завітати на мій сайт і мене вітають з повідомленням про те, що сталася помилка встановлення підключення до бази даних. Перевірка журналів виявляє, що mysqld був убитий через відсутність пам’яті.

Оскільки я все ще такий же бідний, як і вчора, і не хочу оновлювати оперативну пам’ять моєї стільниці VM, чи є спосіб, який я можу сказати, щоб автоматично перезапустити mysqld, коли він помре?

У мене є думка використовувати щось на кшталт кронтабу, але, на жаль, я теж не знаю, що робити там. Я думаю, що я є продуктом покоління "Linux на вашому робочому столі", оскільки я можу робити більшість речей на своєму робочому столі та ноутбуці (які працюють майже виключно в Linux), але все ще не вистачає багатьох навичок адміністрування сервера для Linux.

Сервер працює на CentOS 6.3


який дистрибутив? Я думаю, що початківці зроблять це на ubuntu
Journeyman Geek

Уопс. Забув згадати цю деталь: CentOS
Los Frijoles

е-е. можливо, хочеться включити і версію
Journeyman Geek

Не заважати питанню, але, можливо, довгостроковим рішенням буде, щоб замість цього уникнути умови :) Якщо ви просто хочете простий некерований VPS для своїх особистих проектів, ви можете отримати хорошу ціну на більшій коробці від постачальник, який спеціалізується на низьких рівнях. Я зробив це з великим задоволенням. Є багато місць, щоб знайти таких постачальників послуг VPS, наприклад, lowendtalk.com.
Джон Чадвік

Відповіді:


16

Це не чисте рішення, очевидно, краще було б уникнути проблеми в першу чергу. У всякому разі, я не впевнений, як CentOS керує сервісами, але я думаю, що він використовує service. Якщо так, ви можете перевірити, чи працює mysqlслужба

/sbin/service mysql status

Ця команда буде успішно завершена, якщо mysqlвона запущена, і поверне статус виходу без 0, якщо я ні. Тому ви можете запустити службу, якщо вона не працює з цією командою:

/sbin/service mysql status || service mysql start

Ви можете додати цей рядок, /etc/crontabщоб запускати команду thes щохвилини:

* * * * * /sbin/service mysql status || service mysql start


6

Це трохи непокоїть.

mysqld завжди перезапускається mysqld_safe, оскільки внизу є нескінченна петля,mysqld_safeщоб перевірити наявність аномальних відключень. Якщо помилка занадто сильна, навітьmysqld_safeне вдалося б перезапуститиmysqldнаступні спроби.

Враховуючи ту ситуацію, для mysqld_safeякої створено, можливо, не годиться змушувати mysqldїї починати, якщо mysqld_safeвсе одно відкинемо її.

Вам потрібно знайти журнал помилок у my.cnf він буде під

[mysqld]
log-error=log-filename

або

[mysqld_safe]
log-error=log-filename

Прочитайте текстовий файл (можливо, запущений tail -30 log-filename) і знайдіть джерело роботи програми mysqld, що вимикається.


Цікаво ... дивлячись на мій журнал, вказується, що mysqld був перезапущений, але потім приблизно через 1-2 години він скаже, що процес закінчився. Після цього наступний запис - це мій ручний старт. Можливо, у мене mysqld_safe налаштований неправильно?
Лос Фрійолес

3

У переборі спробі зберегти речі і встановлюються на VPS з низьким рівнем пам'яті, я використовував модифікацію terdom в відповідь , щоб перевірити і перезапустити MySQL.

/sbin/service mysqld status || service mysqld restart

Мені потрібно змінити , mysqlщоб mysqldотримати його на роботу. Без нього я отримав би помилку, " ERROR! MySQL is running but PID file could not be found".

У моїй системі CentOS 7.2 /sbin/serviceпереадресація на /bin/systemctl status, тому наступна команда буде швидше виконати.

/bin/systemctl status  mysqld.service || /bin/systemctl start  mysqld.service

Я в кінцевому підсумку додав наступний рядок до кореневого кронтабу системи. Він перевіряє щохвилини, чи працює MySQL і перенаправляє stdout до нуля. Запуск служби нічого не виведе, якщо щось не піде не так, тому не потрібно додавати нульове переспрямування в останню команду.

* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start  mysqld.service

Подвійна труба ||означає ORі виконає другу команду, якщо перша команда якось не вдасться. (Повертає вихідний код більше нуля.)

Це як сказати: "Виконайте 1-ю команду, або , якщо 1-а команда якось не вдасться, запустіть 2-ю команду".

Це на відміну від подвійного амперсанда &&, як це сказати: "Виконайте 1-ю команду, і , лише якщо перша команда була успішною, запустіть другу команду".


1

Далі від jonnyreeves.co.uk :


А винуватець - php-fpm! Швидкий google знайшов іншого клієнта Wordpress, який страждав від подібних симптомів; порада полягає в налаштуванні конфігурації пулу php-fpm (/etc/php-fpm.d/www.conf) і налаштування конфігурації pm. Основна зміна було перейти від pm = dynamicдо pm = ondemandз pm.max_childrenзначенням 5(на основі спостережень ~ 5% використання пам'яті на одного працівника). Після зміни конфігурації я перезапустив усі сервіси і перевірив використання пам'яті.

service php-fpm restart
service nginx restart
service mariadb restart

Після перезавантаження використання пам'яті було значно нижчим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.