[MONGODB] 합니까 MongoDB를 다시 연결 문제가 아니면 내가 잘못을하고있는 중이 야?
MONGODB합니까 MongoDB를 다시 연결 문제가 아니면 내가 잘못을하고있는 중이 야?
나는 nodejs와 MongoDB를 사용하고 - 나는 어떤 연결 문제에 봉착했습니다.
음, 사실 "계기"문제! 슈퍼 빠른 내가 일반적으로 결과에 만족 해요 - 그것은 완벽하게 연결합니다.
내 문제 : 나는 잠시 동안 연결을 사용하지 않는 경우가 실속 것 (시간 틀이 5+ 분 다르기 때문에 난, 동안 말). 나는 단선 이벤트를 해고하지 않습니다 - 그것은 바로 중단됩니다.
결국 내가 오류 같은 응답을 얻을 : 연결하지 못했습니다 [* .mongolab.com : * - (* = 마스크 값)
응용 프로그램의 빠른 다시 시작하고 연결의 위대한 다시. 내가 응용 프로그램을 다시 시작하지 않는 경우 때때로, 나는 새로 고칠 수 있고 행복하게 다시 연결합니다.
내가 그것을 "계기"문제라고 생각하는 이유입니다.
코드의 거친 개요 :
나는 코드를 포함 적이 없다 - 나는 그것이 필요한 생각하지 않습니다. 그것은 (연결 드롭 아웃에서 떨어져) 작동
참고 사항 : 단지 하나의 "연결"이 - 결코 가까운 내가 그것. 나는 다시하지 않습니다.
나는 socketio, 몽구스를 사용하고 있습니다.
/* constants */
var mongoConnect = 'myworkingconnectionstring-includingDBname';
/* includes */
/* settings */
/* Schema */
var db = mongoose.connect(mongoConnect);
/* Socketio */
io.configure(function (){
io.set('authorization', function (handshakeData, callback) {
});
});
io.sockets.on('connection', function (socket) {
});//sockets
io.sockets.on('disconnect', function(socket) {
console.log('socket disconnection')
});
/* The Routing */
app.post('/login', function(req, res){
});
app.get('/invited', function(req, res){
});
app.get('/', function(req, res){
});
app.get('/logout', function(req, res){
});
app.get('/error', function(req, res){
});
server.listen(port);
console.log('Listening on port '+port);
db.connection.on('error', function(err) {
console.log("DB connection Error: "+err);
});
db.connection.on('open', function() {
console.log("DB connected");
});
db.connection.on('close', function(str) {
console.log("DB disconnected: "+str);
});
나는 열고 모든 시간을 닫는 것처럼, 여기에 다양한 CONFIGS을 시도 - 그래도, 일반적인 합의가 내가 한 개방 포장 제비와 나처럼하는 것입니다 생각합니다. ??
나는이 나타납니다가의 모든게 확인 말을해도 ... 연결 상태를 점검 유지하는 연결 테스터를 시도 - 문제는 여전히 발생합니다.
나는 일 하나에서이 문제가 있었다. 나는 항상 MongoLab와 MongoDB를 개최했다. 문제는 로컬 호스트에 악화 될 것으로 보인다. 하지만 난 여전히 문제 하늘빛에 지금 nodejit.su 있습니다.
이 모든 곳에서 공교롭게도 - 그것은 나, MongoDB를, 또는 mongolab해야합니다.
그런데 내가 너무 PHP 드라이버와 비슷한 경험이 있었다. (하지만이 nodejs에 확인)
누군가가 그냥 "이 정상입니다"라고하더라도 - 그것은 몇 가지 도움이 좋을 것
사전에 감사합니다
롭
해결법
-
==============================
1.업데이트 :이 주제에 대한 우리의 지원 문서 (이 게시물의 본질적 사본) 우리의 연결 문제 해결 문서로 이동했습니다.
업데이트 :이 주제에 대한 우리의 지원 문서 (이 게시물의 본질적 사본) 우리의 연결 문제 해결 문서로 이동했습니다.
애저 IaaS의 네트워크가 약 십삼분 (경험적에 도착)의 유휴 시간 제한을 적용하는 알려진 문제가 있습니다. 우리는 우리가 더 많은 사용자 친화적 인 일을 할 수 있는지 확인하기 위해 푸른 작업을하고 있지만 그 동안 다른 사람의 문제를 해결하려면 자신의 드라이버 옵션을 구성하여 성공을 거두었습니다.
최대 연결 유휴 시간
우리는 푸른하고 고객과의 작업에서 발견 한 가장 효과적인 해결 방법은 사분 아래의 최대 연결 대기 시간을 설정하고있다. 아이디어는 방화벽 세력 전에 드라이버 재활용 유휴 연결 문제를 확인하는 것입니다. 예를 들어, C #을 드라이버를 사용하는 한 고객은 1 분에 MongoDefaults.MaxConnectionIdleTime를 설정하고 자신의 문제를 정리.
MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);
응용 프로그램 코드 자체는 변경하지 않은,하지만 지금은 무대 뒤에서 드라이버가 적극적으로 유휴 연결을 재활용합니다. 결과뿐만 아니라 서버 로그에서 볼 수있다 : 연결 이탈 많은 응용 프로그램에서 유휴 기간 동안.
관련 몽고 사용자 스레드에서이 방법에 대한 자세한 내용이 있습니다, SocketException이는 푸른에 C #을 드라이버를 사용.
살아 유지
또한 킵 얼라이브의 일종과의 연결이 덜 유휴하여 문제를 해결할 수 있습니다. 이 드라이버는 보통 TCP 연결 유지를 활용하여, 상자의 그것을 지원하지 않는 구현하기 위해 조금 까다 롭습니다. 당신이 자신의 롤해야하는 경우, 몇 가지 간단한 저렴한 명령, 아마 핑마다 몇 분 풀에서 각 유휴 연결을 잡고 실행해야합니다.
연결 해제 처리
끊고도 공격적인 방화벽 설정없이 수시로 발생할 수 있습니다. 당신이 생산에 들어가기 전에 당신은 올바르게 처리해야 할.
첫째, 자동 재 연결을 가능하게해야합니다. 어떻게하는 것은 그래서 드라이버로 드라이버에서 다양하지만 연결이 자동 재 연결에 나쁜 선회했기 때문에 작업이 실패했음을 드라이버 감지 드라이버를 말할 때 다시 연결을 시도 할 수 있습니다.
그러나 이것은 완전히 문제가 해결되지 않습니다. 당신은 여전히 재 연결을 트리거 실패한 작업과 함께 무엇을해야하는지의 문제를 가지고있다. 자동 재 연결이되지 자동으로 재 시도 실패 작업을 수행합니다. 즉, 특히 쓰기를 들어, 위험 할 것입니다. 그래서 일반적으로 예외가 발생하고 응용 프로그램을 처리하도록 요청된다. 종종 읽고 다시 시도하는 것은 생각할 필요도 없다. 그러나 다시 시도 쓰기 신중하게 고려되어야한다.
몽고 쉘 세션은 아래의 문제를 보여줍니다. 기본적으로 몽고의 쉘은 자동 재 연결을 사용할 수있다. 그때 모음라는 이름의 물건에서 문서를 삽입하는 컬렉션의 모든 문서를 찾을 수 있습니다. 나는 다음 30 분 동안 타이머를 설정하고 다시 같은 발견을 시도했다. 그것은 실패했지만 쉘은 자동으로 다시 연결하고 나는 즉시 나의 발견을 시도 할 때 예상대로 일했다.
% mongo ds012345.mongolab.com:12345/mydatabase -u *** -p *** MongoDB shell version: 2.2.2 connecting to: ds012345.mongolab.com:12345/mydatabase > db.stuff.insert({}) > db.stuff.find() { "_id" : ObjectId("50f9b77c27b2e67041fd2245") } > db.stuff.find() Fri Jan 18 13:29:28 Socket recv() errno:60 Operation timed out 192.168.1.111:12345 Fri Jan 18 13:29:28 SocketException: remote: 192.168.1.111:12345 error: 9001 socket exception [1] server [192.168.1.111:12345] Fri Jan 18 13:29:28 DBClientCursor::init call() failed Fri Jan 18 13:29:28 query failed : mydatabase.stuff {} to: ds012345.mongolab.com:12345 Error: error doing query: failed Fri Jan 18 13:29:28 trying reconnect to ds012345.mongolab.com:12345 Fri Jan 18 13:29:28 reconnect ds012345.mongolab.com:12345 ok > db.stuff.find() { "_id" : ObjectId("50f9b77c27b2e67041fd2245") }
무엇을 도와 드릴까요?
당신이 경우 물론, 질문은 support@mongolab.com에 문의 해 주시기 바랍니다. 우리가 도와 드리겠습니다.
-
==============================
2.모든 도움들 주셔서 감사합니다 - 내가 모두 로컬 호스트에서이 문제를 해결하기 위해 관리 및 라이브 서버에 배포했다.
모든 도움들 주셔서 감사합니다 - 내가 모두 로컬 호스트에서이 문제를 해결하기 위해 관리 및 라이브 서버에 배포했다.
여기 내 지금 작업 연결 코드는 다음과 같습니다
var MONGO = { username: "username", password: "pa55W0rd!", server: '******.mongolab.com', port: '*****', db: 'dbname', connectionString: function(){ return 'mongodb://'+this.username+':'+this.password+'@'+this.server+':'+this.port+'/'+this.db; }, options: { server:{ auto_reconnect: true, socketOptions:{ connectTimeoutMS:3600000, keepAlive:3600000, socketTimeoutMS:3600000 } } } }; var db = mongoose.createConnection(MONGO.connectionString(), MONGO.options); db.on('error', function(err) { console.log("DB connection Error: "+err); }); db.on('open', function() { console.log("DB connected"); }); db.on('close', function(str) { console.log("DB disconnected: "+str); });
내가 전에 이것을 사용했다,하지만 어쩌면 옵션이 지금 도움이 - 나는 가장 큰 변화는 "연결"을 통해 "createConnection"를 사용하는 것이 었습니다 생각합니다. 이 문서에서는 많은 도움 http://journal.michaelahlers.org/2012/12/building-with-nodejs-persistence.html
@jareed에서 언급 한 바와 같이, 나는 또한 "MaxConnectionIdleTime"성공을 가진 사람들을 발견 - - 나는 정직하면 나는 이러한 옵션을 추가 한 이유에 대해 지나치게 모르겠지만 최대한 멀리 볼 수있는 자바 스크립트 드라이버는하지 않습니다 이 옵션이 있습니다 :이 동작을 복제하는 것을 시도하려고 시도한이었다.
지금까지 좋은 있도록 -이 사람을 도움이되기를 바랍니다.
UPDATE : 2013년 4월 18일 노트, 이것은 다른 설정으로 두 번째 응용 프로그램입니다
지금은 내가이 해결했다고 생각하지만 문제는 최근에 다른 응용 프로그램에 다시의 추한 머리 장미 - 동일한 연결 코드. 혼란!
그러나 셋업이 약간 달랐다 ...
이 새로운 응용 프로그램은 IISNode을 기준 상자 윈도우에서 실행되었다. 나는 처음에 중요하게이 표시되지 않았다.
내가 AWS로 DB를 이동 있도록 몽고 몇 가지 문제가, 푸른 (@jareed)에 가능성이 있었다 읽기 - 여전히 문제가 지속되었다.
그래서 나는 거기에 꽤 많이 읽고, 다시 옵션에 대한 객체 연주하기 시작했다. 이 결론에 도달했다 :
options: { server:{ auto_reconnect: true, poolSize: 10, socketOptions:{ keepAlive: 1 } }, db: { numberOfRetries: 10, retryMiliSeconds: 1000 } }
즉 좀 더 내 원래 옵션이 난 상태를 반대하는 것이 교육이다. 그러나 - 여전히 좋지 않습니다.
자, 어떤 이유로 난 창 (모듈 그것에 컴파일되지 함께 할 수있는 뭔가를) 상자 있음을 하차해야했다 -이 작업에려고 다른 주에 지출보다 이동하기 쉽게했다.
그래서 나는 nodejitsu에 내 응용 프로그램을 이동했다. 저와 나의 연결 보라는 살아 있었다! 우!
그래서…. 이 의미를 무엇 ... 나는 아무 생각이 없다! 내가 알고 할 것은 ... 이러한 옵션이 Nodejitsu에 작동하는 것입니다. 나를 위해.
나는 IISNode 살아 응용 프로그램을 유지하기 위해 "영원히"스크립트의 어떤 종류를 사용 믿습니다. 이제 앱에서의 킥이에 대한 충돌하지 않는 공정하게,하지만 난 항상 새로 고쳐집니다 "응용주기"의 일종이 있어야합니다 생각하는 -이 그것을 연속 배포 (FTP 코드까지, 필요를 할 수있는 방법입니다 ) 응용 프로그램을 다시 시작 - 어쩌면 이것은 요인이다; 하지만 난 지금 같은데요.
지금은 물론 모든 수단 중이 해결되지이다. 아직 해결되지 것. 그냥 내 설정에서 나를 위해 해결합니다.
-
==============================
3.여전히이 문제를 가진 사람들을위한 권고 사항의 몇 :
여전히이 문제를 가진 사람들을위한 권고 사항의 몇 :
-
==============================
4.이 같은 auto_reconnect 서버 옵션을 사용 :
이 같은 auto_reconnect 서버 옵션을 사용 :
var db = mongoose.connect(mongoConnect, {server: {auto_reconnect: true}});
연결 여기있는 거 오프닝은 연결하는, 그래서 실제로 맞아요을 (기본적으로) (5 개) 연결 풀이며 열어 둡니다. 내 생각 엔 당신이 간헐적으로 mongolab와의 연결을 잃고 그 발생 때 연결이 죽을 것입니다. 바라 건데, auto_reconnect 해결되는 것을 가능하게한다.
-
==============================
5.증가 시간 초과 도움이 될 수 있습니다.
증가 시간 초과 도움이 될 수 있습니다.
-
==============================
6.나는 비슷한 문제가 주기적으로 MongoDB를에서 분리되고 있었다. 두 가지를 고정하고 :
나는 비슷한 문제가 주기적으로 MongoDB를에서 분리되고 있었다. 두 가지를 고정하고 :
from https://stackoverflow.com/questions/13980236/does-mongodb-have-reconnect-issues-or-am-i-doing-it-wrong by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 왜 몽구스는 스키마와 모델 모두이 있습니까? (0) | 2019.12.21 |
---|---|
[MONGODB] MongoDB를 수집에서 최신 기록을 가져 오기 (0) | 2019.12.21 |
[MONGODB] CSV 파일로 몽고 쿼리의 리디렉션 출력 (0) | 2019.12.21 |
[MONGODB] MongoDB의 저장 위치와 삽입의 차이점은 무엇입니까? (0) | 2019.12.21 |
[MONGODB] 유성 : 내가 어떻게 백업 내 몽고 데이터베이스 (0) | 2019.12.21 |