我的实验环境:
Ubuntu 14 64位
tomcat 6
jdk1.7
请看效果图
第一次访问地址:
第二次访问同样的地址:
首先我们先介绍负载均衡:负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行。(百度百科)
其实说白了就是均衡分发请求,减轻服务器的压力,让多个服务器同时按一定策略的处理用户请求。
优点:提高服务器工作效率,减轻服务器压力。提高处理响应速度,分担压力等,网络负载均衡对外只需提供一个IP地址(或域名),一个服务器宕机不影响其他服务器。
缺点:所有的请求通过负载均衡服务器,因此,负载均衡器上的任何故障都将导致整个站点的崩溃。
负载均衡实现的几种方法:
1. HTTP重定向
当用户发来请求的时候,Web服务器通过修改HTTP响应头中的Location标记来返回一个新的url,然后浏览器再继续请求这个新url,实际上就是页面重定向。通过重定向,来达到“负载均衡”的目标。
这个重定向非常容易实现,并且可以自定义各种策略。但是,它在大规模访问量下,性能不佳。而且,给用户的体验也不好,实际请求发生重定向,增加了网络延时。
2. 反向代理负载均衡(小成本经常用的)
反向代理服务的核心工作主要是转发HTTP请求,扮演了浏览器端和后台Web服务器中转的角色。因为它工作在HTTP层(应用层),也就是网络七层结构中的第七层,因此也被称为“七层负载均衡”。可以做反向代理的软件很多,比较常见的一种是Nginx。
Nginx是一种非常灵活的反向代理软件,可以自由定制化转发策略,分配服务器流量的权重等。但是反向代理软件中有一个常见的问题,就是Web服务器存储的session数据,因为一般负载均衡的策略都是随机分配请求的。同一个登录用户的请求,无法保证一定分配到相同的Web机器上,会导致无法找到session的问题。
解决方案主要有两种:
配置反向代理的转发规则,让同一个用户的请求一定落到同一台机器上(通过分析cookie),复杂的转发规则将会消耗更多的CPU,也增加了代理服务器的负担。
将session这类的信息,专门用某个独立服务来存储,例如redis/memchache,这个方案是比较推荐的。
3 IP负载均衡
IP负载均衡服务是工作在网络层(修改IP)和传输层(修改端口,第四层),比起工作在应用层(第七层)性能要高出非常多。原理是,他是对IP层的数据包的IP地址和端口信息进行修改,达到负载均衡的目的。这种方式,也被称为“四层负载均衡”。
在负载均衡服务器收到客户端的IP包的时候,会修改IP包的目标IP地址或端口,然后原封不动地投递到内部网络中,数据包会流入到实际Web服务器。实际服务器处理完成后,又会将数据包投递回给负载均衡服务器,它再修改目标IP地址为用户IP地址,最终回到客户端。 这种方式叫LVS-NAT。
4 DNS负载均衡
DNS(Domain Name System)负责域名解析的服务,域名url实际上是服务器的别名,实际映射是一个IP地址,解析过程,就是DNS完成域名到IP的映射。而一个域名是可以配置成对应多个IP的。因此,DNS也就可以作为负载均衡服务。
这种负载均衡策略,配置简单,性能极佳。但是,不能自由定义规则,而且,变更被映射的IP或者机器故障时很麻烦,还存在DNS生效延迟的问题。
当然还有很多其他的负载均衡策略和方法,什么阿里的LVS,什么GSLB,什么要钱的啊,网上很多。我们初期不要管那么多,只要试着搭着负载均衡的环境并且理解其中的原理就可以了。
一般小公司或者小项目用的比较多的就是七层负载均衡,也就是用反向代理软件实现负载均衡,这其中用的比较多的就是用nginx(nginx也可以用来处理静态资源的请求,让动态资源由tomcat服务器处理),用它来实现反向代理。
准备搭建开始:
nginx 只要一个服务器有就可以了,负载均衡位置 192.168.26.130:80。
web 192.168.26.130:8080
web1 192.168.26.129:8080
web2 192.168.26.132:8080
注:你也可以用tomcat 开三个端口,这样一个linux也可以实现。
一、
我在web 这个服务器上安装了nginx,作为负载均衡和web服务器。web1和web2 安装了tomcat ,端口都是8080。
二、安装nginx
在安装Nginx之前,需要先安装gcc、 openssl、 pcre和zlib软件库,这些貌似在Ubuntu下有些就不需要安装的,根据你自己的需要进行安装。
演示一下安装pcre库,PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正规表达式库,这个就是为之后的地址重新,location匹配啊等,让nginx支持正则
cd /usr/local/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
tar -zxvf pcre-8.21.tar.gz
cd pcre-8.21
./configure
make
make install
nginx的安装
对于nginx的版本,看个人喜好来安装,我装的是1.9.9
cd /usr/local/src
wget http://nginx.org/download/nginx-1.9.9.tar.gz
添加相应的用户 useradd www 名字可以自己随意起,不过为了接地气用www
解压nginx的包 tar -xvzf nginx-1.9.9.tar.gz
cd nginx-1.9.9/
编译安装 注意这里的user要和之前创建的用户名称相对应
cd /usr/local/src
wget http://nginx.org/download/nginx-1.9.9.tar.gz
tar -zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/src/pcre-8.21 --user=www --group=www --with-http_stub_status_module
make
make install
注意–with-pcre指向的pcre的源码路径
如果要安装zlib的话也是这样,添加个–with-zlib,后面加个源码路径
其实看你缺少什么就去安装对应的软件库,gcc,openssl,zlib 好像是我用python的时候安装的,有点时候你的操作系统有就不用安装了,看你报什么错吧。如果报错可以去下面的博客看看,或者百度。
http://blog.csdn.net/LW_GHY/article/details/52895201?locationNum=2&fps=1
安装完毕 通过 /usr/local/nginx/sbin/nginx -t 测试nginx的安装是否成功
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
三、nginx配置文件
user www www;
worker_processes 1;
#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;
fastcgi_intercept_errors on;
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#access_log logs/access.log main;
#keepalive_timeout 0;
#gzip on;
#这个是你需要重定向到的服务器IP和端口地址
upstream myserver {
#weigth参数表示权值,权值越高被分配到的几率越大
#server 192.168.26.130:80 weight=5;
server 192.168.26.129:8080 weight=5;
server 192.168.26.132:8080 weight=5;
}
#这是nginx 监听的端口和地址
server {
listen 80;
server_name localhost;
index index.jsp index.html index.htm;
#发布目录/data/www
root /data/www;
#charset koi8-r;
#access_log logs/host.access.log main;
#对 "/" 启用负载均衡
location / {
#root html;
#index index.html index.htm;
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以这种格式来使用后端的web服务器
proxy_pass http://myserver;
}
请看结果图
第一次访问地址:
第二次访问同样的地址: