动态服务器的问题往往就是并发能力太弱,需要多台动态服务器一起提供服务。如何把并发的压力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是负载均衡。在之前的实验中,我们知道LVS、Nginx和HAProxy均能实现此功能,此篇主要看下如果利用Nginx来实现Tomcat的负载均衡调度。
本次实验,笔者准备了四台主机,一台作为客户端,取名client;一台ip为10.0.0.8的主机作为Nginx服务器,取名nginx-proxy,并绑定到www.johnnyfang.com的域名上;两台ip分别为10.0.0.18和10.0.0.28的主机作为后端Tomcat服务器,取名t1.johnnyfang.com和t2.johnnyfang.com。
- 后端Tomcat服务器
后端两台Tomcat服务器需安装tomcat服务,Tomcat二进制的安装方法笔者在上一篇已经提到,此篇就不做赘述。我们可以把网站部署到默认的$CATALINA_BASE/webapps/根目录下,也可自己创建一个目录来存放,如果是自己创建的目录,需要修改目录权限,另外需要修改Tomcat主配置文件。
主配置文件的修改有两种方法,第一种方法需修改两处,一个是将默认的主机指向中间的Nginx代理服务器,另一个是参照之前利用Tomcat实现多虚拟主机的方式添加host模块,需要注意的是添加的host模块部分,name也要指向中间的Nginx代理服务器。第二种方法是默认主机部分保持不变,只添加host模块,但是host模块的name填写的为中间的Nginx代理服务器配置文件中upstream模块后面跟的名称。
为了看效果,笔者创建一个jsp的默认主页面,显示是来自后端的哪台Tomcat服务器和sessionid。
- Nginx服务器
笔者就直接通过yum安装Nginx服务器,Nginx服务器主要是在配置文件中添加upstream模块,设置后端Tomcat服务器的相关信息;同时在server模块添加location信息,将用户的访问请求调度到已设置的upstream模块对应的主机上去。
- 测试环节
客户端通过Linux系统主机或电脑浏览器去访问时,能看到是按照Nginx默认的轮询调度算法向后端Tomcat服务器进行调度,已经实现了一定程度的负载均衡。
- 实现session黏性
以上操作虽然完成了对后端Tomcat服务器的负载均衡调度,不过并未实现session的绑定,当用户刷新页面时,可以看到sessionid是变化的。
对于企业来说,无论后端部署了几台服务器,采用了何种调度算法,我们都希望当同一个用户多次访问时是只显示同一个sessionid的,即让用户每次看到的都是同一个页面。
在之前的实验中我们也了解到,实现session黏性有三种方法,第一个是当同一个用户访问时,我们就只调度到同一台后端服务器上,实现session会话绑定;第二种是实现后端服务器的session复制,每一台后端服务器都有一份相同的session;第三种是专门搭建一个session服务器,例如redis和memcached,此篇主要看一下session会话绑定。
4.1 源地址哈希调度
Nginx做代理服务器时的各种调度算法在之前已经讲到过,其中就有源地址哈希算法,即通过客户端的ip来实现会话绑定,实现方法就是在Nginx配置文件upstream模块添加ip_hash;一行,修改完毕重启服务。
此时我们在浏览器中刷新页面,可看到sessionid已经不变,并且同一个用户始终是调度到同一台后端Tomcat服务器上。
如果是在Linux主机客户端上使用curl命令直接访问,看到的sessionid还是变化的,这是curl命令本身的问题。
带上-v选项可以看到sessionid的设置格式为JSESSIONID=sessionid,客户端第一次访问后,再次访问使用-b选项,并复制第一次的sessionid放后面即可保持始终是来自同一台后端服务器的同一个sessionid。
4.2 基于cookie的调度
使用源地址哈希的调度算法也有可能会带来弊端,例如我们在生活中使用的网络都是经过SNAT处理后出去的,如果经过某一个公网ip出去的用户访问量非常大,可能会对后端提供服务的服务器造成巨大压力。为了解决这个问题,我们可以考虑使用基于cookie的调度,这种方法也更为合理。
要使用基于cookie的调度,只需在Nginx配置文件中将之前的ip_hash改为hash $session_JSESSIONID即可,此时客户端去访问,已经是基于cookie的调度了。
似乎看起来并不明显,我们把浏览器中的sessionid取出,放在Linux客户端去测试,发现只要是这个sessionid的,就会调度到10.0.0.18的主机上,从而验证了基于sessionid的调度。