私はデータベースのHAテストを行ってきましたが、サーバーの停止のシミュレーションで問題が見つかりました。
私のテストではDjangoを使用し、これを行います。
- データベースに接続する
- クエリを実行します
- サーバーのネットワークコードを引き出します
- 別のクエリを実行します
この時点で、すべてがmysql_ping関数内で無期限にハングします。私のアプリに関する限り、(前のクエリのために)データベースに接続されていますが、サーバーが応答するのに長い時間がかかっているだけです...
このような状況に対処する方法を知っている人はいますか?すでに接続しているため、connect_timeoutが機能しません。read_timeoutはやや鈍器のようです(とにかくDjangoで動作させることすらできません)。
デフォルトのソケットタイムアウトの設定も機能しません(これはMySQLだけでなく、すべてのソケット操作に影響を与えるため、非常に鈍くなります)。
スレッド内でクエリを実行し、Thread.join(timeout)を使用してタイムアウトを実行することを真剣に検討しています。
理論的には、このタイムアウトを実行できれば、再接続ロジックが開始され、データベースの自動フェイルオーバーが完全に機能するはずです(影響を受けるプロセスのkill -9は現在トリックを実行しますが、少し手動です!)。