共计 2250 个字符,预计需要花费 6 分钟才能阅读完成。
本人花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机、对使用用户零影响。
我的设想是使用集群来搞定,通过通知负载均衡 Nginx,取下集群中的 Tomcat 节点,然后对 Tomcat 上的应用进行升级,再通知负载均衡 Nginx,把 Tomcat 节点重新加载上去。依次这么做,把集群中的所有 Tomcat 都替换一次即可。
那么问题来了,在取下 Tomcat 节点和加载新 Tomcat 节点时如何做到对用户无影响呢?方法很简单,共享 Session。
下面,我们用实例来说明此方案。我们的例子使用了一台 Nginx 做负载均衡,后端挂接了两台 Tomcat,且每台 Tomcat 的 Session 会话都保存到 Redis 数据库中。其中,Nginx 配置为 non-sticky 运行模式,也即每一个请求都可以被分配到集群中的任何节点。当要上线新代码时,只需简单地取下 Tomcat 实例,此时所有的访问用户会被路由到活动的 Tomcat 实例中去,而且由于会话数据都是保存在 Redis 数据库中,所以活跃用户并不会受影响。当 Tomcat 更新完毕,又可以把此节点加入到 Nginx 中。
安装 Nginx
# sudo rpm -ivh nginx-1.4.2-1.el6.ngx.x86_64.rpm
修改配置文件 /etc/nginx/nginx.conf,并添加下面的内容:
http {
upstream tomcat {
server localhost:8080;
server localhost:8081;
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
修改配置文件 /etc/nginx/conf.d/default.conf 并替换 location 部分的内容:
location / {
proxy_pass http://tomcat;
}
重启 Nginx
# sudo service nginx restart
接下来,安装两个 Tomcat 实例。由于我们是在同一台服务器上做的演示,要让两台 Tomcat 不发生冲突,需要修改第二个 Tomcat 实例的端口号。由于 Nginx 配置为 non-sticky 运行模式,对每个请求采用的是 Round-robin 负载均衡方式,这意味着它会为每个请求都抽奖一个新会话。
接着,下载并安装 Redis。步骤省略,很简单。
最后,我们需要配置 Tomcat,让 Tomcat 把会话 Session 保存到 Redis 数据库。
我们要使用 tomcat-redis-session-manager 这样的第三方库,主页见:
https://github.com/jcoleman/tomcat-redis-session-manager
要注意此库并非开箱即用的,使用时需要做一些调整。你需要下载源码,并在更新了依赖库的版本后,重建项目。比如我使用了 commons-pool2-2.2.jar 和 jedis-2.6.1.jar 依赖库。要记住把这些 jar 文件复制到每一个 Tomcat 实例的 lib 子目录下。
在更新了 commons-pool、jedis 和 tomcat 版本这些库后,你可以使用 build.gradle 来构建整个项目。构建完毕后,复制新生成的 tomcat-redis-session-manager-1.2.jar 到每一个 Tomcat 实例的 lib 子目录下。并在修改每一个 Tomcat 实例的 context.xml 配置文件:
<Valve className=”com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve” />
<Manager className=”com.orangefunction.tomcat.redissessions.RedisSessionManager”
host=”localhost”
port=”6379″
database=”0″
maxInactiveInterval=”60″ />
重启 Tomcat 实例。可以检查到 Redis 确实保存了 Tomcat 的会话。然后我们对 Tomcat 实例取下或恢复时,访问用户确实没受影响。
Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm
Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm
Ubuntu 12.10 下安装 Redis(图文详解)+ Jedis 连接 Redis http://www.linuxidc.com/Linux/2013-06/85816.htm
Redis 系列 - 安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm
CentOS 6.3 安装 Redis http://www.linuxidc.com/Linux/2012-12/75314.htm
Redis 安装部署学习笔记 http://www.linuxidc.com/Linux/2014-07/104306.htm
Redis 配置文件 redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm
Redis 的详细介绍 :请点这里
Redis 的下载地址 :请点这里