복붙노트

[MONGODB] mongoError : 토폴로지는 파괴되었다

MONGODB

mongoError : 토폴로지는 파괴되었다

나는 30.000에 대한 일반 크기의 문서 모음 Restify와 몽구스와 MongoDB를 가진 Node.js를 내장 REST 서비스가 있습니다. 나는 PMX와 PM2를 통해 내 노드 서비스 실행 있습니다.

어제, 갑자기, 노드는 메시지와 함께 오류를 엿 시작 "MongoError : 토폴로지가 파괴되지 않았다"더 아무것도. 나는이에 의해 의미와 가능성이 무엇을 촉발 수 있는지 모르겠어요. 이 구글-검색 할 때 발견 될 정도되지도있다. 그래서 내가 여기에 물어 거라고 생각했다.

오늘 노드 서비스를 다시 시작하면 오류가 오는 중지. 또한 생산에서 실행 이들 중 하나를 가지고 있으며 이것이이 실행 설정의 아주 중요한 부분에 주어진 시간에 일어날 수 있다고 겁이나요 ...

내가 언급 한 패키지의 다음 버전을 사용하고 있습니다 :

해결법

  1. ==============================

    1.그것을 쓰기를 시도하는 동안 당신의 MongoDB의 인스턴스 노드 서버의 연결이 중단되었습니다 의미하는 것 같다.

    그것을 쓰기를 시도하는 동안 당신의 MongoDB의 인스턴스 노드 서버의 연결이 중단되었습니다 의미하는 것 같다.

    해당 오류를 생성 몽고의 소스 코드를 살펴 보자

    Mongos.prototype.insert = function(ns, ops, options, callback) {
        if(typeof options == 'function') callback = options, options = {};
        if(this.s.state == DESTROYED) return callback(new MongoError(f('topology was destroyed')));
        // Topology is not connected, save the call in the provided store to be
        // Executed at some point when the handler deems it's reconnected
        if(!this.isConnected() && this.s.disconnectHandler != null) {
          callback = bindToCurrentDomain(callback);
          return this.s.disconnectHandler.add('insert', ns, ops, options, callback);
        }
    
        executeWriteOperation(this.s, 'insert', ns, ops, options, callback);
    }
    

    돛 문제가 코멘트에 인용에 더 업그레이드 충돌 또는 "수정"을 침전 설치되지 않았다 이것은, 관련이있는 것으로 나타나지 않습니다

  2. ==============================

    2.제이슨의 대답이 받아 들여진 것을 알지만, 몽구스와 같은 문제를 가지고 내 데이터베이스를 호스팅하는 서비스가 생산에 살아 MongoDB를의 연결을 유지하기 위해 다음과 같은 설정을 적용하는 것이 좋습니다 것을 발견 :

    제이슨의 대답이 받아 들여진 것을 알지만, 몽구스와 같은 문제를 가지고 내 데이터베이스를 호스팅하는 서비스가 생산에 살아 MongoDB를의 연결을 유지하기 위해 다음과 같은 설정을 적용하는 것이 좋습니다 것을 발견 :

    var options = {
      server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } },
      replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }
    };
    mongoose.connect(secrets.db, options);
    

    나는이 대답은 "토폴로지가 파괴되었다"오류를 가지고 다른 사람들을 도울 수 있기를 바랍니다.

  3. ==============================

    3.이 오류는 어떤 이유로 접속 적하 몽고 드라이버에 기인한다 (예를 들어 서버 다운이었다).

    이 오류는 어떤 이유로 접속 적하 몽고 드라이버에 기인한다 (예를 들어 서버 다운이었다).

    기본 몽구스으로 다음 다시 시도 중지하고 다시 시작할 때까지 영원히 오류를 던져 30 초 동안 다시 연결을 시도합니다.

    당신은 연결 옵션에서 이러한 두 필드를 편집하여 변경할 수 있습니다

    mongoose.connect(uri, 
        { server: { 
            // sets how many times to try reconnecting
            reconnectTries: Number.MAX_VALUE,
            // sets the delay between every retry (milliseconds)
            reconnectInterval: 1000 
            } 
        }
    );
    

    연결 옵션 문서

  4. ==============================

    4.내 경우,이 오류는 db.close ()에 의해 발생되었다; '비동기'의 'await를'섹션의 내부 중

    내 경우,이 오류는 db.close ()에 의해 발생되었다; '비동기'의 'await를'섹션의 내부 중

    MongoClient.connect(url, {poolSize: 10, reconnectTries: Number.MAX_VALUE, reconnectInterval: 1000}, function(err, db) {
        // Validate the connection to Mongo
        assert.equal(null, err);    
        // Query the SQL table 
        querySQL()
        .then(function (result) {
            console.log('Print results SQL');
            console.log(result);
            if(result.length > 0){
    
                processArray(db, result)
                .then(function (result) {
                    console.log('Res');
                    console.log(result);
                })
                .catch(function (err) {
                    console.log('Err');
                    console.log(err);
                })
            } else {
                console.log('Nothing to show in MySQL');
            }
        })
        .catch(function (err) {
            console.log(err);
        });
        db.close(); // <--------------------------------THIS LINE
    });
    
  5. ==============================

    5.그냥 Gaafar의 대답에 약간의 추가, 그것은 나에게 중단 경고했다. 대신이 같은 서버 개체에의 :

    그냥 Gaafar의 대답에 약간의 추가, 그것은 나에게 중단 경고했다. 대신이 같은 서버 개체에의 :

    MongoClient.connect(MONGO_URL, {
        server: {
            reconnectTries: Number.MAX_VALUE,
            reconnectInterval: 1000
        }
    });
    

    그것은 최상위 객체에 갈 수 있습니다. 기본적으로, 단지 서버 개체의 그것을 꺼내 같은 옵션 객체에 넣어 :

    MongoClient.connect(MONGO_URL, {
        reconnectTries: Number.MAX_VALUE,
        reconnectInterval: 1000
    });
    
  6. ==============================

    6.몽고 문서 색인이 작성되기 전에 "토폴로지가 파괴되었다"이 의견에 따라, 몽구스 분리하여 발생할 수 있습니다

    몽고 문서 색인이 작성되기 전에 "토폴로지가 파괴되었다"이 의견에 따라, 몽구스 분리하여 발생할 수 있습니다

    하기 위해서는 반드시 모든 모델은 인덱스, 당신이 할 수있는 연결 해제하기 전에 내장되어 :

    await Promise.all(mongoose.modelNames().map(model => mongoose.model(model).ensureIndexes()));
    
    await mongoose.disconnect();
    
  7. ==============================

    7.나는합니다 alse 같은 오류가 있었다. 마지막으로, 나는 내 코드에 대한 몇 가지 오류가 있음을 발견했다. 나는 두 nodejs 서버에 대한 부하 분산을 사용하지만, 난 그냥 하나 개의 서버의 코드를 업데이트합니다.

    나는합니다 alse 같은 오류가 있었다. 마지막으로, 나는 내 코드에 대한 몇 가지 오류가 있음을 발견했다. 나는 두 nodejs 서버에 대한 부하 분산을 사용하지만, 난 그냥 하나 개의 서버의 코드를 업데이트합니다.

    나는 복제에 독립에서 내 MongoDB의 서버를 변경,하지만 난이 오류를 만났다 그래서 나는 연결 문자열에 해당하는 업데이 트를 수행하는 것을 잊지.

    독립 연결 문자열 : MongoDB를 : // 서버 1 : 27,017 / MYDB 복제 연결 문자열 : MongoDB를 // 서버 1 : 27,017, 서버 2 : 27,017, 서버 (3) : 27017 / MYDB replicaSet = myReplSet

    여기 세부 정보 : [연결 문자열에 대한 몽고의 문서]

  8. ==============================

    8.저는는 Kubernetes / minikube + nodejs + 몽구스 환경에서이를 만났다. 문제는 DNS 서비스가 지연의 종류와이었다이었다. DNS를 확인하는 것은 준비가되어 내 문제를 해결했다.

    저는는 Kubernetes / minikube + nodejs + 몽구스 환경에서이를 만났다. 문제는 DNS 서비스가 지연의 종류와이었다이었다. DNS를 확인하는 것은 준비가되어 내 문제를 해결했다.

    CONST DNS는 = ( "DNS") 요구; VAR dnsTimer = setInterval을 (() => { dns.lookup ( '몽고-0.mongo'(ERR, 주소, 가족) => { 경우 (ERR) { 을 console.log ( 'DNS 조회 ERR', err.code err.code : ERR?); } 다른 { 을 console.log ( 'DNS 조회 : %의 J 군 : IPV % s'를, 주소, 가족); 사항 clearTimeout (dnsTimer); mongoose.connect (mongoURL, db_options); } }); }, 3000); VAR dB = mongoose.connection; var에 db_options = { autoReconnect : 사실, poolSize : 20 socketTimeoutMS : 480000, 킵 얼라이브 : 300000, keepAliveInitialDelay : 300000, connectTimeoutMS : 30000, reconnectTries :에서 Number.MIN_VALUE, reconnectInterval : 1000, useNewUrlParser : 사실 };

    (db_options의 숫자는 임의의 유래에 발견하고 사이트와 같은 유사하다)

  9. ==============================

    9.내 MongoDB를 나침반 커뮤니티에 새 데이터베이스를 만드는 동안 나는이 오류가 발생했습니다. 문제는 실행되지 않았다, 내 Mongod로했다. 그래서 수정으로, 나는 이전으로 Mongod 명령을 실행했다.

    내 MongoDB를 나침반 커뮤니티에 새 데이터베이스를 만드는 동안 나는이 오류가 발생했습니다. 문제는 실행되지 않았다, 내 Mongod로했다. 그래서 수정으로, 나는 이전으로 Mongod 명령을 실행했다.

    C:\Program Files\MongoDB\Server\3.6\bin>mongod
    

    나는 그 명령을 실행 한 후 데이터베이스를 만들 수 있었다.

    희망이 도움이.

  10. ==============================

    10.아드리 엥의 대답에 세바스찬 의견은 나에게 도움이 더 많은 관심을 필요로하지만 주석이 언젠가 이렇게 여기에서 무시 될 수있는 것은 해결책 :

    아드리 엥의 대답에 세바스찬 의견은 나에게 도움이 더 많은 관심을 필요로하지만 주석이 언젠가 이렇게 여기에서 무시 될 수있는 것은 해결책 :

    var options =  { useMongoClient: true, keepAlive: 1, connectTimeoutMS: 30000, reconnectTries: 30, reconnectInterval: 5000 }
    mongoose.connect(config.mongoConnectionString, options, (err) => {
        if(err) {
            console.error("Error while connecting", err);
        }
    });
    
  11. ==============================

    11.나는 약간의 시간이 고민 한 - 당신은 다른 답변에서 볼 수 있듯이,이 문제는 매우 다를 수 있습니다.

    나는 약간의 시간이 고민 한 - 당신은 다른 답변에서 볼 수 있듯이,이 문제는 매우 다를 수 있습니다.

    가장 쉬운 방법은이 레벨 로깅을 설정하는 것입니다 원인이 뭐죠을 찾을 수 있습니다 : 옵션에서 정보

  12. ==============================

    12.여기에 내가 무슨 짓을했는지, 그것은 잘 작동합니다. 문제는 옵션 아래에 추가 한 후 사라졌다.

    여기에 내가 무슨 짓을했는지, 그것은 잘 작동합니다. 문제는 옵션 아래에 추가 한 후 사라졌다.

    const dbUrl = "mongodb://localhost:27017/sampledb";
    const options =  { useMongoClient: true, keepAlive: 1, connectTimeoutMS: 30000, reconnectTries: 30, reconnectInterval: 5000, useNewUrlParser: true }
    mongoose.connect(dbUrl,options, function(
      error
    ) {
      if (error) {
        console.log("mongoerror", error);
      } else {
        console.log("connected");
      }
    
    });
    
  13. ==============================

    13.내 경우,이 오류는 이미 배경을 실행하는 동일한 서버 인스턴스에 의해 발생했다.

    내 경우,이 오류는 이미 배경을 실행하는 동일한 서버 인스턴스에 의해 발생했다.

    이상한 것은 내가 통보없이 내 서버를 시작했을 때, 콘솔이 '뭔가 포트 XXX를 사용하고 있습니다'와 같은 아무것도 보이지 않았다 이미 실행 중 하나를 거기에있다. 난 서버에 뭔가를 업로드 할 수 있습니다. 그래서,이 문제를 찾는 데 꽤 오래 걸렸다.

    무엇보다, 내가 상상할 수있는 모든 응용 프로그램을 닫은 후, 나는 여전히 내 맥의 활동 모니터에서이 포트를 사용하는 프로세스를 찾을 수 없습니다. 나는 추적에 lsof를 사용해야합니다. 범인은 놀라운 일이 아니다 된 -이 노드 과정입니다. 그러나, 터미널에 표시된 PID에, 나는 모니터에 포트 번호가 내 서버에서 사용하는 것과 다른 발견했다.

    모두 모두, 모든 노드의 프로세스가 직접이 문제를 해결할 수 있습니다 죽인다.

  14. ==============================

    14.그런 다음 바로이 문제를 극복하기 위해 몽구스 또는 mongoclient의 일부 옵션을 변경, 토폴로지 오류를 해결하기 위해 몽고를 다시 시작해야합니다 :

    그런 다음 바로이 문제를 극복하기 위해 몽구스 또는 mongoclient의 일부 옵션을 변경, 토폴로지 오류를 해결하기 위해 몽고를 다시 시작해야합니다 :

    var mongoOptions = {
        useMongoClient: true,
        keepAlive: 1,
        connectTimeoutMS: 30000,
        reconnectTries: Number.MAX_VALUE,
        reconnectInterval: 5000,
        useNewUrlParser: true
    }
    
    mongoose.connect(mongoDevString,mongoOptions);
    
  15. ==============================

    15.나는이 문제를 해결 :

    나는이 문제를 해결 :

  16. ==============================

    16.당신은 "연결"메뉴로 이동하고 "연결 대상 ..."메뉴를 클릭해야합니다. 이것은 당신이 다시 연결할 수있는 새로운 MongoDB의 나침반 커뮤니티 창을 엽니 다.

    당신은 "연결"메뉴로 이동하고 "연결 대상 ..."메뉴를 클릭해야합니다. 이것은 당신이 다시 연결할 수있는 새로운 MongoDB의 나침반 커뮤니티 창을 엽니 다.

  17. from https://stackoverflow.com/questions/30909492/mongoerror-topology-was-destroyed by cc-by-sa and MIT license