9

展望未来的分片,我们希望能够拥有多个 mongos 实例。建议似乎是将 mongos 放在每个应用程序服务器上。我在想我只是在他们自己的服务器上进行负载平衡,但是这篇文章http://craiggwilson.com/2013/10/21/load-balanced-mongos/表明这有问题。

所以我又回到了应用服务器上。但是,我们使用的是 Elastic Beanstalk。我可以在此安装 Mongo 作为包安装。但是,这给 Mongos 带来了问题。我无法找到如何使用 mongodb.conf 文件启动 mongos。对于复制服务器或配置服务器,conf 文件中的其他条目可能会导致它以我想要的方式启动。但我不能用 Mongos 做到这一点。如果我安装 Mongo,它实际上是作为 mongodb 启动的。我需要终止这种行为,并让它以 Mongos 的身份启动,指向我的配置服务器。

我能想到的只有:

杀死 mongodb 启动脚本,它以“正常”模式自动启动数据库。创建一个新的启动 mongos 的新脚本,指向配置服务器。

对此有什么想法吗?或者有谁知道我是否只是迟钝,我可以将一个新的 mongodb.conf 文件复制到 beanstalk 上,它将作为 mongos 启动服务器?

我们不打算马上做这件事,但我们需要做一些准备,好像我没有准备好这些部件,我需要在事后完全重建我的 beanstalk 服务器。我宁愿部署准备就绪,安装所有软件。

4

2 回答 2

29

我创建了一个名为“.ebextensions”的文件夹和一个名为“aws.config”的文件。该文件的内容如下: -

files: 
  "/etc/yum.repos.d/mongodb.repo":
    mode: "000644"
    content: |
      [MongoDB]
      name=MongoDB Repository
      baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
      gpgcheck=0
      enabled=1
container_commands:
  01_enable_rootaccess:
    command: echo Defaults:root \!requiretty >> /etc/sudoers
  02_install_mongo:
    command: yum install -y mongo-10gen-server
    ignoreErrors: true
  03_turn_mongod_off:
    command: sudo chkconfig mongod off
  04_create_mongos_startup_script:
    command: sudo sh -c "echo '/usr/bin/mongos -configdb $MONGO_CONFIG_IPS -fork -logpath /var/log/mongo/mongos.log --logappend' > /etc/init.d/mongos.sh"
  05_update_mongos_startup_permissions:
    command: sudo chmod +x /etc/init.d/mongos.sh
  06_start_mongos:
    command: sudo bash /etc/init.d/mongos.sh

该文件的作用是:-

运行 4 个容器命令(这些命令在创建服务器之后但在部署 WAR 之前运行。它们是:-

  1. 启用 root 访问 - 这是 afaik 的“sudo”命令所必需的。
  2. 安装 Mongo - 使用 yum 命令将 mongo 安装为服务。我们只需要“mongos”,但这还没有从 mongo 服务器中分离出来。这在未来可能会改变。
  3. 将 mongod 的配置更改为“关闭” - 这意味着如果服务器重新启动,则 mongod 程序不会在服务器重新启动时运行。
  4. 创建脚本来运行 mongos。请注意第 4 步中的 $MONGO_CONFIG_IPS,您可以使用 Elastic Beanstalk 中的配置页面传递这些信息。这将在服务器重新启动时运行。
  5. 设置执行权限。这些原因我做了 4/5 而不是放入文件中:部分是它没有从环境变量创建 IP 地址。
  6. 运行在步骤 4 中创建的脚本。

这对我有用。我的 WAR 文件只是连接到 localhost,所有流量都通过路由器。我偶然发现了几天,因为 Amazon AWS 和 MongoDB 中的文档都相当少。

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html


更新: - 如果您对我的旧答案有疑问,请尝试以下方法 - 它适用于 Mongo 的第 3 版,目前正在我们的生产 MongoDB 集群中使用。

此版本更先进,因为它使用内部 DNS(通过 AWS Route53) -请注意mongo-cfg1.internal .... 这是推荐的最佳实践,非常值得使用 Route53 设置您的私有区域。这意味着如果其中一个 MongoDB Config 实例出现问题,您可以替换损坏的实例并更新 Route53 中的私有 IP 地址 - 每个弹性 beanstalk 都不需要更新,这真的很酷。但是,如果您不想创建区域,您可以简单地在configDB属性中插入 IP 地址(如我的第一个示例)。

files: 
  "/etc/yum.repos.d/mongodb.repo":
    mode: "000644"
    content: |
      [mongodb-org-3.0]
      name=MongoDB Repository
      baseurl=http://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.0/x86_64/
      gpgcheck=0
      enabled=1
  "/opt/mongos.conf":
    mode: "000755"
    content: |
      net:
        port: 27017
      operationProfiling: {}
      processManagement:
        fork: "true"
      sharding:
        configDB: mongo-cfg1.internal.company.com:27019,mongo-cfg2.internal.company.com:27019,mongo-cfg3.internal.company.com:27019
      systemLog:
        destination: file
        path: /var/log/mongos.log
container_commands:
  01_install_mongo:
    command: yum install -y mongodb-org-mongos-3.0.2
    ignoreErrors: true
  02_start_mongos:
    command: "/usr/bin/mongos -f /opt/mongos.conf > /dev/null 2>&1 &"
于 2013-11-14T16:32:04.803 回答
6

我无法让@bobmarksie 的解决方案正常工作,但感谢 anowak 和 avinci提供.ebextensions/aws.config文件:

files:
  "/home/ec2-user/install_mongo.sh" :
    mode: "0007555"
    owner: root
    group: root
    content: |
      #!/bin/bash
      echo "[MongoDB]
      name=MongoDB Repository
      baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
      gpgcheck=0
      enabled=1" | tee -a /etc/yum.repos.d/mongodb.repo
      yum -y update
      yum -y install mongodb-org-server mongodb-org-shell mongodb-org-tools

commands:
  01install_mongo:
    command: ./install_mongo.sh
    cwd: /home/ec2-user
    test: '[ ! -f /usr/bin/mongo ] && echo "MongoDB not installed"'

services:
  sysvinit:
    mongod:
      enabled: true
      ensureRunning: true
      commands: ['01install_mongo']
于 2015-10-31T06:59:54.763 回答