LVS负载均衡+动静分离+高可用(nginx+tomcat+keepalived)

一、环境介绍

基于LVS(linux virtual server)linux虚拟服务器的http集群搭建
环境:使用VMware pro10,CentOS6.5
一共使用4台虚拟机,两台安装Ngnix,两台安装tomcat。
这四台服务器的作用分别是:其中一台nginx作为主服务器,另一台nginx_bk作为备用服务器,然后两台安装tomcat的虚拟机作为调度服务器。
安装并克隆虚拟机后,将四台虚拟机重新命名,分别命名为nginx, nginx_bk,server1,server2:

四台虚拟机的ip地址分别如下:

centOS_nginx 192.168.20.2.135
centOS_nginx_bk 192.168.20.2.139
CentOS_server1 192.168.20.2.134
CentOS+server2 192.168.20.2.137

二、环境安装

1、安装JDK

四台虚拟机均安装JDK,因安装过程是一样的,所以此处只截图一台虚拟机jdk安装过程。
首先查看jdk版本,centos默认安装openJDK:

检查可用的JDK版本:
[图片上传失败…(image-2ebecc-1512133579646)]

卸载原来openJDK

再次查看,已经卸载成功:

开始安装JDK,到oracle官网下载liunx jdk包,解压到当前目录下
解压好,进入目录查看:

配置JDK环境变量,修改/etc/profile

使环境变量生效:

参看结果:

此时可以看到jdk已经安装成功
这边liun下jdk的安装有很详细教程,可以去网上搜

2.两台服务器安装tomcat

下载tomcat,解压到/opt目录
解压后查看:

Root权限进入/bin目录,启动tomcat

配置防火墙端口:


重新加载防火墙配置:


启动tomcat访问,首页访问成功:

至此,tomcat安装完成,另一台server虚拟机可克隆该台虚拟机来实现。

3、nginx安装

下载nginx,解压到/usr/local目录下,解压后查看:

进入解压目录执行./configure命令进行安装
出现错误及解决方法:
错误1:

原因:缺少gc++
解决:

错误2:

解决:

错误3:

解决:

解决上述错误后,再执行安装命令:

查看nginx进程号:

启动nginx

关闭nginx命令是./nginx -s stop
默认端口是80,此时可在网页访问到:

至此,Nginx安装完成。

4、keepalive安装

Keepalived是一个基于VRRP协议来实现的服务高可用方案,作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
Keepalived实现服务的高可用(HA),应用已经非常广泛,很多软件都会和他搭配使,比如LVS,Nginx,Redis等
下载keepalie,解压到/opt/keepalive目录下
安装依赖插件:

yum install -y gcc openssl-devel popt-devel

编译安装:

./configure –prefix=/usr/local/keepalive
Make
Make install

编译之后的配置:

获得权限:

修改/etc/init.d/keepalived文件,将默认路径改成当前alive安装路径

即默认为前一行注释掉的路径,改为下一行,指向了正确的配置文件位置。

配置环境变量

建立软连接:

修改/usr/local/keepalive/etc/sysconfig/keepalived文件,修改正确的启动参数

启动Keepalived

设置keepalived服务为开机自启动

至此keepalived安装配置成功,另一两台nginx_bk可以克隆该台虚拟机。


其实在centos下可以直接用yum install keepalived来安装。默认安装路径为/etc/keepalived
用yum来装比较方便

三、负载均衡

现在有两台服务器192.168.204.134和192.168.204.137,服务器上各有一台tomcat,端口均为8080,在192.168.204上有Nginx
修改nginx安装目录中conf目录下的nginx.conf文件
主要配置信息如下:

补充知识了解:
nginx负载均衡到多台服务器上时,默认采用轮询策略:
常见策略:
1、轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况,数字越大命中率越高。
例如:轮询几率是2:1
upstream bakend {
server 192.168.0.14 weight=2;
server 192.168.0.15 weight=1;
}
2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

启动两台tomcat,重新启动nginx,访问192.168.204.135就会随机访问192.168.204.134和192.168.204.137
测试:
在两台tomcat服务器下webapps目录下创建文件夹21751152,新建index.html文件,index.html文件内容分别如下:
Server1下index.html文件:

Server2下index.html文件:

首先测试在两台tomcat服务器下本地能访问这两个页面:
Server1下:

Server2下:

可以看到两台服务下均可正常访问
然后在安装Nginx服务器下测试:


可以看到,在nginx服务器下,在网页中每次刷新都会随机访问到两台Tomcat服务器中的任意一台,可以看出,已经完成了负载均衡的效果。

四、动静分离

为了提高网站的响应速度,减轻程序服务器(tomcat)的负载,对于js,css,图片等静态文件可以在nginx反向代理服务器中进行缓存,这样浏览器在请求一个静态资源的时候,代理服务器就可以直接处理,而不用将请求转发给后端服务器。而用户请求的动态文件比如jsp则会转发给tomcat服务器处理,这就是动静分离,也是反向服务器的一个重要作用。
在server1这台服务器webapp/21751152目录下建index.jsp文件:
Index.jsp内容如下:

然后进行Nginx.conf配置文件的修改:
主要修改内容如下:

Root /usr/local/webapps 这段代码的意思是指定Nginx访问的目录,即静态资源所在的目录。

Expires 30d.指这些资源文件在客户端浏览器的缓存时间,30d值30天,1h指一小时
开始测试:
首先在server1本地进行测试,页面可以正常访问:

然后在nginx服务器下进行测试:

可以看到,向日葵这张图片作为静态文件,没被加载出来。这是因为静态资源访问请求已经被Nginx拦截,由Nginx进行处理。但是Nginx服务器的 /usr/local/webapps 目录下并没有图片资源,所以图片没有加载出来。index.jsp页面能够显示,说明动态的请求已经转发到了Tomcat,Tomcat对index.jsp进行了解析。
在Nginx服务器 /usr/local/webapps 目录下放置图片文件,将tomcat上把21751152/img/flower.jpg整个目录拷贝到其中。然后再次刷新。


此时,图片就被加载出来了。至此,可以看出已经Nginx已经实现了动静分离的功能。
在配置动静分离后,用户请求你定义的静态资源,默认会去nginx的发布目录请求,而不会到后端请求,这样可以提高网站响应速度,减轻真实Web服务器的负载压力。
不过在开发环境下,为了便于开发,咱们的静态资源和代码还是放在一起的,等开发测试完成,才会将完成的完整程序部署到生成环境上,然而程序代码和静态资源是分别放置到不同的服务器上的。

五、keepalive高可用

编辑ngin服务器的keepalived.conf文件,keepalived.conf文件如下图所示:


画出红线部分是主要需要注意的地方
备份的nginx_bk配置文件与此类似
需要注意的以下几个点:
需要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致
配置文件如下:


注:在主备机中vip应设置一致

1、遇到的问题1及解决过程

用keepalived方式在主nginx服务器中添加了虚拟Ip,但是用ip addr查看发现仍然只有一个IP地址,即keepaLived.cof文件里面配置的vip没有起到效果

解决问题过程:
(1)尝试一:
可能是keepalived没有安装成功,所以采用yum重新安装keepalived
但是重装后还是发现VIP没有生效。
(2)最终解决:
后来在同学的提醒下,发现是自己的keepalived服务没有启动好,nginx服务也需要重启。这两个服务启动好后,就可以了。
开始测试:
在两台nginx和nginx_bk服务器中keepalived服务和nginx服务都开启的情况下:
首先测试nginx的IP:

可以看到在Nginx中已经有虚拟ip了
而在Nginx_bk服务器中:

可以看到没有绑定虚拟ip
访问192.168.204.177


这是访问虚拟ip地址,发现也被转发到了Nginx主机192.168.204.135指向的tomcat服务器上,同时也是随机分配到了两天Tomcat服务器上,即实现了负载均衡。

2、遇到的问题2及解决过程

Nginx主从机器没有顺利切换
在模仿Nginx主机宕机过程中:
用service keepalived stop 命令将Nginx主机服务的keepalived服务停止。

可以看到虚拟ip就没有绑在主机上
此时再去查看nginx_bk服务器,按道理来说此时Nginx_bk这台机器上应该会绑定vip,但实际查看的时候,发现并没有绑定过来
解决过程:
(1) 尝试1
因为nginx_bk这台服务器是我克隆nginx主机这台虚拟机得到的,所以存在mac地址冲突问题,猜想可能是这个原因导致的无法主从切换。
所以我对nginx_bk这台虚拟机重新生成了mac地址
过程如下:
首先关闭该虚拟机
然后选中该虚拟机点击“设置”,选择“网络适配器”,“高级”

然后点击“生成”

这样就重新生成了一个MAC地址。
然后对该虚拟重启后,重新启动keepalived,nginx等服务,发现还是无法正常切换
(2) 尝试2
因为我的几台虚拟机都没有设置静态IP,在同学的建议下,可能是没有设置静态IP导致的问题,所以我对nginx和nginx_bk这两台服务器都设置了静态ip,
设置过程如下:
Nginx主机:


对Nginx_bk服务器静态地址设置与此类似

如上设置了静态IP后,问题还是没有得到解决。
但是在多次尝试中,意外发现,当把nginx_bk这台虚拟机的nginx服务关闭后,两台虚拟机之间的主从关系是能够体现的
即当nginx主机中keepalive和nginx服务都正常开启的情况下,nginx主机下绑定了192.168.204.177这个Vip

当nginx_bk主机中keepaliv服务正常开启的情况下,而nginx服务停止的情况下,该虚拟机是没有绑定虚拟ip的

然后将nginx主机的keepalived服务停止时:

如上两张图所示:
主机下绑定的vip已经漂移到了nginx_bk这台主机上
然后此时把nginx_bk这台主机上的nginx服务启动,发现在浏览器上访问vip地址时也顺利转发到了两台tomcat服务器上。

这时再把nginx主机上的keepalive重新启动,同时关闭nginx_bk主机上的nginx服务

此时nginx主机上又重新绑定了vip,同时网页也恢复了访问。
再去查看nginx_bk主机情况:

Nginx_bk上仍然定着vip,当把nginx主机重启后,在该虚拟机上通过vip也能访问到两台tomcat上的内容。

所以在这种情况下相当于两台nginx都同时被作为了访问入口。
最终我没有把该问题很好的解决掉,猜测的原因可能与Nginx有关。可能会在后期继续研究这个问题

参考博客:
http://www.cnblogs.com/mrlinfeng/p/6146866.html
http://blog.csdn.net/u010028869/article/details/50612571
上述的实现过程我主要参照了这两篇博客,感谢他们的无私分享。

标签:TomcatNginx 发布于:2019-11-01 09:42:11