集群:当单机处理到达极限或单机出现故障,我们能想到的就是使用备用机,就像一个篮球选手下场,让替补的上场一样。
为了实现真的‘负载均衡’,我们的服务器宕机了,而用户端没有感觉到使用异常,请求都还可以用,保存的信息(包括用户信息和操作信息等都一样还在),只有我们后端的人知道了,机子A需要休息维护,而机子B上场顶替了。
现在有很多方法可以实现集群,其中就有Nginx和Apache,他们的差别我只能说Nginx的静态处理比Apache高效很多,反向代理也很方便,而Apache的rewrite即对URL的虚拟改写在很多时候也挺好用的,其他我真没怎么感受出来,因为自己之前懒,就用wamp的Apache改conf配置后就开始集群了,导致后来出现很多问题,所以这里就不写Apache的集群了。
window下载(下载地址:http://nginx.org/en/download.html)
下载安装完成后,用cmd命令行去操作nginx服务,在命令行进入nginx 的安装目录,执行 “start nginx"命令启动nginx服务
在浏览器输入 "localhost" 显示‘welcome页面’
即表示安装成功。
Tomcat在apache官网就可以找到,要实现集群,那就要用虚拟机或是多台电脑去实现,为了让初学者更容易入门,我用的是Eclipse编译器(MyEclipse等都可以),配置好Tomcat的环境变量,并配置Eclipse里的Tomcat,尽量不要用编译器自带的Server,不要问我为什么。
这里我创建了两个tomcat服务器实例,命名为tomcat1和tomcat2,如果现在tomcat1为服务端正在使用的服务器(非分布式),则tomcat2作为我的备用机
然后修改两个Server实例的server.xml,修改内容为
Tomcat1——server.xml
注意:两个Server的端口号要不一致,包括备用端口号
jvmRoute要一致,不然之后共享Session的时候会失败。
然后打开注释掉的cluster配置
这部分就是tomcat的server配置了,
为了方便,我把tomcat2的server.xml的关键配置也贴上
好了,我们搞定了Tomcat配置,接下来开始配置集群。
接下来在nginx目录下的conf文件里找到nginx.conf配置文件,注意:这个文件是配置集群的核心。
下面贴出文件的内容
#user nobody;
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream localhost{
#Nginx是如何实现负载均衡的,Nginx的upstream目前支持以下几种方式的分配
#1、轮询(默认)
#每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
#2、weight
#指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
#2、ip_hash
#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
#3、fair(第三方)
#按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#4、url_hash(第三方)
#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
#ip_hash;
#这里分别配置了Tomcat1和Tomcat2的地址,对应其端口
server localhost:8081;
server localhost:9081;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_connect_timeout 3;
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 30;
#后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 30;
#连接成功后,后端服务器响应时间(代理接收超时)
proxy_pass http://localhost;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
分别写两个jsp放在两个Tomcat里,我们看看集群是否成功。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Insert title here
<%
System.out.println("===========================Tomcat1"); /* 再写一个jsp,输出"===========================Tomcat2" */
%>
开启两个Tomcat服务器,并start nginx开启nginx服务,上面开好了就算了,然后打开浏览器,输入localhost,显示
====================Tomcat1或
====================Tomcat2,多次刷新页面,可以看到Tomcat1和Tomcat2有时会交换使用!
实现集群的关键还有Session共享,比如用户现在登录后,信息保存在Tomcat1服务器里,如果Tomcat宕机了,则我们还可以继续保持Session的信息,因为Session之间的信息通过拷贝已经共享了,一台机子断开连接,我们仍可以用另一台机子继续服务用户,这样就使用户在使用客户端过程中感觉异常。
怎么做到Session共享呢,我们在前面Tomcat的jvmRoute已经说过了,要注意配置相同,不然会每当交换服务器时就会产生新的SessionId,基于上面的配置,我们当使用Java项目时,一定要配置项目下的web.xml
web.xml
加上这个
如果没有配置,则Session共享在这个项目无效,如果把项目搭载入两个Tomcat里,当Tomcat1换成Tomcat2时就会产生新的Session,不会进行Session共享。
搭载项目后,启动Tomcat服务器,可以在浏览器看到,不管多次刷新后的服务器是哪个,Session依旧是同一个。