๋๋ฒ๊น ํ๊ธฐ๊ฐ ๋ค์ ์ด๋ ค์ด ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ๋๊ตฐ๊ฐ ๋ด ๊ตฌ์ฑ์ ๋ฌธ์ ๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
Error no primary server available
Nodejs ๋ฒ์ 4.2.1
๋ฐ mongoDB ๋ฒ์ 3.0.7
with mongoose 4.2.8
.
์ด๊ฒ์ ๋ฌด์์๋ก ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๋ง์นจ๋ด ๋ ธ๋ ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํ ๋๊น์ง ๋ง์ ์ฐ๊ฒฐ์ด ์ด๋ฆฝ๋๋ค. ์ด ์ค๋ฅ ๋์ ํด๋ฌ์คํฐ๋ ํญ์ ์ ์ ์ ๋๋ค. ์ด ์ค๋ฅ๋ ์๊ฐ๋น ์๋ฐฑ ๋ฒ ๋ฐ์ํฉ๋๋ค. ์ค๋ฅ๊ฐ ์์๋๋์๊ธฐ์ ๋ํ ์ผ๊ด์ฑ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํด๋ฌ์คํฐ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๊ณ ๊ธฐ๋ณธ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋ ๋ฐ์ํฉ๋๋ค.
์ด๊ฒ์ด db ํต๊ณ์ ๋ชจ์ต์ ๋๋ค. ๋ณด์๋ค์ํผ ์ฐ๊ฒฐ ์๊ฐ ๊พธ์คํ ์ฆ๊ฐํฉ๋๋ค. ๋ ธ๋ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ณ ์ ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์์ ๋๋ค.
๊ตฌ์ฑ
// Connect
mongoose.connect(config.mongo.connectionString, {
server: {
socketOptions: {
socketTimeoutMS: 5 * 60 * 1000,
keepAlive: 1
}
},
replset: {
socketOptions: {
socketTimeoutMS: 5 * 60 * 1000,
keepAlive: 1
}
}
});
์ฐ๊ฒฐ ๋ฌธ์์ด
mongodb://username:[email protected]:27000,mongo-2.cz.0200.mongodbdns.com:27000,mongo-3.cz.0200.mongodbdns.com:27000/dbase
์คํ ์ถ์
node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset.js:860pickServer
node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/replset.js:437command
node_modules/mongoose/node_modules/mongodb/lib/replset.js:392command
node_modules/mongoose/node_modules/mongodb/lib/db.js:281executeCommand
node_modules/mongoose/node_modules/mongodb/lib/db.js:305command
node_modules/newrelic/lib/instrumentation/mongodb.js:177wrapped
node_modules/mongoose/node_modules/mongodb/lib/collection.js:2327findAndModify
node_modules/mongoose/node_modules/mongodb/lib/collection.js:2265findAndModify
node_modules/newrelic/lib/instrumentation/mongodb.js:177wrapped [as findAndModify]
node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:136(anonymous function) [as findAndModify]
node_modules/mongoose/node_modules/mquery/lib/collection/node.js:79findAndModify
node_modules/mongoose/lib/query.js:1833_findAndModify
node_modules/mongoose/lib/query.js:1621_findOneAndUpdate
node_modules/mongoose/node_modules/kareem/index.js:156none
node_modules/mongoose/node_modules/kareem/index.js:18none
์ง๊ธ์ ์๋ฌด๊ฒ๋ ํ์ด ๋์ค์ง ์์ต๋๋ค. mongodb ์๋ฒ๊ฐ ์ถฉ๋ํ์ง ์๋ ๊ฒ์ด ํ์คํฉ๋๊น? ๋ํ ์ ธ์ ์ฌ์ฉํ์ฌ ์์ ์ ์ธ ์ฐ๊ฒฐ์ ์ ์งํ ์ ์์ต๋๊น?
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋์ db.runCommand( { replSetGetStatus : 1 } )
๋ช
๋ น์ ์คํํ๋ฉด 3 ๊ฐ ๋
ธ๋ ๋ชจ๋์์ "health" : 1,
์์ฑ๋ฉ๋๋ค. ๋
ธ๋ ์ค ํ๋์ ๊ธฐ๋ณธ ์ธํธ "stateStr" : "PRIMARY",
์์ต๋๋ค.
DNS๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐํ๊ณ ์์ต๋๊น? ๋ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ํ ์คํ ๋ฆฌ์ง๊ฐ ํํํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ปดํจํฐ ์ค ํ๋์ ํ๋ ๋๋ผ์ด๋ธ ๊ณต๊ฐ์ด ๋ถ์กฑํ์ง ๋ค์ ํ์ธํ๊ณ ํ์ธํ ์ ์์ต๋๊น?
DNS๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐํ๊ณ ์์ต๋๊น?
๋์ผํ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ์ฌ์ฉํ์ง ์์์ต๋๋ค. ํ๋ผ์ด๋น EC2 IP ์ฃผ์๋ฅผ ์ฌ์ฉํ๋ฉด์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ญ๋๊น?
์คํ ๋ฆฌ์ง์ ์ต๋ ์์ธ์ด ๋ฌด์์ธ์ง ํ์คํ์ง ์์ง๋ง ์ ์ธ์คํด์ค๋ฅผ ๋ถํ ํ ํ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ด ์ถฉ๋ถํ๋ฉด ๊ธฐ๋ณธ ์๋ฒ๊ฐ์๋ ๋ฌธ์ ๊ฐ ์ฌ์ ํ ๋ฐ์ํฉ๋๋ค.
๋ณต์ ๋ณธ ์ธํธ๊ฐ ๊ตฌ์ฑ๋ ๋ฐฉ์์ ๋ฐ๋ผ EC2 IP ์ฃผ์๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์์์ rs.status()
์
์ด๊ฒ์ ์ฐ๊ฒฐ์ด ์ฆ๊ฐํ๋ ๋์ rs.status ()์ ๋๋ค.
{
"set" : "mongo2",
"date" : ISODate("2015-12-04T23:39:32.520Z"),
"myState" : 1,
"members" : [
{
"_id" : 6,
"name" : "mongo-8.loc.0600.mongodbdns.com:27000",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 444053,
"optime" : Timestamp(1449272372, 32),
"optimeDate" : ISODate("2015-12-04T23:39:32Z"),
"lastHeartbeat" : ISODate("2015-12-04T23:39:32.507Z"),
"lastHeartbeatRecv" : ISODate("2015-12-04T23:39:31.442Z"),
"pingMs" : 0,
"syncingTo" : "mongo-9.loc.0600.mongodbdns.com:27000",
"configVersion" : 29
},
{
"_id" : 7,
"name" : "mongo-9.loc.0600.mongodbdns.com:27000",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 444056,
"optime" : Timestamp(1449272372, 39),
"optimeDate" : ISODate("2015-12-04T23:39:32Z"),
"electionTime" : Timestamp(1449097485, 1),
"electionDate" : ISODate("2015-12-02T23:04:45Z"),
"configVersion" : 29,
"self" : true
},
{
"_id" : 8,
"name" : "mongo-10.loc.0600.mongodbdns.com:27000",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 444053,
"optime" : Timestamp(1449272371, 111),
"optimeDate" : ISODate("2015-12-04T23:39:31Z"),
"lastHeartbeat" : ISODate("2015-12-04T23:39:31.904Z"),
"lastHeartbeatRecv" : ISODate("2015-12-04T23:39:30.903Z"),
"pingMs" : 2,
"syncingTo" : "mongo-8.loc.0600.mongodbdns.com:27000",
"configVersion" : 29
}
],
"ok" : 1
}
๋ณต์ ์ธํธ์์ ํน์ดํ ๊ฒ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค๋ฅธ ๊ด๋ จ ์ฝ๋ ์ํ์ด ์์ต๋๊น? ๋ชฝ๊ตฌ์ค ์ฐ๊ฒฐ ์ด๋ฒคํธ์ ๋ฐ์ํ๋ ์ฝ๋๊ฐ ์์ต๋๊น?
๊ณ ๋ คํ ๊ฐ์น๊ฐ์๋ ๋ ๋ค๋ฅธ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ ์ต์ ์ ์๋ก์ด ์ ๋ฌผ ์์ด์ ํธ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ๋๋ ์๋ก์ด ์ ๋ฌผ์์ด ์คํ์ ์๋ํ๊ณ ์ด๊ฒ์ด ์ฌ์ ํ ๋ฐ์ํ๋์ง ํ์ธํ๊ณ , ์๋ก์ด ์ ๋ฌผ์ mongodb ๋๋ผ์ด๋ฒ๋ฅผ ์์ญ์ด ํจ์นํ์ฌ ๋๋๋ก ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ ์ ์์ต๋๋ค.
๋ชฝ๊ตฌ์ค ์ฐ๊ฒฐ ์ด๋ฒคํธ๋ฅผ ์ถ๋ ฅํ์ต๋๋ค.
['connecting', 'connected', 'open', 'disconnecting', 'disconnected', 'close', 'reconnected', 'error', 'fullsetup'].forEach(function(name) {
mongoose.connection.on(name, function() {
notifySlack('Mongoose event: ' + name);
});
});
์ด๊ฒ์ ์ผ๋ถ ๋ก๊ทธ์ ๋ชจ์ต์ ๋๋ค.
โ[4:30] Mongoose event: fullsetup
โ[4:30] Mongoose event: reconnected
โ[4:30] Mongoose event: open
โ[4:30] Mongoose event: connected
โ[4:30] Mongoose event: reconnected
โ[4:30] Mongoose event: reconnected
โ[4:30] Mongoose event: reconnected
โ[4:30] Mongoose event: reconnected
โ[4:30] Mongoose event: reconnected
โ[4:30] Mongoose event: reconnected
โ[4:30] Mongoose event: fullsetup
โ[4:30] Mongoose event: connected
โ[4:30] Mongoose event: open
โ[4:30]
{
"err": {
"name": "MongoError",
"message": "no primary server available"
}
}
์ ๋ ์ด๋ฒ ์ฃผ mongodb days ์ด๋ฒคํธ์ ์ฐธ์ํ์ฌ ์ผ์ ์ ์ก๊ณ MongoDB์ ์ ์ ์์ง๋์ด ์ค ํ ๋ช ์๊ฒ์ด ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ค ์ ์์์ง๋ง ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ํ์ ํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ค์ ๋ถํํ๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ๋ณต์ ์ธํธ์ ์ต๋ ํ ํฌ๊ธฐ๋ฅผ ์ถ๊ฐํ๋๋ก ์ธ๊ธํ์ต๋๋ค.
๋ํ Keep alive๋ฅผ ๋นํ์ฑํํ๊ณ ์ธ์คํด์ค์์ ๋ ์์ ๊ฐ์ผ๋ก ์ค์ ํ๋ ค๊ณ ์๋ํ์ง๋ง ํด๊ฒฐ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
newrelic
๋ฒ์ 1.24.0
๋ฐ mongo-express-patch
๋ฒ์ 0.21.1
์์ต๋๋ค. ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋์ง ํ์ธํ๊ธฐ ์ํด newrelic์์ด ์คํ ํด ๋ณด๊ฒ ์ต๋๋ค.
ํ , ๋ชฝ๊ตฌ์ค๊ฐ ์ด๋ค ์ด์ ๋ก ๋ค์ ์ฐ๊ฒฐ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. npm list | grep "mongoose"
๋ฐ npm list | grep "mongo"
์ ์ถ๋ ฅ์ ๋ณด์ฌ์ค ์ ์์ต๋๊น?
$ npm list | grep "mongoose"
โโโฌ [email protected]
$ npm list | grep "mongo"
โโโฌ [email protected]
โ โโโฌ [email protected]
โ โ โโโฌ [email protected]
โโโฌ [email protected]
โโโฌ [email protected]
โ โโโฌ [email protected]
โ โ โโโ [email protected]
mongodb-core
๋ฅผ) ๋ฌด์์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ๋ํ prod์์ mongo-express
์ฌ์ฉํ๋๋ก ์ค์ ํ๊ณ ์์ต๋๊น?
ํ์ฌ๋ mongodb-core
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ชฝ๊ตฌ์ค ์ข
์์ฑ ๊ฐ์ ๋ฒ์ ๋ถ์ผ์น๊ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?
ํ๋ก๋์
์์ mongo-express
ํ์ฑํ๋์ด ์์ต๋๋ค.
๋ด๊ฐ ์๊ธฐ๋ก๋ ์๋์ผ. ์ด ๋ฌธ์ ์ ๊ธฐ์ฌํ ์์๋ mongodb์ ๋ํ ๋ค๋ฅธ ์ฐ๊ฒฐ์ด ์๋์ง ํ์ธํ๋ ค๊ณ ํฉ๋๋ค. ์ฝ๊ฐ์ ์ธํฐ๋ท ๊ฒ์์ ์ํํ์ต๋๋ค. rs.status()
ํ์๋๋ ๊ฒ๊ณผ ๋์ผํ DNS ์ด๋ฆ์ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ์ด์ ๋ฐ๋ผ ๋ณต์ ์ธํธ๊ฐ ์๊ฐํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ๋ํด ๋ค๋ฅธ DNS๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด ์ค๋ฅ๋ rs.status()
์ "syncingTo"์์ฑ๊ณผ ์ฐ๊ฒฐ ๋ฌธ์์ด์์ ๋์ผํ DNS๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํฉ๋๋ค. ์ฐ๊ฒฐ ๋ฌธ์์ด์์ ๋ด๋ถ ec2 IP๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฐ์ํฉ๋๋ค.
๋ด๊ฐ ์์ง ์๋ํ์ง ์์ ์ ์ผํ ๋ฐฉ๋ฒ์ connectWithNoPrimary
์ true
์ค์ ํ๋ ๊ฒ๋ฟ์
๋๋ค.
๋๋ ๋ํ mongo-express
์คํ๋ก ๋ฌ๋ฆฌ๊ธฐ๋ฅผ ์๋ ํ ๊ฒ์
๋๋ค. ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค ...
์ฐ๋ฆฌ๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ 500-700rpm +์์ ํผํฌ๋ฅผ ๊ฐ์ง ์ฝ 100RPM์ ์ง์์ ์ธ ๋ถํ๋ฅผ ๊ฒฝํํ๊ณ ์๋ ์ฌ์ดํธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋์ ์ผ๋ก ๊ฝค ์ค๋ ๊ธฐ๊ฐ ๋์์๋ ํ๋ก์ธ์ค ์ ๋ฐ์ ๊ฑธ์ณ ์ด๊ฒ์ ๋ณด๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ๊ฒฝ:
Heroku-75 2x ๋ค์ด ๋
ธ์ค-Node.JS 5.1.1
๋ฐ์ดํฐ๋ฒ ์ด์ค-MongoLabs ์ ์ฉ ํด๋ฌ์คํฐ M4-๋ฒ์ 3.0.7
์ฐ๊ฒฐ ๋ฌธ์์ด :
mongodb : // _ : * _ @ ds043294-a0.mongolab. com : 43294 , ds043294-a1.mongolab. com : 43294 / heroku_hf8q79dt? replicaSet = rs-ds043294
NPM :
npm list | grep "mongoose"
โโโฌ [email protected]
โโโ [email protected]
โโโ [email protected]
โโโฌ [email protected]
Connection.js
// Mongoose import
var mongoose = require('mongoose');
var options = {
server: {
socketOptions: {
keepAlive: 1,
poolSize: 10,
connectTimeoutMS: 30000,
socketTimeoutMS: 30000
}
},
replset: {
socketOptions: {
keepAlive: 1,
poolSize: 10,
connectTimeoutMS: 30000,
socketTimeoutMS: 30000
}
}
};
mongoose.connect((process.env.MONGOLAB_URI || "mongodb://localhost/test"), options, function(error) {
if (error) {
console.log(error);
}
});
module.exports = {
mongoose: mongoose
};
๋ฒ์ฑ ๋ฐ์ถ:
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์๋ํ๊ณ ๋๋ฒ๊น
ํ๊ธฐ ์ํด ์๋นํ ์์ ๋ชจ๋ํฐ๋ง์ ํ์ฑํ ํ์ผ๋ฏ๋ก ๋๋ฒ๊ทธ์ ๋์์ด ๋ ์ ์๋๋ก Raygun ์คํ ์ถ์ ์ ํฌํจํ์ต๋๋ค. _ ์ฐธ๊ณ : _ ์ด๊ฒ์ @ChrisZieba ๊ฐ ์์ ์ถ์ ์์ ๋ณด์ฌ์ค ๊ฒ๊ณผ ๋๊ฐ์ ์ค ๋ฒํธ์
๋๋ค.
๋ฉ์์ง : ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ณธ ์๋ฒ๊ฐ ์์ต๋๋ค.
/app/node_modules/mongodb-core/lib/topologies/replset.js:860์ Object.pickServer
/app/node_modules/mongodb-core/lib/topologies/replset.js:437์ ReplSet.ReplSet.command
/app/node_modules/mongodb/lib/replset.js:392์ ReplSet.ReplSet.command
/app/node_modules/mongodb/lib/db.js:281์ Object.executeCommand
/app/node_modules/mongodb/lib/db.js:305์ Db.Db.command
/app/node_modules/newrelic/lib/instrumentation/mongodb.js:185์ Object.wrapped
/app/node_modules/mongodb/lib/collection.js:2327์ Object.findAndModify
/app/node_modules/mongodb/lib/collection.js:2265์ Collection.Collection.findAndModify
Object.wrapped /app/node_modules/newrelic/lib/transaction/tracer/index.js:155
/app/node_modules/newrelic/lib/instrumentation/mongodb.js:218์ Object.wrappedQuery
Object.wrapped in [as findAndModify] (/app/node_modules/newrelic/lib/instrumentation/mongodb.js:188
NativeCollection.NativeCollection. (ํจ์ ๋ด ์ต๋ช
) [as findAndModify] (/app/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:136
/app/node_modules/mquery/lib/collection/node.js:79์ NodeCollection.NodeCollection.findAndModify
/app/node_modules/mongoose/lib/query.js:1833์ Query.Query._findAndModify
/app/node_modules/mongoose/lib/query.js:1621์ Query.Query._findOneAndUpdate
unknown. [anonymous] in /app/node_modules/kareem/index.js:156
unknown. [anonymous] in /app/node_modules/kareem/index.js:18
Object.wrapped /app/node_modules/newrelic/lib/transaction/tracer/index.js:155
node.js : 430์ Object.doNTCallback0
node.js : 359์ process.process._tickCallback
๋ชจ๋ํฐ๋ง :
๊ทธ ์คํ ์ถ์ ์ ์ค์ ๋ก 1) ์๋ก์ด ์ ๋ฌผ์ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ์๋ ค์ค๋๋ค (new ์ ๋ฌผ์ mongodb ๋๋ผ์ด๋ฒ์ ๋ง์ ์์ญ์ด ํจ์น๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์์ฌ ์ค๋ฝ์ต๋๋ค) 2) mongodb ๋๋ผ์ด๋ฒ๋ ๊ธฐ๋ณธ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง ์ด์ ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฐ๊ฒฐ ์ต์
์ replset: { loggerLevel: 'debug' }
๋ฅผ ์ถ๊ฐํ์ฌ mongodb ๋๋ผ์ด๋ฒ์ ๋๋ฒ๊ทธ ๋ชจ๋๋ฅผ ํ์ฑํํ์ญ์์ค. ์ฆ,
var options = {
server: {
socketOptions: {
keepAlive: 1,
poolSize: 10,
connectTimeoutMS: 30000,
socketTimeoutMS: 30000
}
},
replset: {
loggerLevel: 'debug',
socketOptions: {
keepAlive: 1,
poolSize: 10,
connectTimeoutMS: 30000,
socketTimeoutMS: 30000
}
}
};
์ด๋ ๊ฒํ๋ฉด ๋ง์ ๋๋ผ์ด๋ฒ ๋๋ฒ๊ทธ ๋ฐ์ดํฐ๊ฐ stdout์ ๊ธฐ๋ก๋๊ณ ๋ฌด์์ด ์๋ชป๋์๋์ง ํ์ ํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค. ์ด "์ฃผ ์๋ฒ๋ฅผ ์ฐพ์ ์ ์์"์ค๋ฅ๊ฐ ๋ฐ์ํ ๋์ด ๋ฐ์ดํฐ๋ฅผ ์บก์ฒ ํ ์ ์์ต๋๊น?
๊ฐ์ฌํฉ๋๋ค @ vkarpov15 ,
์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ถ๊ฐํ์ผ๋ฉฐ ๋ค๋ฅธ ํ๋๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ ์ฆ์๋ณด๊ณ ํ ๊ฒ์ ๋๋ค.
๊ฑด๋ฐฐ,
๋ก์ด
์ฌ๊ธฐ์๋ newrelic์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์์ด ์คํ์ ์๋ํ์ง๋ง์ด ๋ฌธ์ ๋ ์ง์๋ฉ๋๋ค. loggerLevel: 'debug'
์์ ์ผ๋ถ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ์ฌ๊ธฐ์ ๊ฒ์ํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ์ค๋ฅ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํ์ ํ ์ ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ํฌ์ธํธ : Mongoose๋ ์ฐ๊ฒฐ ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ "์ฌ ์ฐ๊ฒฐ"์ด๋ฒคํธ๋ฅผ ๊ณ์ํด์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
"์ฌ์ฉ ๊ฐ๋ฅํ ์ฃผ ์๋ฒ ์์"์ค๋ฅ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฐ๊ฒฐ ์๊ฐ ์ด๋ฏธ ์ฆ๊ฐํ๊ธฐ ์์ํ _after_๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
์ฐ๋ฆฌ๋์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค. MongoLab๊ณผ ํจ๊ป Heroku์์ ํธ์คํ
๋๋ Node ์ฑ์ ์ฌ์ฉํ์ญ์์ค.
์ง๋์ฃผ์ ๊ฐ์๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ด ๋์ด์ก๊ณ Error no primary server available
๋ฉ์์ง๊ฐ ๊ณ์ ํ์๋์์ต๋๋ค. ์ฑ์ ๋ค์ ์์ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
Heroku์ MonogLab ๋ชจ๋ ๋ก๊ทธ์์ ์๋ฌด๊ฒ๋ ๋ณด์ง ๋ชปํ์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ
์ ์ฐพ๊ธธ ๋ฐ๋๋๋ค.
๋ฒํ-๋๊ท๋ชจ ํ๋ก๋์
๋ฐฐํฌ์์ node v4.2.3
mongoose v4.1.5
์์์ด ํ์์ ๋ณผ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค.
@sansmischevia mongolab + heroku๋ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
^ Cloud Manager๋ฅผ ํตํด ์์ฒด ํธ์คํ mongodb ์๋ฒ๊ฐ์๋ AWS EC2์ ๋๊ท๋ชจ ํ๋ก๋์ ๋ฐฐํฌ์์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์๋ ํ์ธ์,
์ฐ๋ฆฌ๋ ๋ํ ์ฐจ์ํ๊ณ ์ถ์ต๋๋ค.
node v0.12.8
, mongo v2.6.11
์ (๋ฅผ) mongoose v4.1.11
์์ต๋๋ค.
$ npm list | grep "mongo"
โโโฌ [email protected]
โ โโโฌ [email protected]
โ โโโฌ [email protected]
โโโฌ [email protected]
โ โโโฌ [email protected]
โ โ โโโฌ [email protected]
โโโฌ [email protected]
โโโฌ [email protected]
โโโฌ [email protected]
$ npm list | grep "mongoose"
โโโฌ [email protected]
๋ง์ ์ฟผ๋ฆฌ๋ฅผ ํฌํจํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์๋ํ๋ ์์ ์ค์ ์ข ์ข ์ฌํ ๊ฐ๋ฅํฉ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ํ์๋ ์ฐ๋ฆฌ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํฅ์๋ฐ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. mongo ๋ก๊ทธ์ ์ค๋ฅ๊ฐ ์์ผ๋ฉฐ์ด ์๊ฐ ๋์ 3 ๊ฐ ๋ ธ๋ ๋ณต์ ๋ณธ ์ธํธ๊ฐ ์ ์์ ๋๋ค.
loggerLevel: 'debug'
๋ฅผ ์๋ํ๊ณ ๋ค์๋ณด๊ณ ํ๊ฒ ์ต๋๋ค.
@ vkarpov15 ์ฐ๋ฆฌ๋ mongolab replsets + ec2์ ์ง์ ์์ต๋๋ค.
mongolab ์์๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
MongoLab ๋ฐ Modulus์์๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
https://jira.mongodb.org/browse/NODE-622๋ฅผ ์ดํด๋ณด๊ณ ๋๊ตฐ๊ฐ๊ฐ ๋งค์ฐ ๋์์ด ๋ ์ ์ฒด ๋ก๊ทธ ์ธํธ๋ฅผ ์ ๊ณต ํ ์ ์๋ค๋ฉด์ด๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ชฝ๊ตฌ์ค๊ฐ ์๋๋ผ ๋ค์ดํฐ๋ธ MongoDB ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋์ผํ no primary server available
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ํ๋ผ์ด๋น VPC ๋ด๋ถ์ EC2 ์ธ์คํด์ค์์ ๋ณต์ ๋ณธ ์ธํธ๋ฅผ ์คํํ๊ณ ์์ผ๋ฉฐ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ์ธ์คํด์ค์ ํ๋ผ์ด๋น IP ์ฃผ์์
๋๋ค. MongoDB v3.0.3
. ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ๋์ด ๋ง์ ๋ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
serverOpts = {
server: {
sslValidate: false,
sslCA: ca,
socketOptions: {
connectTimeoutMS: 30000,
socketTimeoutMS: 180000
}
},
replSet: {
connectWithNoPrimary: false,
sslValidate: false,
sslCA: ca,
socketOptions: {
connectTimeoutMS: 30000,
socketTimeoutMS: 180000
}
}
};
๋ค์ ๋๋ผ์ด๋ฒ ๋ฆด๋ฆฌ์ค์์ ์ด์ ๋ํ ์์ ์ฌํญ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค : NODE-622
์ ๋ฌผํ๊ธฐ์๋ ๋๋ฌด ์ด๋ฅด์ง ์์ต๋๋ค! :)
๊ณ ์ ๋ฒ์ ์ ์ด๋ฏธ NPM https://www.npmjs.com/package/mongodb ์ ๊ฒ์๋์์ต๋๋ค
๋ ์ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์์ ํ์ธํ ์ ์์ต๋๋ค. : tada :
mongodb 2.1.2์ ๋ํ PR : https://github.com/Automattic/mongoose/pull/3712
mongoose๋ฅผ mongo core 2.1.2
๋ฅผ ์ฌ์ฉํ๋ 4.3.4
์
๊ทธ๋ ์ด๋ ํ ํ์๋์ด ์ค๋ฅ๊ฐ ๊ณ์ ํ์๋ฉ๋๋ค. https://jira.mongodb.org/browse/NODE-622 ๊ฐ ์ฌ๊ฐ๋์์ต๋๋ค
+1 ์ฐ๋ฆฌ ํ๋ก๋์ ์๋ฒ์์๋ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ๋๋ ๊ทธ ์ด์ ์ ๋ํ ์ด๋ค ํจํด๋ ๋ณด์ง ๋ชปํ๋ค. mongoose 4.3.4 ๋ฐ mongodb 3.0.8๊ณผ ํจ๊ป ๋ ธ๋ 4.2.4 ์ฌ์ฉ. mongodb์ MMS ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ๋ค์ ๋ฉ์์ง๊ฐ ํ์๋๋ ๋์ ๊ฒฝ๊ณ ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. MongoError : ์ฌ์ฉํ ์์๋ ๊ธฐ๋ณธ ์๋ฒ ์์
@ amit777 ์ฐ๊ฒฐ ๋ฌธ์์ด๊ณผ ์ต์ ์ ๊ฒ์ ํ ์ ์์ต๋๊น? ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ง์ ์ฐ๊ธฐ์ ๊ฐ์ด ๋น์ ์์ ์ผ๋ก ๋ฌด๊ฑฐ์ด ์ํฌ๋ก๋ ์ค์ ์ด๋ฐ ์ผ์ด ๋ฐ์ ํ์ต๋๊น?
Chris, ์ฐ๊ธฐ ์์ ์ค์ ํ์คํ ๋ฐ์ํ์ง๋ง ๋ถํ๊ฐ ํนํ ๋ฌด๊ฒ๋ค ๊ณ ๋งํ์ง๋ ์์ต๋๋ค. ํด๋ฌ์คํฐ์๋ ๊ฐ ๋ ธ๋๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก mongo์ ์ฐ๋ ๋ ธ๋๊ฐ ๋ ๊ฐ ์์ต๋๋ค.
์ฐ๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var mongoose = require('mongoose');
var mongodb = {};
var connect = function () {
mongodb.db = "mongodb://node1:27017,node2:27017,node3:27017/myapp";
mongodb.dbOptions = {
"db": {"native_parser": true},
"replSet": {
"rs_name": "mongocluster",
"socketOptions": { "keepAlive": 1, "connectTimeoutMS": 30000, "socketTimeoutMS": 60000 }
}
};
mongoose.connect(config.get('mongodb.db'), config.get('mongodb.dbOptions'));
};
connect();
๋ํ mongod ๋ก๊ทธ๊ฐ ์ฐ๊ฒฐ ๋ฐ ์ฐ๊ฒฐ ํด์ ๋ฉ์์ง๋ก ์ ๋ง ๋น ๋ฅด๊ฒ ์ฑ์์ง๊ณ ์์์ ์์์ต๋๋ค.
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700536] end connection 192.168.1.50:33189 (5558 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700534] end connection 192.168.1.50:33187 (5558 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700540] end connection 192.168.1.50:33193 (5557 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700538] end connection 192.168.1.50:33191 (5558 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700542] end connection 192.168.1.50:33195 (5557 connections now open)
2016-01-13T13:32:15.418-0500 I NETWORK [conn91700532] end connection 192.168.1.50:33185 (5556 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700533] end connection 192.168.1.50:33186 (5552 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700535] end connection 192.168.1.50:33188 (5552 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700537] end connection 192.168.1.50:33190 (5552 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700541] end connection 192.168.1.50:33194 (5551 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700543] end connection 192.168.1.50:33196 (5551 connections now open)
2016-01-13T13:32:15.419-0500 I NETWORK [conn91700539] end connection 192.168.1.50:33192 (5552 connections now open)
2016-01-13T13:32:15.548-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36754 #91705950 (5548 connections now open)
2016-01-13T13:32:15.549-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36755 #91705951 (5549 connections now open)
2016-01-13T13:32:15.550-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36756 #91705952 (5550 connections now open)
2016-01-13T13:32:15.550-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36757 #91705953 (5551 connections now open)
2016-01-13T13:32:15.550-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36758 #91705954 (5552 connections now open)
2016-01-13T13:32:15.551-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36760 #91705955 (5553 connections now open)
2016-01-13T13:32:15.551-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36759 #91705956 (5554 connections now open)
2016-01-13T13:32:15.551-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36762 #91705957 (5555 connections now open)
2016-01-13T13:32:15.551-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36761 #91705958 (5556 connections now open)
2016-01-13T13:32:15.553-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36763 #91705959 (5557 connections now open)
2016-01-13T13:32:15.553-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36764 #91705960 (5558 connections now open)
2016-01-13T13:32:15.554-0500 I NETWORK [initandlisten] connection accepted from 192.168.1.50:36765 #91705961 (5559 connections now open)
๋ค์์ ๋๋ฒ๊น ์ ๋์์ด ๋ ์์๋ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ ๋ณด์ ๋๋ค. ์ฐ๊ฒฐ ํ๋ง๊ณผ ๊ด๋ จ๋ ๋ฒ๊ทธ๊ฐ์์ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค. ๋ ธ๋ ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํ ํ mongod.log์ ์๋ก์ด ์ฐ๊ฒฐ์ด ํ์๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฝ 1 ๋ถ ํ mongod.log์ ์ฌ๋ฌ ์ฐ๊ฒฐ ์ข ๋ฃ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
์ฐ๊ฒฐ / ์ฐ๊ฒฐ ํด์ ๊ฐ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ ๋น ๋ฅด๊ณ ๋น ๋ฅด๊ฒ ์ฆํญ๋๋ ๊ฒ ๊ฐ์ต๋๋ค (์ฌ์ ํ ํ์ธํ๋ ค๊ณ ๋ ธ๋ ฅ ์ค์).
์ด๊ฒ์ ์ผ์ผํค๋ ์ ํ์ ์ธ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Replicaset์ ๋๋ผ์ด๋ฒ๊ฐ ํ์ธํ ์์๋ ํธ์คํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋๋ผ์ด๋ฒ๊ฐ ์ฐ๊ฒฐ๋๋ฉด ๋ณต์ ์ธํธ๋ฅผ ๋ชจ๋ ์ฐ๊ฒฐ์ ํ์ค ์์ค๋ก ์ฌ์ฉํฉ๋๋ค. ์ฌ ์ฐ๊ฒฐ์ ํด๋น ์ฃผ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด์ ์๊ฐ ํด๊ฒฐํ ์ ์์ด์ผํฉ๋๋ค.
๋ํ ์ด์ ๊ฐ์ ๋ง์ ๋ฌธ์ ์ ์์ธ์ด๋๋ IP ์ฃผ์ ์ฌ์ฉ์ ํผํด์ผํฉ๋๋ค. ์์ ํ ํธ์คํธ ์ด๋ฆ (์งง์ ์ด๋ฆ ์์)์ ์ฌ์ฉํ์ญ์์ค.
@christkv OS๊ฐ ํธ์คํธ๋ฅผ ํ์ธํ ์์๋ ๊ฒฝ์ฐ (์ : ping ์ํ)
๊ทธ๋์ผํ์ง๋ง ํญ์ ํ ๋ท ํธ์คํธ ์ด๋ฆ ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํ ์ ์์ต๋๋ค.
์, ํธ์คํธ์ ํฌํธ๋ก ํ ๋ท์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. (๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ์คํธ์๋ ์์ฉ ํ๋ก๊ทธ๋จ ์๋ฒ์ / etc / hosts ํญ๋ชฉ์ด ์์ต๋๋ค).
์ฑ์ด ์์๋๊ณ ์ฐ๊ฒฐ ํ์ด ์์ฑ ๋ ํ ๋คํธ์ํฌ ๋ฌธ์ ๊ฐ์๋ ๊ฒฝ์ฐ ์ฐ๊ฒฐ์ด ๋๊ฒผ๋ค๊ฐ ๋ค์ ์ฐ๊ฒฐ๋์ด์ผํฉ๋๊น? ์๋๋ฉด mongodb ๋ก๊ทธ์์ ๋ณผ ์์๋ ์ ์์ ์ธ ์ฐ๊ฒฐ ์๊ฐ ์ด๊ณผ ๋ฐ ๋ค์ ์ฐ๊ฒฐ์ด ์์ต๋๊น?
๋ฌธ์ ๋ ์ ์ฒด ๋ก๊ทธ ์ธํธ์์ด ๋ฌธ์ ๋ฅผ ์ดํดํ๊ณ ์ฌํํ๋ ค๊ณ ์๋ํ๊ธฐ ์ํด ์ด๋ฌํ ๊ฒ๋ค์ ์ํธ ์ฐ๊ด์ํค๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค (https://jira.mongodb.org/browse/NODE-622์ ๋ํ ๋ง์ง๋ง ๋๊ธ ์ฐธ์กฐ).
์์ผ ์๊ฐ ์ด๊ณผ ์ฐฝ์ ๋ชจ๋ ์ฐ๊ฒฐ์ ์คํํ๊ธฐ์ ์ถฉ๋ถํ ์์ ์ด์๋ ๊ฒฝ์ฐ ํ์ด ๋ซํ๊ณ ๋ค์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ 30 ์ด ์ฐฝ๊ณผ 10 ๊ฐ์ ์ฐ๊ฒฐ์ด ์์ง๋ง 5 ๊ฐ์ ์์ ๋ง์๋ ๊ฒฝ์ฐ 30 ์ด๋ง๋ค ๋ค์ ์ฐ๊ฒฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํ์ ๋ํ ๋ชจ๋ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋ฉ๋๊น? ์๋๋ฉด ์ด๋ํ์ง ์์ ์ฐ๊ฒฐ ๋ง? 30 ์ด ์ด๋ด์ ๋ชจ๋ ์ฐ๊ฒฐ์ ์คํํ๋ฉด ๋ค์ 30 ์ด ๋์ ๋์ผํ ๊ฒ์ฌ๊ฐ ์ํ๋ฉ๋๊น?
mongodb ํฐ์ผ์์ ์์ฒญํ ๋ก๊ทธ๋ฅผ ์ป์ผ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค .. ๋์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ชจ๋. socketTimeout ์ฐฝ์์ ํ์ ๋ชจ๋ ์ฐ๊ฒฐ์ ์คํํ๋ฉด node.js๋ ์์ผ์ ์๊ฐ ์ด๊ณผํ์ง ์๊ณ ํ ์ฌ ์ฐ๊ฒฐ์ ๊ฐ์ ๋ก ๋ซ์ง ์์ต๋๋ค.
ํ ๋ง์ ์ฐ๊ฒฐ์ ๋ณ๋ ฌ๋ก ์คํ๋๋ ์์ ์ด ๋ง์ ๋๋ง ์ ์ฉํฉ๋๋ค. ๋ ๋ง์ CPU ์ปจํ ์คํธ ์ ํ์ด ๋ฐ์ํฉ๋๋ค.
mongodb-core์ ๋ค์ ์ฃผ์ ๊ฐ์ ํ์ ๋๋ฆฐ ์ด์ฐจ ๋ฌธ์ ๋ฅผ ์ต์ํํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ค๋ฅธ ๊ทผ๋ณธ์ ์ธ ๋ณํ๋ฟ๋ง ์๋๋ผ ํ์ด ์ฑ์ฅํ๋๋ก ๋ณ๊ฒฝํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ช ๋ฌ ํ์ MongoDB 3.4 ์์ ๊ณผ ํจ๊ป ๋ฌถ์ผ ๊ฒ์ ๋๋ค.
์์ฒญ๋ ์์ ์ฐ๊ฒฐ ํด์ / ์ฌ ์ฐ๊ฒฐ๋ก ์ธํด ๊ฐํ์ ์ผ๋ก ์ฃผ ์๋ฒ๋ฅผ ์ฌ์ฉํ ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
์, ์ธํธ์ ์๋ฒ๊ฐ ์์ ์์๋ ์งง์ ๊ธฐ๊ฐ์ด ์์ต๋๋ค.
@christkv ๋ค๋ฅธ ํฐ์ผ์ ๋ก๊ทธ๋ฅผ ๋ณด๋ผ ๋๊น์ง ๊ธฐ๋ค๋ ธ์ต๋๋ค. ์ฐ๋ฆฌ ํด๋ฌ์คํฐ๋ ์ค์ ๋ก ์ง๋ ๋ช ์ฃผ ๋์ ์์ ์ ์ด์์ผ๋ฉฐ์ด ์ค๋ฅ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค.
@ChrisZieba ์ฌ๋ฏธ์๊ฒ ํญ์ ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋๋ ๊ฒ ๊ฐ๋ค์ ใ ใ : +1 : ์ง๊ธ์ ํฐ์ผ์ jira์ ์ด์ด๋๊ณ ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ์์๋ผ ์ ์๋์ง ๋ด ๋๋ค.
@christkv ์๋ ํ์ธ์ Christian, ํธ๋ํฝ์ด ๋ฎ์ ๊ฒฝ์ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ํฌ์ธํฐ๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ํ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ ํ ์๊ฐ์ ๋๋ฆฌ๋ ๊ฒ์ ์๊ฐํ๊ณ ์์์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋์๊ฒ ๋์์ด๋๋ค๋ฉด ์์ผ ์๊ฐ ์ด๊ณผ๋ฅผ ์ ๊ฑฐํ๊ณ keepAlive๋ฅผ 200์ผ๋ก ๋๋ฆฌ๊ณ ํ ํฌ๊ธฐ๋ฅผ 3์ผ๋ก ์ค์์ต๋๋ค. ์ฐ๊ฒฐ ํด์ / ์ฌ ์ฐ๊ฒฐ์ด ํจ์ฌ ์ ์ ๊ฒ ๊ฐ์ต๋๋ค.ํ์ง๋ง ์ฌ์ ํ ๊ฐ๋ ๋ฐ์ํฉ๋๋ค.
๋๊ตฌ์๊ฒ๋ ๋์์ด๋๋ค๋ฉด socketTimeout ๋ฐ connectionTimeout ๋ฐ keepAlive๋ฅผ ํฌํจํ ๊ฑฐ์ ๋ชจ๋ ๋ชฝ๊ตฌ์ค ์ค์ ์ ์ ๊ฑฐํ๊ณ ์ฐ๊ฒฐ์ด ์์ ๋๊ธฐ ์์ํ์ต๋๋ค. ์ฐ๋ฆฌ์ poolSize๋ 200์
๋๋ค.
๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ธ์ง ํ์คํ์ง ์์ง๋ง ์ง๊ธ์ ์๋ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ์ ์ง๋๋์ง ํ์ธํ๊ธฐ ์ํด ์ฌ์ ํ ๊ทธ๊ฒ์ ๋ชจ๋ํฐ๋งํ๊ณ ์์ต๋๋ค.
๋ชฝ๊ตฌ์ค v4.4.2
๋
ธ๋ 4
๋ชฝ๊ณ 3.0
๋๋ฆฐ ์์ ์ด ์์ฒญ๋๊ฒ ๋ง์ต๋๊น? ๊ทธ๋ ์ง ์์ผ๋ฉด 20 ์์ผ ํ๊ณผ 500 ํ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๋์น ์ฑ์ง ๋ชปํ ๊ฒ์ ๋๋ค.
์ฃ์กํฉ๋๋ค. 200์ ๋๋ค. ๋๊ธ์ ์์ ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค ๋ง์ด ๋ง์์. ์ฐ๋ฆฌ๋ ํฐ ์ฐจ์ด๋ฅผ ๋๋ผ์ง ๋ชปํ์ง๋ง ํ ํฌ๊ธฐ๊ฐ ๋ ์์ต๋๋ค.
์ฐ๊ฒฐ์ด ๊ณ์ ์ด๋ฆฌ๊ณ ๋ซํ์ง ์์ ๋์ ์ค์ ๋ฌธ์ . ์ด๊ฒ์ ๋ชฝ๊ตฌ์ค ํ์ ์์๊ณผ keepAlive ์ค์ ์ ๋ชจ๋ ์ ๊ฑฐ ํ ๋๊น์ง ๋ฐ์ํ์ต๋๋ค. ์ ์ด๊ฒ๋ค์ด mongoose / mongo-driver์ ์ํด ์ฒ๋ฆฌ๋๊ณ OS๊ฐ ๊ทธ๊ฒ์ํ์ง ๋ชปํ๊ฒํ๋์ง ๊ถ๊ธํฉ๋๋ค.
Well 2.1.7 ์ด์์๋์ด๋ฅผ ๋ฐฉ์งํ๋ ์ฌ ์ค๊ณ๋ ํ์ด ์์ต๋๋ค. socketTimeout 0์ ์ค์ ํ๋ฉด OS์ ์์ํ์ง๋ง 10 ๋ถ ์ ๋์ ์ฐ๊ฒฐ์ด ๋๊ธธ ์ ์์ต๋๋ค.
ํ์ธ. ํฅ๋ฏธ ๋กญ๊ตฐ์. ์ด์ keepAlive ๋ฐ socketTimeout ์ค์ ์ ์ ๊ฑฐ ํ์ผ๋ฏ๋ก ๊ธฐ๋ณธ ์ค์ ์ ๋ฌด์์ ๋๊น?
๋ชฝ๊ตฌ์ค๊ฐ ํน์ ์ค์ ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋์ง ํ์คํ์ง ์์ต๋๋ค. ๋๋ผ์ด๋ฒ์์ MongoClient.connect ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฐ๊ฒฐ ๋ฐ ์์ผ ์๊ฐ ์ด๊ณผ ๋ชจ๋์ ๋ํด 30 ์ด์ ๋๋ค.
์ฐ๋ฆฌ๋ connect
ํ์ง๋ง ์๋์ผ๋ก 30 ์ด๋ฅผ ์ค์ ํ๋ฉด ์ฐ๊ฒฐ์ด ์์ด๊ธฐ ์์ํฉ๋๋ค.
500 ๊ฐ์ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ค๋ฉด socketTimeout ๊ธฐ๊ฐ ๋ด์ ์ต์ 500 ๊ฐ์ ์์ ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ด ๋ซํ๊ณ ๋ค์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ด ์ฑ์ฅ / ์ถ์ ๋ชจ๋ธ์ด๊ธฐ ๋๋ฌธ์ 2.1.7์์ ๋ณ๊ฒฝ๋ฉ๋๋ค.
mongodb 3.2.6 ๋ฐ mongoose 4.3.4์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๋์์ด ์์ต๋๊น?
@ 15astro ๋ socketTimeout
๋ฐ connectionTimeout
์ ์ค์ ์ ์ ๊ฑฐํ๊ณ ๋์์ด๋๋์ง ํ์ธํ์ญ์์ค.
@refaelos Ok..willl ์๋ํด ๋ด
๋๋ค .. ๋๋ keepAlive = 6000์ผ๋ก ์๋ํ์ง๋ง ๋์์ด๋์ง ์์์ต๋๋ค. socketTimeout
๋ฐ connectionTimeout
์ ๊ฑฐ๊ฐ ์ด๋ป๊ฒ ๋์์ด๋๋์ง ์๊ณ ์ถ์ต๋๊น?
์, ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์๋ํ๊ณ ์ด๋ฌํ ์ค์ ์ ์์ ํ ์ ๊ฑฐํ์ ๋๋ง ์ ์๋ํ๊ธฐ ์์ํ์ต๋๋ค.
@refaelos :์ด ์ค์ ์ ์ ๊ฑฐํด๋ ์ด์ด ์์์ต๋๋ค. ๋ด๊ฐ ๋์น ๋ค๋ฅธ ๊ฒ์ด ์์ต๋๊น?
@ 15astro ์๋ ์ฌ๋. ์ฃ์กํฉ๋๋ค. ์ค๋๋ ์ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
mongo : {
uri : process.env.MNG_URL || 'mongodb://localhost/myDB',
options: {
user : process.env.MNG_USER,
pass : process.env.MNG_PASS,
replset: {
poolSize: 200
}
}
}
์ ๊ฒฝ์ฐ์๋ / etc / hosts์ ์ด๋ฆ ๋ฐ์ธ๋ฉ์ ๋ํ IP ๋ถ์กฑ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
IP ๋์ ์ด๋ฆ์ผ๋ก ๋ณต์ ๋ณธ ์ธํธ๋ฅผ ์ค์ ํ๊ณ MongoDB ๋ ธ๋์ / etc / hosts์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด์๋ ๊ฒฝ์ฐ :
10.10.10.10 mongodb-2gb-fra1-02
10.10.10.11 mongodb-2gb-fra1-01
10.10.10.12 mongodb-2gb-fra1-03
๊ทธ๋ฐ ๋ค์ ๋ชจ๋ ์ฑ ์๋ฒ์ / etc / hosts์ ๋ฃ์ด์ผํฉ๋๋ค.
๋๋ ๋ ธ๋-๋ชฝ๊ณ ๊ฐ ๋ด๊ฐ URI์ ๋ฃ์ ๊ฒ์ ๋ฐ๋ผ ์ฐ๊ฒฐํ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค.
node-mongo๋ Mongo URI์์ IP ๋๋ ์ด๋ฆ์ผ๋ก ์ฐ๊ฒฐ ํ ๋ค์ ์์ฒญ์ ์๋ต ํ ์ฒซ ๋ฒ์งธ MongoDB ๋
ธ๋์์ ๋ค๋ฅธ ๋ณต์ ๋ณธ ๊ตฌ์ฑ์์ ํธ์คํธ ์ด๋ฆ์ ๊ฐ์ ธ ์ค๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด mongodb-2gb-fra1-03
๋ฅผ ๊ฐ์ ธ์ ํด๊ฒฐ์ ์ํด OS์ ์ ๋ฌํฉ๋๋ค. OS๊ฐ mongodb-2gb-fra1-03
์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ "Error no primary server available"์ด ๋ฐ์ํฉ๋๋ค.
๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@adriank ์ ๋ง์ต๋๋ค. ๋ณต์ ์ธํธ ๊ตฌ์ฑ์์ ๋ค์ ๊ฐ์ ธ์จ ์ฐ๊ฒฐ์ ์ฐ๊ฒฐ์ ๋๋ค. ๊ทธ ์ด์ ๋ ์ด๊ฒ์ด ๋ณต์ ์ธํธ์ ๋ํ ์ง์ค์ ํ์ค ์์ค์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ๋ํ ๋๋ผ์ด๋ฒ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฅ์ ์กฐ์นํ๊ณ ์ธํธ์์ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ๋๋ ์๋ฒ๋ฅผ ๊ฐ์ง ํ ์ ์๋๋ก ๋ณต์ ์ธํธ ๊ตฌ์ฑ์ ๋ชจ๋ ์ฃผ์๋ฅผ ๋๋ผ์ด๋ฒ๊ฐ ํ์ธํ ์ ์์ด์ผํ๋ ์ด์ ์ด๊ธฐ๋ํฉ๋๋ค. ์ด์ ๋๋ผ์ด๋ฒ๋ SDAM ์ฌ์์ ๊ตฌํํ์ง ์์์ผ๋ฉฐ ๋ ๋์จํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ํ๋ก๋์ ํ๊ฒฝ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
@christkv ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ ๊ฐ์ ๋๊ตฌ์ ๋ํ ์
๋ชฝ MongoSpector . ์ด๋ก ์ธํด ํ๋์ ํธ์คํธ์์ ๋ ์ด์์ ๋ณต์ ๋ณธ์ ์์ ํ๊ฒ ์ฐ๊ฒฐํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. DigitalOcean์ ๊ฑฐ์ ์๋ฌด๋ ๋ณ๊ฒฝํ์ง ์๋ ๋ฌผ๋ฐฉ์ธ์ ์ด๋ฆ์ ์๋ ์์ฑํ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ ๋ง์ ํด๋ผ์ด์ธํธ๊ฐ PRIMARY๋ก mongodb-2gb-fra1-01
๋ฅผ ์ฌ์ฉํฉ๋๋ค. :) ์ฐ๋ฆฌ๊ฐ ๋ญ๊ฐ ์์๋ผ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
https://jira.mongodb.org/browse/SERVER-1889 ์์ ์๋ฒ ํฐ์ผ์ ์ถ์ ํ๊ณ
๋ํ DigitalOcean์ ๊ทธ๋ค์ด ์ ์ง๋ฅธ ์ค์์ ์ฌ์ฉ์์๊ฒ ๋ฏธ์น๋ ์ํฅ์ ์ง์ ํ๋ ํฐ์ผ์ ์ ์ถํด์ผํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ ์ด๋ฆ์ด ips ์ธ replicaset ๊ตฌ์ฑ์์ ์ ๊ฑฐํ๊ณ ๋ค์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์ฝ 12 โโ~ 24 ์๊ฐ ์ฐ๊ฒฐ ํ "์ฌ์ฉ ๊ฐ๋ฅํ ์ฃผ ์๋ฒ๊ฐ ์์ต๋๋ค"๋ผ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์ ์์ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
์ฐ๊ฒฐ:
{
"url":
"mongodb://user:password@cluser-shard-00-00, cluser-shard-00-01, cluster-shard-00-02/settings?ssl=true&replicaSet=primarycluster-shard-0&authSource=admin&retryWrites=true",
"options": {
"db": {
"w": 1,
"wtimeout": 3000,
"fsync": true
},
"authSource": "admin",
"server": {
"poolSize": 3,
"socketOptions": {
"autoReconnect": true,
"keepAlive": 60000,
"connectTimeoutMS": 7000,
"socketTimeoutMS": 15000
}
}
},
"password": "password",
"username": "username"
}