LVS负载均衡+动静分离+高可用(nginx+tomcat+ke
一、环境介绍
基于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
![](https://img.haomeiwen.com/i5120189/9e5598727244879d.png)
二、环境安装
1、安装JDK
四台虚拟机均安装JDK,因安装过程是一样的,所以此处只截图一台虚拟机jdk安装过程。
首先查看jdk版本,centos默认安装openJDK:
![](https://img.haomeiwen.com/i5120189/432163fc9f85d2c5.png)
检查可用的JDK版本:
[图片上传失败...(image-2ebecc-1512133579646)]
卸载原来openJDK
![](https://img.haomeiwen.com/i5120189/586084b7121b71d3.png)
再次查看,已经卸载成功:
![](https://img.haomeiwen.com/i5120189/ae05333bd8dc9380.png)
开始安装JDK,到oracle官网下载liunx jdk包,解压到当前目录下
解压好,进入目录查看:
![](https://img.haomeiwen.com/i5120189/29813b21db3b033e.png)
配置JDK环境变量,修改/etc/profile
![](https://img.haomeiwen.com/i5120189/2af3e056b3f7b9f7.png)
使环境变量生效:
![](https://img.haomeiwen.com/i5120189/b352bf1e999a4a1c.png)
参看结果:
![](https://img.haomeiwen.com/i5120189/7a38d7400108ffff.png)
此时可以看到jdk已经安装成功
这边liun下jdk的安装有很详细教程,可以去网上搜
2.两台服务器安装tomcat
下载tomcat,解压到/opt目录
解压后查看:
![](https://img.haomeiwen.com/i5120189/060e3a0552d8b91e.png)
Root权限进入/bin目录,启动tomcat
![](https://img.haomeiwen.com/i5120189/dd53625e2366213c.png)
配置防火墙端口:
![](https://img.haomeiwen.com/i5120189/b25fc6c5ebd8f877.png)
![](https://img.haomeiwen.com/i5120189/2708a128396f5974.png)
重新加载防火墙配置:
![](https://img.haomeiwen.com/i5120189/84df788023cc1d2b.png)
![](https://img.haomeiwen.com/i5120189/59f1ab96551b40a4.png)
启动tomcat访问,首页访问成功:
至此,tomcat安装完成,另一台server虚拟机可克隆该台虚拟机来实现。
3、nginx安装
下载nginx,解压到/usr/local目录下,解压后查看:
![](https://img.haomeiwen.com/i5120189/5c72faf72a7ecdff.png)
进入解压目录执行./configure命令进行安装
出现错误及解决方法:
错误1:
![](https://img.haomeiwen.com/i5120189/4d75ee4ab4060ef5.png)
原因:缺少gc++
解决:
![](https://img.haomeiwen.com/i5120189/a0cc171f9c9f4cf0.png)
错误2:
![](https://img.haomeiwen.com/i5120189/6f707923724acbb5.png)
解决:
![](https://img.haomeiwen.com/i5120189/785c3056fb982ed3.png)
错误3:
![](https://img.haomeiwen.com/i5120189/e1f7ff619cea7a65.png)
解决:
![](https://img.haomeiwen.com/i5120189/64e3272f71cd8829.png)
解决上述错误后,再执行安装命令:
![](https://img.haomeiwen.com/i5120189/bf70499214a04dc3.png)
查看nginx进程号:
![](https://img.haomeiwen.com/i5120189/30c1cdba2960ae05.png)
启动nginx
![](https://img.haomeiwen.com/i5120189/2a8c96e60c5a9264.png)
关闭nginx命令是
./nginx -s stop
默认端口是80,此时可在网页访问到:
![](https://img.haomeiwen.com/i5120189/5a9c37077a760a31.png)
至此,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
编译之后的配置:
![](https://img.haomeiwen.com/i5120189/8abe09ad841751e6.png)
获得权限:
![](https://img.haomeiwen.com/i5120189/d713417362f996ec.png)
修改/etc/init.d/keepalived文件,将默认路径改成当前alive安装路径
![](https://img.haomeiwen.com/i5120189/6cc02587886f0879.png)
即默认为前一行注释掉的路径,改为下一行,指向了正确的配置文件位置。
配置环境变量
![](https://img.haomeiwen.com/i5120189/1eaeaf3160fcd838.png)
建立软连接:
![](https://img.haomeiwen.com/i5120189/28e752d0b252c17d.png)
修改/usr/local/keepalive/etc/sysconfig/keepalived文件,修改正确的启动参数
![](https://img.haomeiwen.com/i5120189/831b9a885e9ca856.png)
启动Keepalived
![](https://img.haomeiwen.com/i5120189/543882ab9554cf00.png)
设置keepalived服务为开机自启动
![](https://img.haomeiwen.com/i5120189/49c2b42b94338aac.png)
至此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文件
主要配置信息如下:
![](https://img.haomeiwen.com/i5120189/030899dbd032e704.png)
补充知识了解:
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文件:
![](https://img.haomeiwen.com/i5120189/7b66d289634b5bd2.png)
Server2下index.html文件:
![](https://img.haomeiwen.com/i5120189/bcbbdaf33acbb393.png)
首先测试在两台tomcat服务器下本地能访问这两个页面:
Server1下:
![](https://img.haomeiwen.com/i5120189/61e15710a8542aac.png)
Server2下:
![](https://img.haomeiwen.com/i5120189/647bffddf04c0839.png)
可以看到两台服务下均可正常访问
然后在安装Nginx服务器下测试:
![](https://img.haomeiwen.com/i5120189/85511c1fd4f10d77.png)
![](https://img.haomeiwen.com/i5120189/8d75ac1db11780d6.png)
可以看到,在nginx服务器下,在网页中每次刷新都会随机访问到两台Tomcat服务器中的任意一台,可以看出,已经完成了负载均衡的效果。
四、动静分离
为了提高网站的响应速度,减轻程序服务器(tomcat)的负载,对于js,css,图片等静态文件可以在nginx反向代理服务器中进行缓存,这样浏览器在请求一个静态资源的时候,代理服务器就可以直接处理,而不用将请求转发给后端服务器。而用户请求的动态文件比如jsp则会转发给tomcat服务器处理,这就是动静分离,也是反向服务器的一个重要作用。
在server1这台服务器webapp/21751152目录下建index.jsp文件:
Index.jsp内容如下:
![](https://img.haomeiwen.com/i5120189/01e6a70f6ebeefd7.png)
然后进行Nginx.conf配置文件的修改:
主要修改内容如下:
![](https://img.haomeiwen.com/i5120189/01b06c38f0d61209.png)
Root /usr/local/webapps 这段代码的意思是指定Nginx访问的目录,即静态资源所在的目录。
Expires 30d.指这些资源文件在客户端浏览器的缓存时间,30d值30天,1h指一小时
开始测试:
首先在server1本地进行测试,页面可以正常访问:
![](https://img.haomeiwen.com/i5120189/70a69de7da1e57da.png)
然后在nginx服务器下进行测试:
![](https://img.haomeiwen.com/i5120189/a2c26b1010e5ea16.png)
可以看到,向日葵这张图片作为静态文件,没被加载出来。这是因为静态资源访问请求已经被Nginx拦截,由Nginx进行处理。但是Nginx服务器的 /usr/local/webapps 目录下并没有图片资源,所以图片没有加载出来。index.jsp页面能够显示,说明动态的请求已经转发到了Tomcat,Tomcat对index.jsp进行了解析。
在Nginx服务器 /usr/local/webapps 目录下放置图片文件,将tomcat上把21751152/img/flower.jpg整个目录拷贝到其中。然后再次刷新。
![](https://img.haomeiwen.com/i5120189/8d92284cdae5fede.png)
![](https://img.haomeiwen.com/i5120189/715795eb641804fc.png)
此时,图片就被加载出来了。至此,可以看出已经Nginx已经实现了动静分离的功能。
在配置动静分离后,用户请求你定义的静态资源,默认会去nginx的发布目录请求,而不会到后端请求,这样可以提高网站响应速度,减轻真实Web服务器的负载压力。
不过在开发环境下,为了便于开发,咱们的静态资源和代码还是放在一起的,等开发测试完成,才会将完成的完整程序部署到生成环境上,然而程序代码和静态资源是分别放置到不同的服务器上的。
五、keepalive高可用
编辑ngin服务器的keepalived.conf文件,keepalived.conf文件如下图所示:
![](https://img.haomeiwen.com/i5120189/271c05d475b5c949.png)
![](https://img.haomeiwen.com/i5120189/eb50b7a4aaf8a718.png)
画出红线部分是主要需要注意的地方
备份的nginx_bk配置文件与此类似
需要注意的以下几个点:
需要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致
配置文件如下:
![](https://img.haomeiwen.com/i5120189/8ee7ce9956ed369b.png)
![](https://img.haomeiwen.com/i5120189/cab1696a2a2c0d4f.png)
注:在主备机中vip应设置一致
1、遇到的问题1及解决过程
用keepalived方式在主nginx服务器中添加了虚拟Ip,但是用ip addr查看发现仍然只有一个IP地址,即keepaLived.cof文件里面配置的vip没有起到效果
![](https://img.haomeiwen.com/i5120189/dfa06ec78fa1cb37.png)
解决问题过程:
(1)尝试一:
可能是keepalived没有安装成功,所以采用yum重新安装keepalived
但是重装后还是发现VIP没有生效。
(2)最终解决:
后来在同学的提醒下,发现是自己的keepalived服务没有启动好,nginx服务也需要重启。这两个服务启动好后,就可以了。
开始测试:
在两台nginx和nginx_bk服务器中keepalived服务和nginx服务都开启的情况下:
首先测试nginx的IP:
![](https://img.haomeiwen.com/i5120189/76b2c86bf312e349.png)
可以看到在Nginx中已经有虚拟ip了
而在Nginx_bk服务器中:
![](https://img.haomeiwen.com/i5120189/064d01d11b442422.png)
可以看到没有绑定虚拟ip
访问192.168.204.177
![](https://img.haomeiwen.com/i5120189/c0a10970d05250db.png)
![](https://img.haomeiwen.com/i5120189/28c58f27917b661b.png)
这是访问虚拟ip地址,发现也被转发到了Nginx主机192.168.204.135指向的tomcat服务器上,同时也是随机分配到了两天Tomcat服务器上,即实现了负载均衡。
2、遇到的问题2及解决过程
Nginx主从机器没有顺利切换
在模仿Nginx主机宕机过程中:
用service keepalived stop 命令将Nginx主机服务的keepalived服务停止。
![](https://img.haomeiwen.com/i5120189/625afaff00ccb194.png)
可以看到虚拟ip就没有绑在主机上
此时再去查看nginx_bk服务器,按道理来说此时Nginx_bk这台机器上应该会绑定vip,但实际查看的时候,发现并没有绑定过来
解决过程:
(1) 尝试1
因为nginx_bk这台服务器是我克隆nginx主机这台虚拟机得到的,所以存在mac地址冲突问题,猜想可能是这个原因导致的无法主从切换。
所以我对nginx_bk这台虚拟机重新生成了mac地址
过程如下:
首先关闭该虚拟机
然后选中该虚拟机点击“设置”,选择“网络适配器”,“高级”
![](https://img.haomeiwen.com/i5120189/76f462093d14b554.png)
然后点击“生成”
![](https://img.haomeiwen.com/i5120189/03f101fbf72b65f8.png)
这样就重新生成了一个MAC地址。
然后对该虚拟重启后,重新启动keepalived,nginx等服务,发现还是无法正常切换
(2) 尝试2
因为我的几台虚拟机都没有设置静态IP,在同学的建议下,可能是没有设置静态IP导致的问题,所以我对nginx和nginx_bk这两台服务器都设置了静态ip,
设置过程如下:
Nginx主机:
![](https://img.haomeiwen.com/i5120189/53562136fce4e08d.png)
![](https://img.haomeiwen.com/i5120189/39c12f7bc41acbf9.png)
对Nginx_bk服务器静态地址设置与此类似
如上设置了静态IP后,问题还是没有得到解决。
但是在多次尝试中,意外发现,当把nginx_bk这台虚拟机的nginx服务关闭后,两台虚拟机之间的主从关系是能够体现的
即当nginx主机中keepalive和nginx服务都正常开启的情况下,nginx主机下绑定了192.168.204.177这个Vip
![](https://img.haomeiwen.com/i5120189/15be20fccf5f503e.png)
当nginx_bk主机中keepaliv服务正常开启的情况下,而nginx服务停止的情况下,该虚拟机是没有绑定虚拟ip的
![](https://img.haomeiwen.com/i5120189/153ff6b3e3aba146.png)
然后将nginx主机的keepalived服务停止时:
![](https://img.haomeiwen.com/i5120189/d168c37685e5d459.png)
如上两张图所示:
主机下绑定的vip已经漂移到了nginx_bk这台主机上
然后此时把nginx_bk这台主机上的nginx服务启动,发现在浏览器上访问vip地址时也顺利转发到了两台tomcat服务器上。
![](https://img.haomeiwen.com/i5120189/fd8a4a7d0f2ec4f8.png)
这时再把nginx主机上的keepalive重新启动,同时关闭nginx_bk主机上的nginx服务
![](https://img.haomeiwen.com/i5120189/463e676780518322.png)
此时nginx主机上又重新绑定了vip,同时网页也恢复了访问。
再去查看nginx_bk主机情况:
![](https://img.haomeiwen.com/i5120189/7d7a10d07b841aa5.png)
Nginx_bk上仍然定着vip,当把nginx主机重启后,在该虚拟机上通过vip也能访问到两台tomcat上的内容。
![](https://img.haomeiwen.com/i5120189/c1e23c96daaa44a6.png)
所以在这种情况下相当于两台nginx都同时被作为了访问入口。
最终我没有把该问题很好的解决掉,猜测的原因可能与Nginx有关。可能会在后期继续研究这个问题
参考博客:
http://www.cnblogs.com/mrlinfeng/p/6146866.html
http://blog.csdn.net/u010028869/article/details/50612571
上述的实现过程我主要参照了这两篇博客,感谢他们的无私分享。