Назад | Перейти на главную страницу

Что вызывает запрос обработки SocketException (9001) в приложении node.js и MongoDB ReplicaSet?

У меня есть простое приложение node.js, которое выполняет один вызов подключения к моему ReplicaSet. Раньше сегодня все работало нормально, и в приложении ничего не изменилось, теперь у меня пропадает соединение (тихо), и я вижу следующее в своих журналах mongod.

Thu Apr 18 17:16:56 [conn1782026] end connection 10.x.x.x:50720 (40 connections now open)
Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.x.x.x:50721 #1782027 (41 connections now open)
Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.x.x.x:50722 #1782028 (42 connections now open)
Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.x.x.x:50723 #1782029 (43 connections now open)
Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.x.x.x:50724 #1782030 (44 connections now open)
Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.x.x.x:50725 #1782031 (45 connections now open)
Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.x.x.x:50736 #1782032 (46 connections now open)
[conn1782028] SocketException handling request, closing client connection: 9001 socket exception [2] server [10.x.x.x:50722]

Я не смог отследить, что вызывает это, или как это исправить.

Вот мой код подключения:

var _ = require("underscore");
var db_options = {
    db:{
            w:1,
            native_parser: false
        },
    server:{
        auto_reconnect:true,
        socketOptions: {}
    },
    replSet:{
        rs_name: "my_replset_name",
        readPreference: "secondary"
    },
    mongos: {}
};
db.client.connect("mongodb://server1:27017,server2:27017,server3:27017/my_database", db_options, function(err, _db){
    if(err){
        console.log(err);
    }else{
        _db.collection("my_collection", function(err, collection){
            collection.find({q:1}).toArray(function(err,item){
                if(err){
                    console.log(err);
                }else{
                    _.each(item, function(r){
                        if(!_.isEmpty(r)){
                            // do something with this item!
                            console.log(r._id);
                        }
                    });
                    console.log("Finished.");
                }
            });
        });
    }
});

Я запускаю свой ReplicaSet на EC2, и все может успешно подключаться друг к другу, есть простое приложение node.js, которое делает один вызов соединения для моего ReplicaSet - как я уже сказал, это сработало, а затем перестало работать без уведомления.

Кто-нибудь знает об этом? Что вызывает это? Как это предотвратить? Как это исправить?

Заранее спасибо.

Сложно диагностировать с помощью предоставленной информации, но возможный ключ к разгадке - это количество открытых вами подключений (числа начинаются с 1 - conn1 - и увеличиваются с каждым новым подключением). conn1782026 означает, что с этого момента вы открыли около 1,8 миллиона подключений. mongod был начат. При одновременных подключениях ~ 40, я надеюсь, что mongod был до очень Давно время, чтобы увидеть это количество открытых и закрытых соединений.

Если нет, то это может быть намеком на то, что происходит. Вы создаете новые соединения каждый раз, когда запускаете запрос или аналогичный? Если это так, вам может потребоваться настроить свой код для объединения соединений в пул (см. Различные варианты здесь).

Теоретически вы все равно сможете это сделать - само по себе наличие большого количества подключений не вызовет проблем, но количество оттока здесь может иметь непредвиденные последствия. Попробуйте перезапустить mongod, проверьте, если все еще есть, перезапустите экземпляр и повторите попытку. Если какой-либо из них устраняет проблему, то это вряд ли связано с сетью (сброс системы приведет к сбросу сетевых интерфейсов, поэтому все еще есть небольшая вероятность), даже если это проявляется как исключение сокета.

Кстати, если вы хотите получить представление о том, сколько соединений вы создаете, посмотрите здесь:

> db.serverStatus().connections
{ "current" : 1, "available" : 2047, "totalCreated" : NumberLong(1) }

totalCreated это счетчик на время жизни конкретного mongod или mongos обработать. Если разделить его на время безотказной работы, вы также можете получить среднее значение за секунду и т. Д.

Если вы хотите пойти дальше, вы можете использовать отличный mtools построить график соединение отток с течением времени и посмотрите, есть ли особенно высокие всплески при создании / разрушении соединения.

Если сбросы не имеют никакого эффекта и вы все еще видите исключения, то пора взглянуть на вашу сеть. Проверьте вывод netstat -s (несколько выборок) и ищите увеличивающиеся повторные передачи и быстрые повторные передачи, запустите ifconfig для поиска ошибок в ваших интерфейсах, ping, traceroute и т. д. - все обычные вещи, которые вы должны сделать, чтобы попытаться определить, есть ли проблема с сетью.