3

状況は、Linux を搭載した AWS EC2 ミディアム インスタンスを使用しているということです。
Drupalもあります。それに加えて、Drupal と同じ設定で mysql にアクセスするファイルもいくつかあります。
問題は、ある時点で mysql が接続を拒否することです。
低負荷または高負荷 (これとは関係ありません) がある場合に発生し、アクセスできなくなると、mysqld プロセスは引き続き実行され、停止しません。
このプロセスを再起動しても問題は解決しません。インスタンスの再起動 - 問題を修正します。

localhost に接続すると、次のようになります。

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

mysql.sock ファイルが配置され、適切な権限がある場合。
mysqld を再起動しても問題は解決しませんが、インスタンスを再起動すると問題が解決します。

my.cnf は次のようになります。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

wait_timeout=28800

interactive_timeout = 28800

max_allowed_packet=32M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

同様に、mysqld はエラーなしで実行され、ログには次のように表示されます。

120830  9:48:00 [Note] /usr/libexec/mysqld: Shutdown complete

120830 09:48:00 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
120830 09:48:01 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120830  9:48:01 [Note] Plugin 'FEDERATED' is disabled.
120830  9:48:01 InnoDB: The InnoDB memory heap is disabled
120830  9:48:01 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120830  9:48:01 InnoDB: Compressed tables use zlib 1.2.3
120830  9:48:01 InnoDB: Using Linux native AIO
120830  9:48:01 InnoDB: Initializing buffer pool, size = 128.0M
120830  9:48:01 InnoDB: Completed initialization of buffer pool
120830  9:48:02 InnoDB: highest supported file format is Barracuda.
120830  9:48:02  InnoDB: Waiting for the background threads to start
120830  9:48:03 InnoDB: 1.1.8 started; log sequence number 4191070086
120830  9:48:03 [Note] Event Scheduler: Loaded 0 events
120830  9:48:03 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.5.20'  socket: '/var/lib/mysql/mysql.sock -u root'  port: 3306  MySQL Community Server (GPL)

問題が再び発生したとき、ログを再度取得し、httpd を停止してから mysqld を停止し、mysqld を実行してから httpd を実行しようとしましたが、ログは通常の状態のログとまったく同じで、再起動シーケンスも同じです。

php.ini を変更しても状況は保存されませんでした:

mysql.allow_persistent = Off

この順序で再起動しても役に立ちません (別の順序で試しても):

service httpd stop
service mysqld stop
service mysqld start
service httpd start

何が問題なのか、どうすればそのような落下を防ぐことができるのかを突き止めたいと思います。

4

3 に答える 3

1

構成を一瞥するだけです。タイムアウトがめちゃくちゃ高くなっています。他の人が推測しているように、私はあなたが持続的接続を使おうとしていると思います。ただし、これらは通常、標準ext/mysql(i)またはext/PDO`では機能しません。

新しいmysqlnd多重化プラグインイントロを参照、FAQを参照)のようなものをいじりたくない場合は、大幅に下げて、トラフィックの急増が発生したときに(mysqld側で)wait_timeout監視することをお勧めします。max_connections

したがってwait_timeout、アプリケーションが接続ハンドルを適切に処理しない場合、基本的に接続ハンドルを解放します。Webアプリケーションでは、接続が10秒以上アイドル状態である必要があるという意味はありません。また、多くの孤立した接続をスタンバイにする必要はありません。

第二に、max_connections変数は5,000のようなものに上げるだけでは不十分であるため、変数も重要です。これは、MySQLがその数の接続を許可する一方で、これらの潜在的な接続を処理するためのリソース(RAM)も割り当てるためです。それらが必要です。

root急上昇中は、自分のアカウントでMySQLに接続できるはずです。これは、サーバーをデバッグできるようにするための安全対策です。私の提案は、slow-logも一時的に有効にすることです。

さらに、スパイク中にプロセスリストを確認しますmysqladmin -u root -pPASS PROCESSLIST。何かが途切れた場合は、root(mysql -u root -pPASS)で接続して発行してSHOW FULL PROCESSLIST;ください。

プロセスリストから、で数回表示されるクエリを調査しEXPLAINて、その最下部に到達します。彼らがインデックスを使用しない場合、それはあなたの問題の1つです。

別のオプションは、 Perconaサーバーのようなものに移動することです。氷山の一角であるxtradb(innodbと100%互換性があります)と、より詳細な出力(ミリ秒)を提供する低速のクエリログなど、多くの追加機能があります。もちろん無料です。MySQLが彼らのブログであるすべてのものについての良い読み物–mysqlパフォーマンスブログ

LBNL –推測しているだけですが、リソースが不足している可能性があります。c1.mediumは優れたエントリーレベルのインスタンスです(t1.microまたはm1.small実際の目的のIM * H * Oを提供しません)が、十分ではない可能性があります。それはすべて、データベースのサイズと実際のトラフィックに依存します。

遠慮なくコメントしてください、そして私は私の答えを拡張することを試みることができます。

追加–私は他の答えのコメントを読んだだけです。

EBSでサポートされているインスタンスを削除することをお勧めします。本当に悪い考えだと思います。永続性が本当に必要な場合は、エフェメラルストレージを使用して通常のインスタンスを作成し、それに2つ(1つ以上)のEBSボリュームを接続し、IO/sを増やすためにそれらにRAID10を接続します。

また、それについてはまだ触れていませんが、サーバーの監視が不足しているようです。個人的には、すべてのインスタンスでほぼリアルタイムのバイタルを提供するLibratoシルバーラインを使用しています。これは、ストレージに関する潜在的な問題を絞り込むのにも役立ちます。

于 2012-09-08T13:46:11.807 に答える
1

上記の症状だ​​けから、次のことが起こっている可能性があります。お役に立てば幸いです。

PHPが永続的なデータベース接続を使用している可能性がありますが、これはおそらく適切に閉じられません。特定の制限に達すると、データベースは(UNIXソケットまたはネットワークからの)新しい接続を受け入れなくなります。

php.iniには、次のようなデータベースの持続的接続に関連する設定があります。

mysql.allow_persistent = Off

mysqldの再起動が機能しないという事実は、次の2つのことに関連している可能性があります。

  1. 再起動は、明示的な後に;service mysqld stopが続くことと同じではない場合があります。service mysqld startまた、再起動中にログをチェックして、異常が発生したかどうかを確認することもできます。

  2. 再起動シーケンスを少し変更して、PHPのセットアップも含めることができるため、最初にapacheを停止してから、mysqldを停止します。その後、逆の順序で開始します。

于 2012-09-05T02:53:26.837 に答える
1

私はこのテーマの経験豊富なユーザーではありませんが、ソケットファイルに問題が発生した場合は、代わりにTCP/IPを使用するようにアプリを構成しました。ソフトウェア構成でlocalhostの代わりに127.0.0.1を使用して、ソケットファイルの代わりにTCP/IPを強制することができます。

あなたは別のstackoverflowの質問に対するXiaofengTengの答えに興味があるかもしれません:

マイケルの言葉に加えて、

別のリンクがあります:http: //dev.mysql.com/doc/refman/5.1/en/connecting.html、それは言います:

Unixでは、MySQLプログラムはホスト名localhostを特別に扱い、他のネットワークベースのプログラムと比較して予想とは異なる可能性があります。ローカルホストへの接続の場合、MySQLプログラムはUnixソケットファイルを使用してローカルサーバーに接続しようとします。これは、ポート番号を指定するために--portまたは-Pオプションが指定されている場合でも発生します。

これは一般的なtcp/ip接続ではありません。

もちろん、これはあなたの質問に答えることはありませんが、おそらくあなたの問題を解決します。

于 2012-09-10T02:59:29.547 に答える