我正在为我的应用程序设计Auto Scaling系统,该系统在Amazon EC2实例上运行。应用程序从SQS读取消息并处理它们。
Auto Scaling系统将监控两件事:
例如,如果SQS中的消息数超过3000,我希望系统自动缩放,创建新的EC2实例,在其上部署代码,每当消息数低于2000时,我希望系统终止EC2实例
我正在使用Ruby和capistrano这样做。 我的问题是:
我无法找到一种方法来确定在所有EC2机器上运行的进程数,并将数字保存在变量中。你能帮帮我吗?
答案 0 :(得分:3)
您可能希望利用cron和CloudWatch API将数字手动推送到CloudWatch,作为自动扩展组策略的一部分。数字我指的是每个实例ps aux | grep your_process | wc -l
CloudWatch将允许您为所有正在运行的实例中的nr个进程的SUM聚合的手动指标设置警报,或者通过auto-scaling-group设置警报。
让你开始的东西:
手动推送RAM内存指标: http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html
还有一个: http://aws.typepad.com/aws/2011/05/amazon-cloudwatch-user-defined-metrics.html
对于内存来说,它看起来很简单,因为亚马逊已经为此提供了脚本。对于流程,您可能需要深入了解这些脚本或阅读官方API文档
如果您现在担心观看系统中的单点故障而且您有一个服务器列表,则可能最好从远程服务器并行检查它们:
rm ~/count.log
# SSH in parallel
for ROW in `cat ~/ListofIP.txt`
do
IP=`echo ${ROW} | sed 's/\./ /g' | awk '{print $1}'`
ssh -i /path/to/keyfile root@${IP} "ps -ef | grep process_name.rb | grep -v grep | wc -l" >> ~/count.log &
done
# Wait for totals
while [ ! `wc -l ~/ListofIP.txt` -eq `wc -l ~/count.log` ]
do
wait 1
done
# Sum up numbers from ~/count.log
# Push TO CloudWatch