4

MongoDB サーバーのステータスを毎分チェックし、ダウンしている場合は通知する Perl5 スクリプトを作成しようとしています。このタスクに関する提案は大歓迎です。現在、「MongoDB」モジュールと「MongoDB::MongoClient」を使用して接続を確立し、サーバーが利用可能かどうかを確認しています。基本的な考え方は次のとおりです。

while(1)
{
        my $conn = connectMongoDB();

        if($conn){
                sleep 60;
        }   
        else{
                sendMail();
                last;
        }   
}

sub connectMongoDB
{
        my $client;

        eval{ $client =  MongoDB::MongoClient->new( host => "mongodb://:\@$server");};

        return ($client)?1:0;       
}

主な問題は、サーバーから切断する方法がないことです。cpanページには次のように書かれています:

「データベースから明示的に切断する方法はありません。ただし、MongoDB::MongoClient オブジェクトへの参照が存在しない場合、接続は自動的に閉じられ、クリーンアップされます。これは、$client がスコープ外になった場合に発生します (未定義の場合はそれ以前)。それは undef で)」

「undef」とサブルーチンを試しました。それらのどれも接続を終了しません。ループのため、接続数は増加し続けます。接続数を制御し続けるために試みることができる他の方法はありますか?

この問題に取り組むための他の提案は、crontab を含まない限り高く評価されます。

ありがとう。

編集:

これは、db バージョンが v2.4.4、MongoDB モジュール バージョンが 0.701.4 で、スリープ時間が 2 秒に設定されている場合の出力です。MongoDB モジュールを 0.702.1 にアップグレードした後も問題は解決しません。

Fri Aug 16 20:33:06.986 [initandlisten] connection accepted from 127.0.0.1:51031 #3 (1 connection now open)
Fri Aug 16 20:33:08.989 [initandlisten] connection accepted from 127.0.0.1:51033 #4 (2 connections now open)
Fri Aug 16 20:33:10.991 [initandlisten] connection accepted from 127.0.0.1:51034 #5 (3 connections now open)
Fri Aug 16 20:33:12.994 [initandlisten] connection accepted from 127.0.0.1:51035 #6 (4 connections now open)
Fri Aug 16 20:33:14.996 [initandlisten] connection accepted from 127.0.0.1:51036 #7 (5 connections now open)
Fri Aug 16 20:33:16.999 [initandlisten] connection accepted from 127.0.0.1:51038 #8 (6 connections now open)
Fri Aug 16 20:33:19.003 [initandlisten] connection accepted from 127.0.0.1:51039 #9 (7 connections now open)
Fri Aug 16 20:33:21.006 [initandlisten] connection accepted from 127.0.0.1:51040 #10 (8 connections now open)
Fri Aug 16 20:33:23.009 [initandlisten] connection accepted from 127.0.0.1:51042 #11 (9 connections now open)
Fri Aug 16 20:33:25.013 [initandlisten] connection accepted from 127.0.0.1:51043 #12 (10 connections now open)
Fri Aug 16 20:33:27.016 [initandlisten] connection accepted from 127.0.0.1:51044 #13 (11 connections now open)
Fri Aug 16 20:33:29.019 [initandlisten] connection accepted from 127.0.0.1:51045 #14 (12 connections now open)
Fri Aug 16 20:33:31.022 [initandlisten] connection accepted from 127.0.0.1:51047 #15 (13 connections now open)

編集2:解決しました!!

問題は auto_connect オプションに関連していると思います。無効にすると、コードは正常に機能します。以下は、今のところ機能するものです。

sub connectMongoDB
{
        my $client;

        eval{
                $client =  MongoDB::MongoClient->new( host => "mongodb://:\@$server",
                      auto_connect => 0); 
                $client->connect;
        };  
        return (!$@)?1:0;
}

一番

4

2 に答える 2

4

MongoDB 2.4.1 および CPAN の MongoDB ドライバーのバージョン 0.702.1 では、この問題を再現できません。

スリープ タイムアウトを 10 秒に変更してコードを実行し、localhost に接続しました。数分間実行した後、シェルで実行db.serverStatus()すると、mongo接続が 1 つしか表示されませんでした。(これがシェル セッションの接続です。)

mongod以下は、10 秒ごとに開かれた接続と閉じられた接続を示す出力です。(最初の 2 つの接続が循環した後にシェルを起動したことがわかります。)

Fri Aug 16 21:36:43.589 [conn1] end connection 127.0.0.1:57722 (0 connections now open)
Fri Aug 16 21:36:53.526 [initandlisten] connection accepted from 127.0.0.1:57723 #2 (1 connection now open)
Fri Aug 16 21:36:53.527 [conn2] end connection 127.0.0.1:57723 (0 connections now open)
Fri Aug 16 21:36:58.421 [initandlisten] connection accepted from 127.0.0.1:57724 #3 (1 connection now open)
Fri Aug 16 21:37:03.529 [initandlisten] connection accepted from 127.0.0.1:57725 #4 (2 connections now open)
Fri Aug 16 21:37:03.529 [conn4] end connection 127.0.0.1:57725 (1 connection now open)
Fri Aug 16 21:37:13.531 [initandlisten] connection accepted from 127.0.0.1:57726 #5 (2 connections now open)
Fri Aug 16 21:37:13.532 [conn5] end connection 127.0.0.1:57726 (1 connection now open)
Fri Aug 16 21:37:23.534 [initandlisten] connection accepted from 127.0.0.1:57727 #6 (2 connections now open)
Fri Aug 16 21:37:23.535 [conn6] end connection 127.0.0.1:57727 (1 connection now open)
Fri Aug 16 21:37:33.537 [initandlisten] connection accepted from 127.0.0.1:57728 #7 (2 connections now open)
Fri Aug 16 21:37:33.538 [conn7] end connection 127.0.0.1:57728 (1 connection now open)
Fri Aug 16 21:37:43.540 [initandlisten] connection accepted from 127.0.0.1:57729 #8 (2 connections now open)
Fri Aug 16 21:37:43.540 [conn8] end connection 127.0.0.1:57729 (1 connection now open)
Fri Aug 16 21:37:53.542 [initandlisten] connection accepted from 127.0.0.1:57730 #9 (2 connections now open)
Fri Aug 16 21:37:53.543 [conn9] end connection 127.0.0.1:57730 (1 connection now open)
Fri Aug 16 21:38:03.545 [initandlisten] connection accepted from 127.0.0.1:57731 #10 (2 connections now open)
Fri Aug 16 21:38:03.545 [conn10] end connection 127.0.0.1:57731 (1 connection now open)
Fri Aug 16 21:38:13.547 [initandlisten] connection accepted from 127.0.0.1:57732 #11 (2 connections now open)
Fri Aug 16 21:38:13.548 [conn11] end connection 127.0.0.1:57732 (1 connection now open)
Fri Aug 16 21:38:23.550 [initandlisten] connection accepted from 127.0.0.1:57734 #12 (2 connections now open)
Fri Aug 16 21:38:23.550 [conn12] end connection 127.0.0.1:57734 (1 connection now open)
Fri Aug 16 21:38:33.552 [initandlisten] connection accepted from 127.0.0.1:57735 #13 (2 connections now open)
Fri Aug 16 21:38:33.553 [conn13] end connection 127.0.0.1:57735 (1 connection now open)
Fri Aug 16 21:38:43.555 [initandlisten] connection accepted from 127.0.0.1:57736 #14 (2 connections now open)
Fri Aug 16 21:38:43.555 [conn14] end connection 127.0.0.1:57736 (1 connection now open)
Fri Aug 16 21:38:53.557 [initandlisten] connection accepted from 127.0.0.1:57737 #15 (2 connections now open)
Fri Aug 16 21:38:53.559 [conn15] end connection 127.0.0.1:57737 (1 connection now open)
Fri Aug 16 21:39:03.560 [initandlisten] connection accepted from 127.0.0.1:57738 #16 (2 connections now open)
Fri Aug 16 21:39:03.561 [conn16] end connection 127.0.0.1:57738 (1 connection now open)
Fri Aug 16 21:39:13.563 [initandlisten] connection accepted from 127.0.0.1:57740 #17 (2 connections now open)
Fri Aug 16 21:39:13.564 [conn17] end connection 127.0.0.1:57740 (1 connection now open)
Fri Aug 16 21:39:23.566 [initandlisten] connection accepted from 127.0.0.1:57741 #18 (2 connections now open)
Fri Aug 16 21:39:23.567 [conn18] end connection 127.0.0.1:57741 (1 connection now open)
Fri Aug 16 21:39:33.569 [initandlisten] connection accepted from 127.0.0.1:57747 #19 (2 connections now open)
Fri Aug 16 21:39:33.570 [conn19] end connection 127.0.0.1:57747 (1 connection now open)
Fri Aug 16 21:39:43.572 [initandlisten] connection accepted from 127.0.0.1:57748 #20 (2 connections now open)
Fri Aug 16 21:39:43.573 [conn20] end connection 127.0.0.1:57748 (1 connection now open)
Fri Aug 16 21:39:53.575 [initandlisten] connection accepted from 127.0.0.1:57750 #21 (2 connections now open)
Fri Aug 16 21:39:53.576 [conn21] end connection 127.0.0.1:57750 (1 connection now open)
Fri Aug 16 21:40:03.579 [initandlisten] connection accepted from 127.0.0.1:57751 #22 (2 connections now open)
Fri Aug 16 21:40:03.579 [conn22] end connection 127.0.0.1:57751 (1 connection now open)
Fri Aug 16 21:40:13.580 [initandlisten] connection accepted from 127.0.0.1:57753 #23 (2 connections now open)
Fri Aug 16 21:40:13.581 [conn23] end connection 127.0.0.1:57753 (1 connection now open)
Fri Aug 16 21:40:23.584 [initandlisten] connection accepted from 127.0.0.1:57754 #24 (2 connections now open)
Fri Aug 16 21:40:23.584 [conn24] end connection 127.0.0.1:57754 (1 connection now open)
Fri Aug 16 21:40:33.586 [initandlisten] connection accepted from 127.0.0.1:57755 #25 (2 connections now open)
Fri Aug 16 21:40:33.586 [conn25] end connection 127.0.0.1:57755 (1 connection now open)
Fri Aug 16 21:40:43.588 [initandlisten] connection accepted from 127.0.0.1:57758 #26 (2 connections now open)
Fri Aug 16 21:40:43.588 [conn26] end connection 127.0.0.1:57758 (1 connection now open)
Fri Aug 16 21:40:53.590 [initandlisten] connection accepted from 127.0.0.1:57760 #27 (2 connections now open)
Fri Aug 16 21:40:53.591 [conn27] end connection 127.0.0.1:57760 (1 connection now open)
Fri Aug 16 21:41:03.592 [initandlisten] connection accepted from 127.0.0.1:57761 #28 (2 connections now open)
Fri Aug 16 21:41:03.593 [conn28] end connection 127.0.0.1:57761 (1 connection now open)

使用している MongoDB (サーバー) と MongoDB (ドライバー) のバージョンを教えてください。

于 2013-08-17T01:44:13.177 に答える