热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用Haproxy+OpenStack实现webapplicationautoscaling

前面写过2篇文章介绍过OpenStack,今天介绍一下配合Haproxy实现Webapplicationautoscaling。在用OpenStack实施云计算之前,要实现应用的水平扩展,通常是用这样的架构:一台Haproxy将动态请求转发到N台nginx服务器,当流量增加的时候,我们需要手工安装
前面写过2篇文章介绍过OpenStack,今天介绍一下配合Haproxy实现Web application auto scaling。

在用OpenStack实施云计算之前,要实现应用的水平扩展,通常是用这样的架构:

一台Haproxy将动态请求转发到N台nginx服务器,当流量增加的时候,我们需要手工安装物理的服务器,将它添加到集群中去,然后再手工修改haproxy的配置,让它生效。就算用自动化的安装管理工具,这样扩展一台机器也差不多要3~4小时。

用OpenStack实施云计算之后,整个架构和上图是一样的,但是我们可以通过几十行代码在5分钟内实现auto scaling,来看一下具体的步骤:

首先,我们先在OpenStack上的一台虚拟机安装好nginx以及其他应用,然后对它做一个snapshot:

记录一下这个snapshot的ID:

接下来写一个脚本,能够用这个snapshot来自动的创建实例,因为我对Ruby比较熟悉,这里用Ruby的openstack-computegem 来写(OpenStack有多种客户端可以调用API,比如python,php):

require 'rubygems'
require 'openstack/compute'
username = 'quake'
api_key = 'password'
auth_url = 'http://10.199.21.210:5000/v2.0/' #OpenStack keystone auth url
image_id = '9' #前面记录的snapshot ID
flavor_id = '1' #你想用的flavor对应的ID,这里用1,就是默认最小的1cpu, 512M内存的规格
cs = OpenStack::Compute::Connection.new(:username => username, :api_key => api_key, :auth_url => auth_url)
image = cs.get_image(image_id)
flavor = cs.get_flavor(flavor_id)
#创建一个新的instance
newserver = cs.create_server(:name => "rails#{Time.now.strftime("%Y%m%d%H%M")}", :imageRef => image.id, :flavorRef => flavor.id)
p "New Server #{newserver.name} created"
#刷新instance的状态,直到它创建成功
while newserver.progress < 100
  p "Server status #{newserver.status}, progress #{newserver.progress}"
  sleep 10
  newserver.refresh
end
p "Server status #{newserver.status}, progress #{newserver.progress}"
p "Done"

当需要扩展一台新的nginx instance时候,只需要执行上面的代码:

# ruby create_new_server.rb
"New Server rails201112161042 created"
"Server status BUILD, progress 0"
"Server status ACTIVE, progress 100"
"Done"

差不多30秒左右的时间(视你的镜像大小和网络速度),这台虚拟机就创建好了,我们可以在dashboard看到这台最新的机器:

接下去我们再写一个脚本,自动更新haproxy的配置文件:

cs = OpenStack::Compute::Connection.new(:username => username, :api_key => api_key, :auth_url => auth_url)
#预先定义一个haproxy template文件,backed server集群部分定义留空,将它拷贝过来
`cp haproxy.cfg.template haproxy.cfg`
File.open('haproxy.cfg', 'a') do |f|
  cs.servers.each do |s|
    server = cs.server(s[:id])
    #如果该实例的镜像等于我们之前做的snapshot,将它的IP加入配置文件
    if server.image['id'] == image_id
      ip = server.addresses.first.address
      p "Found matched server #{server.name} #{ip}, add to haproxy"
      f.puts "        server #{server.name} #{ip}:80 maxconn 512"
    end
  end
end
#覆盖旧的haproxy配置文件,reload haproxy
`cp haproxy.cfg /etc/haproxy.cfg`
p "Reload haproxy"
`/etc/init.d/haproxy reload`

执行该代码:

# ruby update_haproxy.rb
"Found matched server rails201112161042 10.199.18.6, add to haproxy"
"Found matched server rails201112161003 10.199.18.5, add to haproxy"
"Found matched server rails201112160953 10.199.18.4, add to haproxy"
"Found matched server rails201112160924 10.199.18.8, add to haproxy"
"Found matched server rails201112160923 10.199.18.7, add to haproxy"
"Reload haproxy"

这样就实现了将刚刚创建的 rails201112161042 实例添加到了haproxy集群。

通过不到50行的代码,就实现了auto scaling,是不是很方便?我们还能够更自动化一些,配合监控脚本,设定一个指标,比如说当整个集群的CPU用量达到70%的时候,自动调用create_server,当CPU小于10%的时候,调用delete_server,这样就实现了按需scaling up/down.


推荐阅读
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文详细介绍如何通过修改配置文件来隐藏Apache、Nginx和PHP的版本号,从而增强网站的安全性。我们将提供具体的配置步骤,并解释这些设置的重要性。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • PHP服务器搭建的重要性及方法
    本文深入探讨了为什么在开发PHP应用之前需要搭建服务器环境,以及如何选择和搭建适合的PHP服务器。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 本文旨在回顾并总结近期学习的.NET Core基础知识,通过具体的操作指南加深理解,并为初学者提供实用建议,避免常见的错误和陷阱。内容涵盖CentOS的安装配置、.NET Core环境搭建及网站部署等。 ... [详细]
  • 三菱PLC SLMP协议报文详解
    本文详细解析了三菱PLC中使用的SLMP协议报文结构,包括其工作原理、通信流程及报文格式,旨在帮助工程师和技术人员更好地理解和运用这一协议。 ... [详细]
  • 探讨在同时运行 Rails 3 和 Rails 4 的环境中,如何有效地管理和同步 Sprockets 清单文件,以支持无中断的资产加载及回滚功能。 ... [详细]
author-avatar
kkkkkkkkkkkk1982_799
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有