锁定老帖子 主题:利用Apache实现系统无缝切换
精华帖 (3) :: 良好帖 (4) :: 新手帖 (14) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-01
最后修改:2010-08-02
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两个端口下自由切换了。
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参数优化等)。有时候可能不能同时启动两份应用,视情况而定。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-08-01
学习了,用在系统上试试。这下应该不用暂停服务了。
|
|
返回顶楼 | |
发表时间:2010-08-01
文不对题。
讲的都是loadbalance切换应用。 还以为是hot update呢 |
|
返回顶楼 | |
发表时间:2010-08-01
我觉得第三种方法挺不错的,利用apache进行切换
|
|
返回顶楼 | |
发表时间:2010-08-01
kimmking 写道 文不对题。
讲的都是loadbalance切换应用。 还以为是hot update呢 java应用不用loadbalance切换,还有别的方法?hot update?java有? |
|
返回顶楼 | |
发表时间:2010-08-01
kimmking 写道 文不对题。
讲的都是loadbalance切换应用。 还以为是hot update呢 标题已经修改了 |
|
返回顶楼 | |
发表时间:2010-08-01
这个只能针对应用程序进行了修改的情况吧
数据库应该只有一个 如果程序更新涉及到数据库修改,这时候就不行了吧 |
|
返回顶楼 | |
发表时间:2010-08-02
热部署一直是java的一个比较大的问题。曾经看过一篇关于OSGI的文章,好像就是关于解决这方面的问题的,具体的已经记不清了。希望比较了解的同志能说说
|
|
返回顶楼 | |
发表时间:2010-08-02
llyzq 写道 这个只能针对应用程序进行了修改的情况吧
数据库应该只有一个 如果程序更新涉及到数据库修改,这时候就不行了吧 大型的应用,数据库基本上都不止一台, 如果只涉及表字段的增删,比较容易实现。 F5还是比较好, 只需要在访问量比较低的时候,结束掉其他机器的服务, 然后更新,在启动。就没问题。 我们每次升级就是这样实现。 |
|
返回顶楼 | |
发表时间:2010-08-03
antjava 写道 llyzq 写道 这个只能针对应用程序进行了修改的情况吧 数据库应该只有一个 如果程序更新涉及到数据库修改,这时候就不行了吧 大型的应用,数据库基本上都不止一台, 如果只涉及表字段的增删,比较容易实现。 F5还是比较好, 只需要在访问量比较低的时候,结束掉其他机器的服务, 然后更新,在启动。就没问题。 我们每次升级就是这样实现。 f5 太贵了吧 |
|
返回顶楼 | |