7

使用 docker 和 fig 设置 mongodb 副本集的正确方法是什么?

我试图按照官方mongodb 教程创建一个fig.yml包含一些副本集的文件,但总是被如何调用rs.initiate()rs.add("<hostname><:port>")正确地阻止。

我找到了这个 SO 答案,解释了为什么我不能在shell不调用的情况下从 开始一切rs.initiate(),那么我该如何实现呢?

哦,我使用mongo:latest(v2.6.5) 作为基础镜像,没有任何修改。

4

2 回答 2

3

我有类似的问题,这就是我所做的。我正在使用 docker-compose 而不是图。

在我的 docker-compose 中。

mongors:                                                                                                
  image: mongo                                                                                          
  ports:                                                                                                
    - "27017:27017"                                                                                     
  volumes:                                                                                              
   - ./mongo:mongo                                                                                      
  entrypoint: mongo/entrypoint.sh

在我的 entrypoint.sh 中:

#!/bin/bash
mongod --port 27018 --replSet rs0 --fork --syslog --smallfiles
mongo --port 27018 --eval "rs.initiate({_id : 'rs0', members : [{_id : 0, host : 'localhost:27018'}]})"
mongo --port 27018 --eval "while(true) {if (rs.status().ok) break;sleep(1000)};"

确保它是可执行的:

chmod +x mongo/entrypoint.sh

这有点hacky,但它有效:)

于 2015-06-29T14:05:39.247 回答
-4

先停止mongod服务,再设置副本集

 service mongodb stop

mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

 mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0 --fork

它将在端口 27017 上启动一个名为 rs0 的 mongod 实例。现在启动命令提示符并连接到这个 mongod 实例。

在 mongo 客户端发出命令rs.initiate()来启动一个新的副本集。

 rs.initiate()

要检查副本集配置,请发出命令rs.conf()

rs.conf()应具有以下内容

{
"_id" : "rs0"
"version" : 1,
"members" : [
    {
        "_id" : 0,
        "host" "localhost:27017"
    },
    {
        "_id" : 1,
        "host" "localhost:27018"
    },
    {
        "_id" : 2,
        "host" "localhost:27019"
    }
]
}

现在,您可以通过引用您提供的主机名将其他节点添加到复制集中。

 rs.add("localhost:27019")
 { "ok" : 1 }

对每个剩余的复制成员执行此操作。您的复制集现在应该已启动并正在运行。

要检查副本集的状态,请发出命令rs.status()

rs.status()

希望这可以帮助。

于 2014-12-18T08:04:51.783 回答