在 Elastic Beanstalk 中安装/设置 Mongos
Posted
技术标签:
【中文标题】在 Elastic Beanstalk 中安装/设置 Mongos【英文标题】:Mongos Install/Setup in Elastic Beanstalk 【发布时间】:2013-11-26 11:35:42 【问题描述】:展望未来的分片,我们希望能够拥有多个 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 服务器。我宁愿部署准备就绪,并安装所有软件。
【问题讨论】:
后期添加:我只是在学习,但是 MongoDb 有一个演示文稿,看起来好像它可能包含有用的信息:mongodb.com/presentations/mongodb-and-aws-integrations(例如,在幻灯片 23 附近,演示者谈到了负载平衡) 【参考方案1】:我创建了一个名为“.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
这个文件的作用是:-
创建一个“mongodb.repo”文件(参见http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/)。运行 4 个容器命令(这些命令在服务器创建之后但在 WAR 部署之前运行。它们是:-
-
启用 root 访问 - 这是 afaik 中“sudo”命令所必需的。
安装 Mongo - 使用 yum 命令将 mongo 安装为服务。我们只需要“mongos”,但这还没有从 mongo 服务器中分离出来。这可能会在未来发生变化。
将 mongod 的配置更改为“关闭” - 这意味着如果服务器重新启动,则 mongod 程序不会在服务器重新启动时运行。
创建脚本以运行 mongos。请注意第 4 步中的 $MONGO_CONFIG_IPS,您可以使用 Elastic Beanstalk 中的配置页面传递这些信息。这将在服务器重新启动时运行。
设置执行权限。这些原因我做了 4/5 而不是放入文件中:部分是它没有从环境变量创建 IP 地址。
运行在第 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 都不需要更新,这真的很酷。但是,如果您不想创建区域,您可以简单地将 IP 地址插入到 configDB
属性中(就像我的第一个示例一样)。
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 &"
【讨论】:
美丽。谢谢,鲍勃。我知道必须有办法做到这一点。我会做一些实验。我确实有一个问题 - 您正在从命令行启动 Mongos。如果服务器重新启动,它是如何重新启动的?我想知道你是否可以使用新贵? 很好看的 CargoMeister,我更新了第 4 步(并创建了另一个第 5 和第 6 步),因此它在 init.d 文件夹中创建了一个新的脚本文件(有点 hacky)。另一种方法可能是使用 rc.local。 此解决方案不起作用。它在完成后停止实例。 好的,所以第 4 步创建了 mongos.sh 脚本,该脚本是从您通过弹性搜索配置创建的 MONGO_CONFIG_IPS 创建的。值得尝试手动运行此脚本并以这种方式查看错误(它可能没有保存正确的配置 IP 地址)。 感谢@bobmarksie,非常感谢您的回答。但是,我似乎无法让这个工作。它在第 6 步失败。一开始是因为/usr/bin/下没有mongos文件可以运行。我在 yum 安装中添加了 'mongodb-org-mongos' 并解决了这个问题。不过,它在 Step6 上仍然失败。虽然现在不知道为什么。 Image of relevant log file。另外-您能否详细说明我们如何确定 MONGO_CONFIG_IPS 应该是什么值?如果它有任何调试帮助,日志文件路径也会导致问题 - 我不得不触摸 /var/log/mongo/mongos.log 以避免错误。【参考方案2】:我无法让@bobmarksie 的解决方案发挥作用,但感谢 anowak 和 avinci here 提供此 .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']
【讨论】:
我已经更新了我的解决方案以支持 MongoDB 3.0。我正在查看这个解决方案,它似乎正在安装一个实际的 MongoDB 服务器(而不是 MongoDB 路由器)。此解决方案的问题在于弹性 beanstalk 用于自动缩放,即如果您有 3 个服务器,您将在每个服务器上运行 3 个单独的(和临时的)MongoDB 服务器。我的解决方案是一个mongo
(mongo 路由器),它需要一个分片集群(通过 3 个配置服务器)。见docs.mongodb.org/manual/core/…
嘿@bobmarksie - 我相信你是对的 - 我正在寻找一个开发系统,所以只是想要解决上述问题的“最简单的可能解决方案”。以上是关于在 Elastic Beanstalk 中安装/设置 Mongos的主要内容,如果未能解决你的问题,请参考以下文章
在 Elastic Beanstalk 中安装/设置 Mongos
如何在 Elastic Beanstalk 多容器 Docker 环境中安装 composer 依赖项
如何在 Elastic Beanstalk 上安装 matplotlib
如何在 AWS elastic-beanstalk 中更改我的 python 版本