簡體   English   中英

MongoDB副本集,從mongoose連接時出錯node.js

[英]MongoDB replica set, error when connecting from mongoose node.js

我在 Windows 中的 docker 容器內運行 mongodb replicaSet。這是 docker 組合文件

version: '3'

services:

  rs0:
    image: mongo:4.4
    ports:
      - "27018:27017"
    command: mongod --replSet rsnmbp
    volumes:
      - rs0_data:/data/db
      - ./nmbprsdata0:/nmbpdata

  rs1:
    image: mongo:4.4
    ports:
      - "27019:27017"
    command: mongod --replSet rsnmbp
    volumes:
      - rs1_data:/data/db
      - ./nmbprsdata1:/nmbpdata

  rs2:
    image: mongo:4.4
    ports:
      - "27020:27017"
    command: mongod --replSet rsnmbp
    volumes:
      - rs2_data:/data/db
      - ./nmbprsdata2:/nmbpdata
      
  rs3:
    image: mongo:4.4
    ports:
      - "27021:27017"
    command: mongod --replSet rsnmbp
    volumes:
      - rs3_data:/data/db
      - ./nmbprsdata3:/nmbpdata
      
  rs4:
    image: mongo:4.4
    ports:
      - "27022:27017"
    command: mongod --replSet rsnmbp
    volumes:
      - rs4_data:/data/db
      - ./nmbprsdata4:/nmbpdata
      
   

volumes:
  rs0_data:
  rs1_data:
  rs2_data:
  rs3_data:
  rs4_data:

副本集通過配置

rsconf = { 
  _id: "rsnmbp", 
  members: [ 
    { 
      _id: 0, 
      host: "rs0:27017" 
    }, 
    { 
      _id: 1, 
      host: "rs1:27017" 
    }, 
    { 
      _id: 2, 
      host: "rs2:27017" 
    },
    { 
      _id: 3, 
      host: "rs3:27017" 
    },
    { 
      _id: 4, 
      host: "rs4:27017" 
    },
  ] 
} 
rs.initiate(rsconf)

我正在嘗試通過 node.js 中的 mongoose 連接到副本集

const DB_URI = 'mongodb://localhost:27018,localhost:27019,localhost:27020,localhost:27021,localhost:27022/test'
mongoose.connect(DB_URI)
    .then((result) =>console.log ("connected to database"))
    .catch((err) =>console.log (err))

但我收到以下錯誤

MongooseServerSelectionError: getaddrinfo ENOTFOUND rs0
 ...
  reason: TopologyDescription {
    type: 'ReplicaSetNoPrimary',
    servers: Map(5) {
      'rs0:27017' => [ServerDescription],
      'rs1:27017' => [ServerDescription],
      'rs2:27017' => [ServerDescription],
      'rs3:27017' => [ServerDescription],
      'rs4:27017' => [ServerDescription]
    },
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: 'rsnmbp',
    maxSetVersion: 1,
    maxElectionId: new ObjectId("7fffffff0000000000000003"),
    commonWireVersion: 9,
    logicalSessionTimeoutMinutes: undefined
  }
}

我在 Windows 上的 etc/hosts 添加了以下幾行

127.0.0.1 rs0
127.0.0.1 rs1
127.0.0.1 rs2
127.0.0.1 rs3    
127.0.0.1 rs4

並將 const DB_URI 更改為

const DB_URI = 'mongodb://rs0:27018,rs1:27019,rs2:27020,rs3:27021,rs4:27022/test'

但現在我收到以下錯誤

MongooseServerSelectionError: Server selection timed out after 30000 ms
...
  reason: TopologyDescription {
    type: 'ReplicaSetNoPrimary',
    servers: Map(0) {},
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: 'rsnmbp',
    maxSetVersion: 1,
    maxElectionId: new ObjectId("7fffffff0000000000000003"),
    commonWireVersion: 9,
    logicalSessionTimeoutMinutes: undefined
  }
}

我怎樣才能用 node.js 中的 mongoose 連接到這個 replicaSet 在此先感謝。

您必須使用一個副本集,一個副本集可以有多個成員。 並確保您已經在 etc/hosts 文件中的主機中添加了副本集節點。 就像下面的例子 -

127.0.0.1   mongoset1 mongoset2 mongoset3

注意 - 127.0.0.1 是您的主機,mongoset1、mongoset2 和 mongoset3 是副本集的節點(成員)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM