死んだときにmysqlを自動再起動する


15

個人用プロジェクトを実行するためにレンタルしているラックスペースサーバーがあります。私は安いので、256MbのRAMを搭載しており、正直に多くのことを処理できません。時々、トラフィックが急激に増加すると、サーバーはプロセスの強制終了を開始することを決定し、mysqldが強制終了するのが一般的なようです。サイトにアクセスしようとすると、データベース接続の確立中にエラーが発生したというメッセージが表示されます。ログを調べると、メモリ不足のためにmysqldが殺されたことがわかります。

私は昨日と同じくらい貧しく、ラックスペースVMのRAMをアップグレードしたくないので、mysqldが死んだときに自動的に再起動するように指示する方法はありますか?

crontabのようなものを使用する考えがありますが、悲しいかな、そこで何をすべきか正確にはわかりません。私はデスクトップとラップトップ(Linuxをほぼ排他的に実行する)でほとんどのことができるのに、「デスクトップ上のLinux」世代の製品だと思いますが、Linuxのサーバー管理スキルがまだ不足しています。

サーバーはCentOS 6.3を実行します


どんなディストリビューション?私は成り上がりはUbuntuの上でこれを行うだろうと思う
ジャーニーマンオタク

おっと。その詳細について言及するのを忘れた:CentOS
Los Frijoles

ええ。バージョンも含めることがあります
ジャーニーマンオタク

質問を損なうことはありませんが、おそらく長期的な解決策は代わりに条件を回避することです:)あなたの個人プロジェクトのために単純なアンマネージドVPSが必要な場合は、より大きな箱で良い価格を引き出すことができるローエンドに特化したプロバイダー。私はこれを非常に満足して行いました。lowendtalk.comなど、このようなVPSプロバイダーを見つける場所はたくさんあります。
ジョンチャドウィック

回答:


16

これはきれいな解決策ではありません。そもそも問題を回避する方が明らかに良いでしょう。とにかく、CentOSがどのようにサービスを管理するかはわかりませんが、を使用すると思いますservice。その場合、mysqlサービスが実行されているかどうかを確認できます

/sbin/service mysql status

このコマンドmysqlは、実行中の場合は正常に終了し、iが実行されていない場合は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上で物事を維持するためのブルートフォースの試みでは、MySQLをチェックして再起動するためにterdomの答えの修正を使用しました。

/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

最終的に、システムのルートcrontabに次の行を追加しました。MySQLが実行されているかどうかを毎分チェックし、stdoutをnullにリダイレクトします。何かがうまくいかない限り、サービスを開始しても何も出力されないので、最後のコマンドにnullリダイレクトを追加する必要はありません。

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

ダブルパイプ||OR、最初のコマンドが何らかの理由で失敗した場合に2番目のコマンドを意味し、実行します。(ゼロより大きい終了コードを返します。)

「1番目のコマンドを実行する、または 1番目のコマンドが何らかの理由で失敗した場合は2番目のコマンドを実行する」と言っているようなものです。

これは二重のアンパサンドとは違って&&、と言って、「第一のコマンドを実行して、のようなものである、第一コマンドが成功した場合にのみ、第二のコマンドを実行します」。


1

以下は jonnyreeves.co.uk からのものです


そして犯人はphp-fpmです!すぐにグーグルが同様の症状に苦しんでいる別のWordpressの顧客を見つけました。アドバイスは、php-fpmプール設定(/etc/php-fpm.d/www.conf)を微調整し、pm設定を微調整することでした。主変更から移動することであったpm = dynamicpm = ondemandしてpm.max_childrenの値5(一人当たり約5%のメモリ使用量を観察することに基づいて)。構成を変更した後、すべてのサービスを再起動し、メモリ使用量を確認しました。

service php-fpm restart
service nginx restart
service mariadb restart

再起動後、メモリ使用量は劇的に低下しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.