`
my_corner
  • 浏览: 84410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用Apache实现系统无缝切换

阅读更多
热部署,是实际开发中经常会遇到的一个问题。一个系统上线之后,不可避免的会因为修改bug,功能的增加等问题需要更新代码、配置文件,这就需要重启应用服务器。如果系统需要提供的是7*24小时的服务,不能中断访问,那么如何能够做到在部署系统时做到系统的无缝切换呢?
1、F5等负载均衡设备
一般大型网站中都会采用f5做负载均衡。在更新系统时,可以先把线上应用部署在一台临时服务器B,通过F5让访问该应用的请求都指向B,同时A服务器下线。在服务器A上进行更新操作,测试完毕后,通过F5再把请求转发到服务器A,同时B服务器下线。更新完毕!
缺点:F5花费太大,小公司使用太过奢侈
2、Nginx等反向代理服务器
F5毕竟是比较奢侈的硬件,中小公司大都会需用nginx服务器做负载均衡。在进行系统切换时,和F5原理相同。先把请求转发到备用机B上,更新服务器A,然后再把请求切换到A。此方法只需用简单修改Nginx配置文件:
更新前:
upstream XXX_server_pool {
   #server   192.168.1.15:80  //A下线
   server   192.168.1.16:80   //B在线
 } 
更新后:
upstream XXX_server_pool {
   server   192.168.1.15:80  //A在线
   #server   192.168.1.16:80   //B下线
 } 

切换过程中nginx的reload很快,因此不会出现nginx服务器down掉的情况。
缺点:有的应用前面并没有Nginx,只适用通过Nginx实现负载均衡的系统。
3、Apache切换应用指向
如果应用服务器前采用apache的http服务器,那么可以通过切换apache对后端应用的指向实现无缝切换。
apache接到请求后,如果是动态请求需要向后端的应用服务器转发,resin、tomcat等,改变了apache指向的应用服务器的就可以实现。比如:原应用部署在resin下开启8081端口,重新部署应用在resin_standby下开启8082端口,这样apache就可以在8081和8082两个端口下自由切换了。
  • 应用app重新copy一份app_standby
  • resin重新copy一份resin_standby
  • 修改resin_standby的端口,保证和resin端口不一致
  • 修改apache的http.conf,执行reload

resin:
<http-server>
  <doc-dir>/home/httpd/app</doc-dir>
  <http  port='8081'/>
  <srun id='1' host='127.0.0.1' port='6801' srun-index='3'/>
  省略……

resin_standby:
<http-server>
  <doc-dir>/home/httpd/app_standby</doc-dir>
  <http  port='8088'/>
  <srun id='2' host='127.0.0.1' port='6808' srun-index='3'/>
 省略……

apache配置文件(在线):
<VirtualHost *:80>
DocumentRoot "/home/httpd/app"
CauchoConfigFile /usr/local/resin/conf/resin.conf
CustomLog logs/access_log combined
<Directory /home/httpd/app>
省略……
</Directory>
</VirtualHost>

apache配置文件(切换时):
<VirtualHost *:80>
DocumentRoot "/home/httpd/app_standby"
CauchoConfigFile /usr/local/resin_standby/conf/resin.conf
CustomLog logs/access_log combined
<Directory /home/httpd/app_standby>
省略……
</Directory>
</VirtualHost>

执行apache的reload命令:
apachectl -k graceful

也可以把修改配置文件和执行reload命令做成shell脚本执行。
切换到standby(例子):
#!/bin/sh
HOSTNAME=app
cp /usr/local/apache2/conf/vhosts/${HOSTNAME}.conf /usr/local/apache2/conf/vhosts/${HOSTNAME}_bak.conf
cp /usr/local/apache2/conf/vhosts/${HOSTNAME}_standby.conf /usr/local/apache2/conf/vhosts/${HOSTNAME}.conf
`/usr/local/apache2/bin/apachectl -t`
CHECK_FLAG=$?

if test $CHECK_FLAG -eq 0
then
        /usr/local/apache2/bin/apachectl -k graceful
        rm -f /usr/local/apache2/conf/vhosts/${HOSTNAME}_bak.conf
        echo "Standby started!"
else
        cp /usr/local/apache2/conf/vhosts/${HOSTNAME}_bak.conf /usr/local/apache2/conf/vhosts/${HOSTNAME}.conf
        rm -f /usr/local/apache2/conf/vhosts/${HOSTNAME}_bak.conf
        echo "Standby conf error! conf restored!"
fi

切换到active的类似,就不在赘述。
缺点:在同一台机器上启动两份应用,对硬件有些要求(内存,jvm参数优化等)。有时候可能不能同时启动两份应用,视情况而定。
分享到:
评论
10 楼 xieke 2010-09-27  
根本无需reload apache,只需要 在不同时段分别 重启两份应用,
apache load balance  会自动将失败请求转发至另外一台。
用户什么都感觉不到。
9 楼 ming123 2010-08-03  
antjava 写道
llyzq 写道
这个只能针对应用程序进行了修改的情况吧

数据库应该只有一个

如果程序更新涉及到数据库修改,这时候就不行了吧


大型的应用,数据库基本上都不止一台,
如果只涉及表字段的增删,比较容易实现。
F5还是比较好,
只需要在访问量比较低的时候,结束掉其他机器的服务,
然后更新,在启动。就没问题。
我们每次升级就是这样实现。

f5 太贵了吧
8 楼 antjava 2010-08-02  
llyzq 写道
这个只能针对应用程序进行了修改的情况吧

数据库应该只有一个

如果程序更新涉及到数据库修改,这时候就不行了吧


大型的应用,数据库基本上都不止一台,
如果只涉及表字段的增删,比较容易实现。
F5还是比较好,
只需要在访问量比较低的时候,结束掉其他机器的服务,
然后更新,在启动。就没问题。
我们每次升级就是这样实现。
7 楼 lovemylover 2010-08-02  
  热部署一直是java的一个比较大的问题。曾经看过一篇关于OSGI的文章,好像就是关于解决这方面的问题的,具体的已经记不清了。希望比较了解的同志能说说
6 楼 llyzq 2010-08-01  
这个只能针对应用程序进行了修改的情况吧

数据库应该只有一个

如果程序更新涉及到数据库修改,这时候就不行了吧
5 楼 my_corner 2010-08-01  
kimmking 写道
文不对题。

讲的都是loadbalance切换应用。

还以为是hot update呢

标题已经修改了
4 楼 ming123 2010-08-01  
kimmking 写道
文不对题。

讲的都是loadbalance切换应用。

还以为是hot update呢

java应用不用loadbalance切换,还有别的方法?hot update?java有?
3 楼 ming123 2010-08-01  
我觉得第三种方法挺不错的,利用apache进行切换
2 楼 kimmking 2010-08-01  
文不对题。

讲的都是loadbalance切换应用。

还以为是hot update呢
1 楼 ming123 2010-08-01  
学习了,用在系统上试试。这下应该不用暂停服务了。

相关推荐

    APACHE集成TOMCAT

    通过这样的集成,我们可以充分利用Apache处理静态内容的能力,同时利用Tomcat对Java应用的高效支持,提高整体系统的性能和稳定性。此外,这种架构还允许我们灵活地扩展多个Tomcat实例,以实现负载均衡和故障切换,...

    Jboss6+mod_jk+apache2.2集群实现session的复制

    在这样的背景下,利用JBoss 6、mod_jk和Apache 2.2构建的集群环境成为一种常见的解决方案。该方案不仅可以实现两个节点间的无缝负载均衡,还能够实时复制Session数据,确保即使某个节点出现故障,用户的服务也不会受...

    zookeeper实现服务节点HA主备自动切换,1主多从模式、ZooKeeper实现高可用

    ZooKeeper,作为Apache的一个分布式协调服务,广泛应用于实现服务节点的HA主备自动切换,以及构建1主多从的模式。本文将深入探讨ZooKeeper如何实现这些功能,并结合SpringBoot和SpringFramework的集成,来创建一个...

    apache-sentry-2.1.0-src.tar.gz

    6. **高可用性**:Sentry支持多实例部署,以实现高可用性和故障切换。 解压"apache-sentry-2.1.0-src"后,你可以开始探索源代码,了解其架构和工作流程。通常,这涉及到阅读源码、编译、运行测试用例以及查阅文档。...

    hadoop-cos(CosN文件系统)为Apache Hadoop、Spark以及Tez等大数据计算框架集成提供支.zip

    【描述】: "hadoop-cos项目是为了实现腾讯云对象存储(COS)与Apache Hadoop生态的无缝对接,提供了一种名为CosN的文件系统接口,使得Hadoop、Spark、Tez等大数据处理框架能够直接读写存储在COS上的数据。...

    Apache_OpenOffice_4.1.10_Linux_x86-64_install-deb_zh-CN.tar.gz

    这意味着用户可以从任何平台无缝切换到Apache OpenOffice,而不会丢失数据。 此外,作为开源软件,Apache OpenOffice允许用户根据需要自定义和扩展其功能,开发者可以利用其提供的API和UNO(Universal Network ...

    不仅仅是流计算:Apache Flink实践

    这使得开发者能够无缝地在实时和批量任务之间切换,无需改变代码结构。 二、核心概念 1. DataStream API:针对无界数据流的API,支持事件时间和处理时间的概念,保证了实时处理的精确性。 2. DataSet API:面向...

    Weblogic加Apache的负载均衡以及群集配置

    当一个Weblogic服务器出现故障时,Apache可以自动将流量切换到其他健康的服务器,保证服务的连续性。同时,会话复制确保了用户在集群中的无缝体验。这种架构是大型分布式系统的基础,对于保证业务连续性和优化资源...

    Dinky 是一个基于 Apache Flink 的实时数据开发平台,实现了敏捷的数据开发、部署和运维

    Flink的设计理念是支持流式和批处理两种模式,实现无缝切换,使得开发者能够以一致的方式处理连续不断的数据流和一次性数据批。 2. **Dinky的敏捷开发**:Dinky提供了便捷的开发环境,允许数据工程师快速构建实时...

    Apache Flink集成Apache Iceberg最佳实践-Flink Forward Asia 2021.pdf

    1. **使用Flink的Table API或SQL**:通过Flink的Table API或SQL,开发者可以方便地定义和操作Iceberg表,实现流处理和批处理的无缝切换。 2. **配置元数据存储**:根据实际需求,配置合适的元数据存储,如MySQL或...

    Apache Kudu用户指导手册

    6. **集成Hadoop生态系统**:Kudu可以无缝集成到Hadoop生态系统中,例如与Hive、Impala、Spark等工具配合使用,实现高效的数据分析。理解如何配置和使用这些工具与Kudu协同工作至关重要。 7. **监控和运维**:Kudu...

    apache-tomcat-8.5.51.tar.gz

    5. **Cluster**:如果需要部署高可用性和负载均衡的环境,Tomcat的集群功能可以帮助复制会话和应用状态,确保在服务器故障时能够无缝切换。 6. **Connector**:Tomcat可以通过不同的连接器与外部系统交互,例如AJP ...

    Apache+Resin做负载均衡 [windows 2003]

    本篇将详细讲解如何在Windows 2003操作系统上利用Apache和Resin搭建负载均衡环境,以及集群配置的相关知识点。 Apache是一款开源的HTTP服务器,因其稳定性、灵活性和丰富的模块支持而广受欢迎。Resin则是基于Java的...

    Apache-cxf-学习笔记.docx

    CXF是一个用于构建和开发Web服务的框架,它提供了一种无缝的方式,可以在不同的Web服务标准之间切换,如SOAP、RESTful HTTP等。此外,CXF支持多种编程模型,包括基于注解的Java SE和Java EE,以及基于XML的WS-I ...

    mod_python-3.3.1.win32-py2.6-Apache2.2.rar

    安装mod_python-3.3.1.win32-py2.6-apache2.2.exe这个文件,即可在Windows系统中为Apache 2.2添加对Python 2.6的支持。安装过程中,需确保Apache服务器已经安装并且运行正常,同时注意选择与Python版本匹配的mod_...

    Apache_OpenOffice_4.1.9_Linux_x86-64_install-rpm_zh-CN.tar.gz

    在使用Apache OpenOffice时,用户可以利用其跨平台特性,无缝切换Windows、Linux或Mac系统,同时享受与Microsoft Office类似的文件兼容性。此外,由于Apache OpenOffice的开源性质,用户可以根据自己的需求进行...

    Apache Kudu 1.4.0 中文文档

    7. **与Hadoop生态系统集成**:Kudu 可以无缝地与Hadoop生态系统的其他组件,如Hive、Impala和Spark,进行集成,提供统一的数据访问层。 在Apache Kudu 1.4.0 版本中,可能包括以下更新和改进: 1. **性能优化**:...

    Python-BigDL一个用于ApacheSpark的分布式深度学习库

    2. **无缝集成**:BigDL与Spark的API高度兼容,用户可以直接在Spark程序中编写和运行深度学习模型,无需切换到其他框架,降低了学习和使用的门槛。 3. **高性能**:BigDL利用Intel MKL(Math Kernel Library)和AVX...

    中间件-apache-geode-1.6.0

    这有助于在主节点故障时快速切换到备份节点,实现无缝故障恢复。 5. **事件监听与处理**:Geode提供了事件监听接口,允许应用实时响应数据变化。这对于实时分析和响应至关重要。 6. **安全性**:1.6.0版本可能包含...

Global site tag (gtag.js) - Google Analytics