質問するログイン新規登録

Q&A

1回答

1198閲覧

WebサーバーからDBサーバーのMySQL接続時に発生する「Cannot assign requested address」を解決したい

kyoteibiyori

総合スコア6

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

0グッド

0クリップ

投稿2024/12/13 09:04

0

0

実現したいこと

WebサーバーからDBサーバーのMySQL接続時に発生する「Cannot assign requested address」の原因を追究してエラーを解決したいです。

発生している問題・分からないこと

WebサーバーとDBサーバーでサイトを運営しています。
OSは両方ともCentOS 7.5.

今月に入ってからWebサーバーからDBサーバーのMySQL接続時に「Cannot assign requested address」が不定期に発生し始めました。
原因を調べているとTCPの「TIME_WAIT」が3万を超えたタイミングでエラーが発生していることが分かりました。

DBサーバーのIPへの接続で大量の「TIME_WAIT」が発生しているのですが、何が原因で発生しているのかわからない状況です。スロークエリを確認しましたら、遅延しているクエリはありませんでした。

ユーザー数のアクセス数やバージョンアップなども行っていないのに急に発生し始めたので、どのようにして解決していけばいいか、ご教授をよろしくお願いいたします。

エラーメッセージ

error

1Cannot assign requested addressが大量に発生しています。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

「Cannot assign requested address」が発生するタイミングを監視していたところ「TIME_WAIT」が3万を超えた時に発生することが分かりました。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

hqf00342

2024/12/14 02:21 編集

「TIME_WAIT」はどのようなコマンドを実行してどのような出力がされているのですか? ssコマンド等の結果であればLocalAddressとPeerAddressが分かるようにその出力を追記してください。
kyoteibiyori

2024/12/14 02:46

ご回答ありがとうございます。 下記のコマンドを実行しました。 netstat -an | grep TIME_WAIT | awk '{print $5}' | sort | uniq -c | sort -nr | head 結果下記が出力されました。 13908 192.168.xxx.xxx:3306 2 xxx.xxx.xxx.xxx:80 1 xxx.xxx.xxx.xxx:36927 1 xxx.xxx.xxx.xxx:46349 一番上のみローカルアドレスになります。 お手数をおかけしますが、ご確認をよろしくお願いいたします。
hqf00342

2024/12/14 08:33 編集

確認ありがとうございます。print $5 ということはCentOS7ならForeign Addressを記載されたのだと思いますが、そうでなく、記載したようにLocalAddressとPeerAddress(netstatであればLocalAddressとForeign Address)のセットで確認してください。 TIME_WAITが3万を超えているという事はおそらくTCPポートの枯渇が考えられますが、 TimeoutになっているものがDBとの通信によるものなのか(LocalAddressのポートがDB宛が多いか)、通信相手(Foreign Address)は自分が把握しているサーバなのか、それとも見知らぬものIPなのか、それを確認された方が良いと思います。
kyoteibiyori

2024/12/14 09:09

確認方法が間違っており申し訳ございません。 ssコマンドの方で「LocalAddress」と「PeerAddress」を確認してみました。 LocalAddressは443ポート宛が3000で残りの10000以上はDB宛になっていました。 またPeerAddressは自分が把握しているサーバーのIPでした。 DB宛に10000以上のTIME-WAITが出ているのは、DBサーバーで処理しきれていないという事なのでしょうか? よろしくお願いいたします。
hqf00342

2024/12/14 09:25

TIME_WAITになっているものの大半がDB向け通信で、心当たりのあるIPからの接続であるならば、その心当たりのあるIPからのDB接続がなぜ増えたのかを確認することが良いと思います。 ここからは想像ですが、DB接続元がWebサーバでapache+PHPのような構成の場合、1つのPHPファイルごとに都度DB接続を生成していると思います。攻撃などではなく利用数が増えたことでこの現象に陥ったのであれば、プログラム側がConnectionPoolを使うなどDB接続の仕方を考慮する必要があると思います。
hqf00342

2024/12/14 09:35 編集

もう少し書くと1つのサーバで接続できるTCPポート数は理論上65536(実際はもっと少ない)です。3万近くのTIME_WAITとESTABLISHの数と合わせ5万近くになっているようであればTCPポートの枯渇が原因と考えられます。
kyoteibiyori

2024/12/14 09:39

ご教授いただきありがとうございます。 今回の不具合が発生してからTIME_WAITの存在を知ったため、以前よりTIME_WAITが増えたかの比較ができないのが原因が判明できない原因ともなっています。 またご指摘の通り、1つのPHPファイルごとにDB接続を生成しております。以前よりDBの容量も大きくなっており、ユーザー数も増えていることもありますので、DBサーバーの接続や負荷に関しても調査してみたいと思います。
hqf00342

2024/12/14 11:06

DBコネクション数が多いことで発生した現象、という結論であれば(頑張って調べてください)、 接続数を減らすようプログラムを修正する方向になるかと思います。 通常はConnectionPoolを使って接続の使いまわしをしますが、apache+PHPの形ではおそらくできないので、PDOのPersistent Connections(PDO::ATTR_PERSISTENT)を使った暫定対処になるのかと思います。残念ながら私はこれを使った実運用経験が無いのでノウハウがありませんが留意点を調べて導入をご検討ください。本来解としてはDB接続部を切り離してAPI化したりDB接続管理できるメジャーなフレームワークに移行等になるでしょうか、頑張ってください。
kyoteibiyori

2024/12/14 11:44

DBコネクション数が原因と確定はできませんが、今一番怪しいところなので、ここから調査して改善していきます。 DB接続部の変更は大きな仕様変更になるため、まずはプログラムの見直しから初めて行きたいと思います。 たくさんのご教授いただきありがとうございました。
guest

回答1

0

スロークエリーがないのであればなんらかの攻撃で大量にクエリーが発行されていたりしませんか?
WEBアプリならhttpdのログを確認してみてください。
場合によってはmysqlのバイナリーログに形跡が残っているかもしれません

投稿2024/12/13 09:12

yambejp

総合スコア118463

kyoteibiyori

2024/12/13 09:24

ご回答いただきありがとうございます。 httpのログを確認したのですが、エラーログは無く、攻撃のように大量にアクセスしているIPはありませんでした。mysqlのバイナリーログは確認していませんでしたので一度確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問