一度のRedisデータベース構成による接続数の漏洩の問題を記す
3616 ワード
問題の背景
昨年のクリスマス当日、突然私が手がけたプロジェクトの警告メールが届き、「Redis::CommandError:ERR max number of clients reached」というエラーメッセージが表示されました.
どんな状況ですか.まさかこのプロジェクトは転覆したのですか?第一反応はこのサーバーが自作のRedisデータベースを実行しているが、クライアントは同じイントラネットのRuby on Railsのアプリケーションしかないのに、どうして接続数が爆発する可能性があるのだろうか.
りろんせつぞくすうけいさん
老いぼれは指をつまんで計算する.
redis-store
gemソースコードに従って、デフォルトの接続プールサイズは5、10個のunicornワークプロセスで、オンデマンド接続で、最大値は10 x 5=50です.他にもRedis接続が使用される可能性があることを考慮しない場合、現在知られている最大Redis接続数の需要は122であり、この数はRedis理論の最大接続数よりはるかに小さいでしょう.そして、接続数が万に達したことを示しています.しかもこのプロジェクトはもうアクセスが少なく、圧力が極めて小さく、理論に必要な接続数に達する可能性は低いでしょう.
きっと何か神秘的な力がこのすべてを主導しているに違いない!!!
モニタリングと分析
以上の理論の最大接続数分析は定性分析にすぎず、いくつかの奇妙なものが存在することを大まかに説明するしかなく、本当に問題の根源を確認したいなら、定量分析をしなければならない.データだけがすべてを説明することができる.
初歩的な観察:Redisデータベースサーバー側監視
遅ればせながら、データを収集するには、最初のステップは監視を加えることなので、その時、Redisクライアントの数(redis内蔵
CLIENT LIST
コマンドを使用)をタイミング的に収集するスクリプトを緊急に書き、crontabと組み合わせてタイミング的に実行し、結果をファイルに書き込み、後続の分析の基礎とした.スクリプトを監視することで、いくつかの興味深い現象を発見します.
さらなる分析:Redisデータベースサーバ側とクライアント接続数の比較分析
前回の発見があった後、私は引き続きシステム命令
sudo netstat -apnt
で6379
ポートの接続数を検査して発見して、クライアントの機械もやっと42個ぐらいredisサーバーの端に接続して、最初の理論の接続数の分析を結びつけて、この数は比較的に合理的です.でも!でも!逆にサービス側機器は同じコマンドでチェックしますが、サービス側の視点では300+個のクライアントが確立した接続があり、ESTABLISHED状態です!この数は上の別の監視方式で得られた数と一致しています!
いったいどんな状況ですか.このような操作はまだありますか?
問題の根源.
これで、Redis接続数が漏れたのは板に釘を打ったことだが、なぜだろうか.そのため、私はネット上で多くの質問と文章を検索して、それからやっと答えを見つけて、案の定、やはりデフォルトの配置の問題です.
Redisのデフォルト設定
redisは、クライアント接続数が多すぎることを避けるために、接続の空き時間がtimeoutの値を超えた場合、接続を閉じることを意味するtimeout構成がある。デフォルトの構成は0です。タイムアウト制限がなく、接続を閉じないことを意味します。生産上は明らかに0は配置されていませんが...
OMG!急いで私たちのredisのプロファイルを開いて、そうかどうかを検証します.案の定、redisはデフォルトの構成を維持しています.
これで,なぜ接続数が漏洩したのか,多くの空きがあるか,実際にクライアントが切断した接続がサーバ側に残っているため,説明が容易になる.では、どのような状況がこのような状況を引き起こすのでしょうか.
私の推測:
問題の修正
問題の根源を見つけてから、修復するのは簡単すぎる.実際、開発分野では、ほとんどの時間をバグ探しに費やしていますが、バグを直すには1分もかからないかもしれません.
まず、次のredisデータベース構成を変更しました.
redisを正常に再起動した後、前のモニタリングスクリプトを再実行して、修復後の状況を観察し、サーバー側とクライアントの接続数が一致していることを確認します.
さらに数日のスクリプトが自動的にデータを収集した後、分析すると、システムは安定した運行を回復し、接続数は理論最大接続数の下に安定していた.
まとめ
この問題の根源は実は小さいが、調査過程には多くの時間がかかり、主に十分なデータが収集されて分析に使用されるのを待つ必要がある.その他の心得:
0.0.0.0
ソース要求をデフォルトで傍受したセキュリティ・ホールを聞いたことがある人がいると信じている.