Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不同的物理服务器上部署带有Docker的mongodb replicaset服务器_Mongodb_Docker - Fatal编程技术网

在不同的物理服务器上部署带有Docker的mongodb replicaset服务器

在不同的物理服务器上部署带有Docker的mongodb replicaset服务器,mongodb,docker,Mongodb,Docker,我正在尝试使用docker部署mongodb复制集。 我通过执行以下命令,在同一台服务器上实现了这一点: docker run -d --expose 27017 --name mongodbmycompany1 dockerfile/mongodb mongod --replSet rsmycompa docker run -d --expose 27017 --name mongodbmycompany2 dockerfile/mongodb mongod --replSet rsacom

我正在尝试使用docker部署mongodb复制集。 我通过执行以下命令,在同一台服务器上实现了这一点:

docker run -d --expose 27017 --name mongodbmycompany1 dockerfile/mongodb mongod --replSet rsmycompa
docker run -d --expose  27017 --name mongodbmycompany2 dockerfile/mongodb mongod --replSet rsacommeassure
docker run -d --expose 27017 --name mongodbmycompany3 dockerfile/mongodb mongod --replSet rsacommeassure

MONGODB1=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany1)
MONGODB2=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany2)
MONGODB3=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mongodbmycompany3)

echo $MONGODB1
echo $MONGODB2
echo $MONGODB3

echo "Mongodb Replicaset init"
docker exec mongodbmycompany1 mongo 127.0.0.1:27017/mycompany --eval 'if(!rs.conf()) {     rs.initiate(); cfg = rs.conf(); cfg.members[0].host = "'$MONGODB1':27017"; rs.reconfig(cfg); rs.add("'$MONGODB2':27017"); rs.add("'$MONGODB3':27017"); } rs.status();'
它按预期工作。我的replicaset已初始化,我的mongodb resultset配置包含由其内部IP地址标识的3台服务器。 它并不完美,因为我更喜欢使用服务器名称,但我没有做到这一点。 Docker仅在每个/etc/hosts文件中填充在映像启动时通过--link参数传递的服务器名称。如果在其他服务器运行时添加新服务器。这些服务器不会ping新服务器

现在我还有一个问题。在生产中,在同一台物理服务器上运行大量Mongodb docker映像是可能的,但并不安全: -如果我的物理服务器出现故障,我将丢失所有Mongodb副本,并且我的服务也将停机 -如果我的物理服务器使用内部存储,则我的所有docker映像都使用相同的磁盘。。。我会有IO问题

所以我的问题是:如何在多个物理服务器上部署多个mongodb副本?当这些mongodb复制副本位于不同的服务器甚至不同的数据中心上时,它们如何相互通信(主服务器和辅助服务器可以更改)?

您可以使用“”轻松解决问题

Weave创建了一个覆盖网络,将不同主机上的容器连接起来,甚至在不同的云提供商上。Weave还提供DNS服务,允许您在Weave网络中按名称查找容器。

假设:

  • 您有3个不同的docker主机(服务器),分别是IPs
    10.1.1.101
    10.1.1.102
    10.1.1.103
  • 要部署一个名为
    rsacomeasure
  • Dockerfile
    s用于mongodb公开端口27017
  • 所有服务器都位于受信任的区域中,并且可以相互通信
  • 首先,让我们在每台服务器上启动mongodb容器(
    10.1.1.101~$
    用于命令提示符):

    -p 27017:27017
    公开主机IP上的端口27017,因此可以在服务器的主机IP地址上访问mongo

    然后您需要启动副本集,所以只需对mongodb容器运行它(我将在这里选择server1):


    IPs是本地的,但只要服务器可以相互通信(VPN、防火墙、DMZ等),它就可以与全局服务器协同工作。顺便说一下,你应该仔细考虑一下。 我使用docker machine和virtual box作为驱动程序在不同的物理服务器上创建了一个副本集:

    $ docker-machine create --driver virtualbox server1
    $ docker-machine create --driver virtualbox server2
    $ docker-machine create --driver virtualbox server3
    
    在每个端子上打开3个不同的端子

    $(Terminal1) eval "$(docker-machine env server1)"
    $(Terminal2) eval "$(docker-machine env server2)"
    $(Terminal3) eval "$(docker-machine env server3)"
    
    在每个终端:

    $(Terminal1) docker run -d -p 27017:27017 --name mongoClient1 mongo mongod --replSet r1
    $(Terminal2) docker run -d -p 27017:27017 --name mongoClient2 mongo mongod --replSet r1
    $(Terminal3) docker run -d -p 27017:27017 --name mongoClient3 mongo mongod --replSet r1
    
    进入VirtualBox->每个环境(服务器1、服务器2、服务器3)->设置->网络->适配器1->端口转发。创建新的规则协议TCP,主机端口-27017,来宾端口-27017,将主机Ip和来宾Ip保留为空

    现在重新启动所有环境,您可以从VirtualBox或终端执行此操作,从终端只需运行:

    $(Terminal1) docker-machine restart server1
    $(Terminal2) docker-machine restart server2
    $(Terminal3) docker-machine restart server3
    
    重新启动容器:

    $(Terminal1) docker start mongoClient1
    $(Terminal2) docker start mongoClient2
    $(Terminal3) docker start mongoClient3
    
    现在容器应该正在运行,您可以通过运行 每个终端中的$docker ps

    进入第一个容器(或另一个)的Mongo外壳

    $(Terminal1) docker exec -it mongoClient1 mongo
    // now we are in the Mongo Shell
    $(Mongo Shell) rs.initiate()
    $(Mongo Shell) cfg = rs.conf()
    $(Mongo Shell) cfg.members[0].host = <server1's Ip Address>
    // you should get server1's Ip Address by running $ docker-machine ls, mine was 192.168.99.100
    $(Mongo Shell) rs.reconfig(cfg)
    $(Mongo Shell Primary) rs.add("<server2's Ip Address>:27017")
    // now we added a Secondary
    $(Mongo Shell Primary) rs.add("<server3's Ip Address>:27017", true)
    // now we added an Arbiter
    $(Mongo Shell Primary) use planes
    // now we create a new database
    $(Mongo Shell Primary) db.tranporters.insert({name:'Boeing'})
    // create a new collection
    $(Mongo Shell Primary) db.tranporters.find()
    // we obtain the inserted plane
    

    我编写了一个docker映像脚本,为任意数量的容器设置mongodb复制集,并在添加更多容器时自动缩放。查看github或

    使用Docker Compose

    设置docker-compose.yml

    version: "2"
    services:
      <your_service_name>:
         image: rollymaduk/mongo-replica:local
         environment:
           REPLICA_NAME: "<your_replica_name>"
         volumes:
         -  /var/config:/var/config
    
    扩展到更多容器

    docker-compose scale <your_service_name>=3
    
    docker合成比例=3
    
    Docker云
    要使用docker cloud部署mongo db replicaSet,请设置堆栈 文件

    stack.yml:不需要共享卷的堆栈文件

    :
    图片:rollymaduk/mongo副本:云
    部署策略:高可用性
    目标容器数量:3个
    环境:
    副本名称:
    DockerLoud_认证:
    
    stack.yml:需要共享卷的堆栈文件

    :
    图像:rollymaduk/mongo副本:本地
    部署策略:高可用性
    目标容器数量:3个
    卷数:
    -/var/config:/var/config
    环境:
    副本名称:
    
    使用docker cloud cli在命令行中运行(如果云中不存在堆栈文件)

    docker云堆栈创建--name-f
    docker云堆栈启动
    
    使用docker cloud cli在命令行中运行(如果云中已存在堆栈文件)

    docker云堆栈更新-f
    docker云堆栈重新部署
    
    重要提示:必须指定共享卷并将其装载到容器的 配置目录[默认值:/var/config]下面的示例装载主机 目录/var/config到容器的配置卷。
    您可以使用docker推荐的任何方式在服务器之间共享卷 容器(即装载主机目录或数据卷容器),仅 为配置卷(/var/config)指定正确的路径

    _要更改默认配置目录,请使用环境变量 --配置目录以设置容器。确保更新主机卷 反映新--CONFIG_DIR名称的路径_


    你这样做到底有什么问题?使用OpenStack在几个物理节点上调度Docker容器怎么样?我将看看OpenStack来解决这个问题。您是否有一份文档,其中OpenStack帮助管理mongodb docker文件,以便在多台服务器上分发复制集?没有,我只是使用OpenStack来安装docker,目的不同于创建mongodb复制集。您需要一个虚拟LAN,作为docker容器的单个可发现网桥。看看coreos/法兰绒。这将以最少的努力解决您的网络问题。请不要只发布链接答案。只要把链接的关键部分放在你的回答中就行了。非常感谢@Milanth,这非常有用。我想问一下,您是否认为将两个docker容器与真实的mongo实例连接也是可行的。我真的需要同步一个450G
    $(Terminal2) docker exec -it mongoClient2 mongo planes
    // or
    $(Mongo Shell Primary) db = connect ("<server2's Ip Address>:27017/planes")
    
    $(Mongo Shell Secondary) rs.slaveOk()
    // to allow readings from the Shell
    $(Mongo Shell Secondary)db.tranporters.find()
    // should return inserted plane
    
    #Here stop already running instances
    docker stop m1 m2 m3
    #Cleanup of the volumes
    docker rm -f m1 m2 m3
    
    # Start MongoDB services optimised for faster startup
    docker run  -dP --name m1 mongo mongod --replSet "r1" --noprealloc --smallfiles --nojournal --syncdelay 0 
    docker run  -dP --name m2 mongo mongod --replSet "r1" --noprealloc --smallfiles --nojournal --syncdelay 0 
    docker run  -dP --name m3 mongo mongod --replSet "r1" --noprealloc --smallfiles --nojournal --syncdelay 0
    
    export M1_ADDRESS=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' m1`
    export M2_ADDRESS=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' m2`
    export M3_ADDRESS=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' m3`
    
    docker exec m1 mongo --eval "rs.initiate();"
    docker exec m1 mongo --eval "cfg = rs.conf(); cfg.members[0].host = '$M1_ADDRESS:27017'; rs.reconfig(cfg);"
    docker exec m1 mongo --eval "rs.add('$M2_ADDRESS:27017');rs.add('$M3_ADDRESS:27017')"
    
    # Check if everything is fine.
    docker exec m1 mongo --eval "rs.status();"
    
    version: "2"
    services:
      <your_service_name>:
         image: rollymaduk/mongo-replica:local
         environment:
           REPLICA_NAME: "<your_replica_name>"
         volumes:
         -  /var/config:/var/config
    
    docker-compose up
    
    docker-compose scale <your_service_name>=3
    
    <service_name>:
      image: rollymaduk/mongo-replica:cloud
      deployment_strategy: high_availability
      target_num_containers: 3
      environment:
        REPLICA_NAME: <your_replica_name>
        DOCKERCLOUD_AUTH: <your_docker_auth_key>
    
    <service_name>:
      image: rollymaduk/mongo-replica:local
      deployment_strategy: high_availability
      target_num_containers: 3
      volumes:
        - /var/config:/var/config
      environment:
        REPLICA_NAME: <your_replica_name>
    
    docker-cloud stack create --name <your_stack_name> -f <your_stack_file>
    
    docker-cloud stack start <your_stack_name>
    
    docker-cloud stack update -f <your_stack_file> <your_stack_name>
    
    docker-cloud stack redeploy <your_stack_name>