Mongoose経由でMongoDBreplicaSetに接続しようとしました。私はこれを使用しました リンク 。
構成json:
"mongoose": {
"uri": "mongodb://localhost:27022/chat,localhost:27021,localhost:27020",
"options": {
"replset": { "rs_name": "rs0" },
"server": {
"poolSize": 3,
"socketOptions": {
"keepAlive": 1
}
}
}
}
マングース接続:
var mongoose = require('mongoose');
mongoose.connect(config.get('mongoose:uri'), config.get('mongoose:options'));
そして、アプリケーションを起動した後、私は例外を受け取りました:
Error: Host must be specified [undefined]
at new exports.ConnectionPool (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\mongodb\lib\mongodb\connection\connection_pool.js:18:11)
at Server.connect (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\mongodb\lib\mongodb\connection\server.js:335:25)
at Db.open (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\mongodb\lib\mongodb\db.js:264:23)
at MongoStore._open_database (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect-mongo\lib\connect-mongo.js:174:15)
at MongoStore._get_collection (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect-mongo\lib\connect-mongo.js:169:14)
at MongoStore.get (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect-mongo\lib\connect-mongo.js:213:10)
at Object.session [as handle] (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect\node_modules\express-session\index.js:215:11)
at next (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect\lib\proto.js:194:15)
at Object.module.exports [as handle] (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\middleware\resExtensions.js:21:2)
at next (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect\lib\proto.js:194:15)
Db:チャット、プライマリサーバー:localhost:27022。
また、他の2つのサーバーを削除しようとしました(config jsonにプライマリサーバーのみを保持します)。セカンダリサーバーについて認識していることがわかりました(ログを使用しました)。それはmongodbメタデータに関するものだと思います。しかし、プライマリをシャットダウンすると、作業が終了しました(不思議ではありません)。代わりにセカンダリを使用できるようにするために必要です。
何か案は?
これを使用します:
if(config.db.indexOf('replicaSet') > - 1) {
dbOptions = {
db: {native_parser: true},
replset: {
auto_reconnect:false,
poolSize: 10,
socketOptions: {
keepAlive: 1000,
connectTimeoutMS: 30000
}
},
server: {
poolSize: 5,
socketOptions: {
keepAlive: 1000,
connectTimeoutMS: 30000
}
}
};
}
var db = mongoose.connect(config.db, dbOptions);
どこ
config.db = 'mongodb://USER:PW@Host1:port1,Host2:port2/DBNAME?replicaSet=RSNAME'
Auto_reconnectは https://team.goodeggs.com/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup-83ca8496ca02 に従ってオフになっています
接続文字列が無効である可能性があります。すべてのレプリカセットメンバーにURIを指定する必要があります。
"uri": "mongodb://db0.example.com:27017,db1.example.com:27017,db2.example.com:27017/admin?replicaSet=myRepl"
Mongooseドキュメントの レプリカセット接続 セクションを確認する必要があります。
私もこれに苦労しました。私がその経験から学んだことは次のとおりです。
「サーバー」ブロックは、接続URIにクラスター化されていない単一の接続(別名、単一の接続文字列)が含まれている場合にのみ呼び出されます。
「replset」ブロックは、接続URLにコンマ区切りの接続文字列(別名レプリケーションセット)のリストが含まれている場合にのみ呼び出されます。
var options = {
db: {
native_parser: true
},
// This block gets run for a non replica set connection string (eg. localhost with a single DB)
server: {
poolSize: 5,
reconnectTries: Number.MAX_VALUE,
ssl: false,
sslValidate: false,
socketOptions: {
keepAlive: 1000,
connectTimeoutMS: 30000
}
},
// This block gets run when the connection string indicates a replica set (comma seperated connections)
replset: {
auto_reconnect: false,
poolSize: 10,
connectWithNoPrimary: true,
ssl: true,
sslValidate: false,
socketOptions: {
keepAlive: 1000,
connectTimeoutMS: 30000
}
}
};
このブロックは、ローカルホストと本番環境の両方で機能しました。それが役に立てば幸い。
# mongoose connect secondary replicateSet
<pre>
let url = 'mongodb://mongo01:1001,mongo02:1002/db_name?replicaSet=xxx-replica'
// 1
let conn = mongoose.createConnection(url, {user:'xxx', pass:'xxx', autoIndex: false, replset: {readPreference: 'secondary'}});
// 2
let conn = mongoose.createConnection(url, {user:'xxx', pass:'xxx', autoIndex: false});
let schema = new mongoose.Schema({},{read:'secondary'});
let model = conn.model(modelName, schema);
//3
let conn = mongoose.createConnection(url, {user:'xxx', pass:'xxx', autoIndex: false};
let schema = new mongoose.Schema({});
let model = conn.model(modelName, schema);
model.find().read('secondary').then(info => {});
</pre>