我们最近需要将旧版meteorJS 应用程序复制到新服务器和新数据库上。 因此,我们克隆了服务器,创建了一个新数据库,并将克隆的服务器指向新数据库。
meteorJS 应用程序运行正常,一切看起来都很好。
但是我们注意到每次重新启动时,日志都会显示类似 MongoError: no Primary server available 的错误:
2024-02-01T06:37:06.151478+00:00 heroku[web.1]: Restarting
2024-02-01T06:37:06.217824+00:00 heroku[web.1]: State changed from up to starting
2024-02-01T06:37:06.969254+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2024-02-01T06:37:07.074219+00:00 heroku[web.1]: Process exited with status 143
2024-02-01T06:37:45.658856+00:00 heroku[web.1]: Starting process with command `.meteor/heroku_build/bin/node $NODEJS_PARAMS .meteor/heroku_build/app/main.js`
2024-02-01T06:38:00.149936+00:00 app[web.1]: Got exception while polling query MongoError: no primary server available
2024-02-01T06:38:00.149991+00:00 app[web.1]: at ReplSetState.pickServer (/app/.meteor/heroku_build/app/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/topologies/replset_state.js:780:12)
2024-02-01T06:38:00.149991+00:00 app[web.1]: at Timeout._selectServer [as _onTimeout] (/app/.meteor/heroku_build/app/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/core/topologies/replset.js:1142:43)
2024-02-01T06:38:00.149992+00:00 app[web.1]: at listOnTimeout (internal/timers.js:549:17)
2024-02-01T06:38:00.149992+00:00 app[web.1]: at processTimers (internal/timers.js:492:7)
2024-02-01T06:38:00.149993+00:00 app[web.1]: => awaited here:
2024-02-01T06:38:00.149993+00:00 app[web.1]: at Function.Promise.await (/app/.meteor/heroku_build/app/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/promise_server.js:56:12)
2024-02-01T06:38:00.149994+00:00 app[web.1]: at packages/mongo/mongo_driver.js:1073:14
2024-02-01T06:38:00.149994+00:00 app[web.1]: at /app/.meteor/heroku_build/app/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/fiber_pool.js:43:40
2024-02-01T06:38:00.149994+00:00 app[web.1]: => awaited here:
2024-02-01T06:38:00.149995+00:00 app[web.1]: at Promise.await (/app/.meteor/heroku_build/app/programs/server/npm/node_modules/meteor/promise/node_modules/meteor-promise/promise_server.js:60:12)
2024-02-01T06:38:00.149995+00:00 app[web.1]: at SynchronousCursor._nextObject (packages/mongo/mongo_driver.js:1122:38)
2024-02-01T06:38:00.149995+00:00 app[web.1]: at SynchronousCursor.forEach (packages/mongo/mongo_driver.js:1136:22)
2024-02-01T06:38:00.149995+00:00 app[web.1]: at Cursor.<computed> [as forEach] (packages/mongo/mongo_driver.js:918:44)
2024-02-01T06:38:00.149996+00:00 app[web.1]: at OplogObserveDriver._runQuery (packages/mongo/oplog_observe_driver.js:729:16)
2024-02-01T06:38:00.149996+00:00 app[web.1]: at OplogObserveDriver._runInitialQuery (packages/mongo/oplog_observe_driver.js:658:10)
2024-02-01T06:38:00.149996+00:00 app[web.1]: at packages/mongo/oplog_observe_driver.js:191:10
2024-02-01T06:38:00.149996+00:00 app[web.1]: at packages/mongo/oplog_observe_driver.js:15:9
2024-02-01T06:38:00.149997+00:00 app[web.1]: at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1234:12)
2024-02-01T06:38:00.149997+00:00 app[web.1]: at packages/meteor.js:550:25
2024-02-01T06:38:00.149997+00:00 app[web.1]: at runWithEnvironment (packages/meteor.js:1286:24) {
2024-02-01T06:38:00.149997+00:00 app[web.1]: name: 'MongoError',
2024-02-01T06:38:00.149997+00:00 app[web.1]: [Symbol(mongoErrorContextSymbol)]: {}
2024-02-01T06:38:00.149998+00:00 app[web.1]: }
因此看来 oplog 可能无法在新服务器上运行。由于服务器共享完全相同的代码库,我们认为它一定与新数据库相关。但我们无法确定出了什么问题,因为我们不是在旧版原始服务器中配置 oplog 的人。
新旧服务器均配置了以下环境变量:
OLD SERVER
MONGO_OPLOG_URL
mongodb+srv://user:[email protected]/local
MONGO_URL
mongodb+srv://user:[email protected]/database_name
NEW SERVER
MONGO_OPLOG_URL
mongodb+srv://user:[email protected]/local
MONGO_URL
mongodb+srv://user:[email protected]/databse_name
还检查了网络IP地址限制,没有限制,所以可以排除新数据库有IP限制的可能性。
那么新数据库中可能存在什么问题导致此 MongoError: no Primary server available 在 oplog 操作中?
任何版本都没有太大变化,因为我们尽量不破坏旧版应用程序:
OLD APP
MongoDB 4.4.28
Meteor 1.10.2
[email protected]
NEW APP
MongoDB 5.0.24
Meteor 1.10.2
[email protected]
Meteor 1.10.2 不支持 MongoDB 5。您需要将 MongoDB 服务器降级到版本 4 或将 Meteor 升级到 2.6。您可以在 https://guide.meteor.com/2.6-migration.html 上查看解释 MongoDB 升级的迁移指南。