一、nginx和lvs的对比
1、 nginx工作在网络的第7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下lvs并不具备这样的功能,Nginx单凭这点可以利用的场合就远多于lvs;
2、 nginx对网络的依赖小,理论上只要ping通,网页访问正常,nginx就能连得通,lvs就比较依赖于网络环境,目前来看服务器在同一网段内并且lvs使用direct方式分流,效果较能得到保证。要做好lvs管理员,确实得跟进学习很多有关网络方面的知识,就不再是一个http那么简单了。
3、 nginx安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。Lvs的安装和配置、测试就比较复杂;
4、 nginx也同样能承受很高负载且稳定,但负载度的稳定性差lvs还有几个等级:nginx处理所有流量所以受限于机器IO和配置;本身的bug也是难以避免的;nginx没有现成的双机备份方案;
5、 nginx可以检测服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,目前lvs中ldirectd也能支持针对服务器内部的状态监控,但lvs的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,nginx会把上传切到另一台服务器重新处理,而lvs就直接断掉了。
6、 nginx对请求的异步处理可以帮助节点服务器减轻负载,假如使用apache直接对外服务,那么出现很多的窄带连接时Apache服务器将会占用大量的内存而不能释放,使用nginx做Apache代理的话,这些窄带连接会被nginx拦截,Apache上就不会堆积过多的请求,这样就减少了相当多的内存占用。这点使用squid也有相同的作用,即使squid本身配置为不缓存,对Apache还是有很大的帮助,lvs就没有这些功能。
7、 nginx能支持http和Email(Email的功能比较少人用),lvs所支持应用会比nginx更多。
具体的应用还得具体分析,如果是比较小的网站(日PV<1000万),用nginx就完全可以了;如果机器充裕,可以用dns轮询;大型网站或者重要的服务,机器数量充裕可以考虑使用lvs。
Nginx的优点:
高并发连接、内存消耗少、配置文件简单、成本低廉、支持rewrite重写规则、内置健康检查功能、节省带宽。
Keepalived是linux下面实现vrrp备份路由的高可靠性运行组件,基于keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时,业务可以瞬间无缝交接。Keepalived的VIP通过其配置文件管理,依靠其自身的进程去确定服务器的存活状态,如果在需要对服务器进行在线维护的话,只需要停掉被维护机器的keepalived服务进程,另外一台服务器就能接管该台服务器的所有应用。
二、四台机器keepalived+nginx+apache+tomcat搭建高可用负载均衡WEB服务器集群
1、 准备四台机器:
10.7.12.5 Nginx+Keepalived
10.7.12.6 Nginx+Keepalived
10.7.12.50 Apache
10.7.12.60 Tomcat
10.7.12.7 VIP
2、10.7.12.5和10.7.12.6配置VIP:
#cd /etc/sysconfig/network-scripts
#cp ifcfg-ens192 ifcfg-ens192:0
#vim ifcfg-ens192:0 内容如下:
#systemctl restart network
之后效果如下:
3、两台机器分别安装Nginx和Keepalived
#yum -y install nginx
#yum -y install gcc gcc+ gcc-c++popt-devel openssl openssl-devel libssl-dev libnl-devel popt-devel
#yum -y install kernel kernel-devel keepalived
确保有这些文件:
4、10.7.12.5和10.7.12.6配置Nginx和keepalived:
都执行如下操作:
#vim /etc/nginx/conf.d/default.conf
#echo “<center><h1>This is10.7.12.5.</h1></center>” > /var/www/html/index.html
#echo “<center><h1>This is 10.7.12.6.</h1></center>” > /var/www/html/index.html //10.7.12.6上执行
10.7.12.5上执行:
#vim /etc/keepalived/keepalived.conf
10.7.12.6上执行如下:
#vim /etc/keepalived/keepalived.conf
主要参数:
state 参数值:主的是MASTER,备用的是BACKUP;
priority 参数值:MASTER>BACKUP;
virtual_router_id:参数值要一致;
5、测试:
两台10.7.12.5和10.7.12.6均启动keepalived和nginx
#systemctl start keepalived
#systemctl start nginx
验证nginx启动正常:
访问master:http://10.7.12.5:8088
访问backup:http://10.7.12.6:8088
访问VIP: http://10.7.12.7:8088 //访问VIP时会根据keepalived的配置文件来跳转主机,根据priority的值大小,优先访问priority值大的主机。
6、测试成功则表示HA已配置成功,接下来就开始配置nginx实现web服务器的负载均衡。
10.7.12.5和10.7.12.6上配置nginx:
#vim /etc/nginx/nginx.conf
10.7.12.5和10.7.12.6的配置都如上图所示。
7、10.7.12.50上安装Apache:
#yum -y install httpd
#echo“<center><h1>This is 10.7.12.50.</h1></center>” > /var/www/html/index.html
#systemctl start httpd
测试访问:http://10.7.12.50
8、10.7.12.60上安装Tomcat:
#cd /usr/src
#tar -zxvf jdk1.8.0_131-linux-x64.tar.gz
#mv jdk1.8.0_131 /usr/local/jdk1.8.0_131
#vim /etc/profile //文件结尾添加如下内容:
重新登录bash执行#java -version 如果成功显示java的版本信息,则表示安装jdk成功。
安装Tomcat:
#tar /usr/src/apache-tomcat-8.5.15.tar.gz
#mv apache-tomcat-8.5.15 /usr/local/tomcat
#cp /usr/local/tomcat/bin/catalina.sh /usr/local/tomcat/bin/catalina.sh.bak
#vim /usr/local/tomcat/bin/catalina.sh //文件末尾添加如下两行:
JAVA_HOME=/usr/local/jdk1.8.0_131
CATALINA_HOME=/usr/local/tomcat
#/usr/local/tomcat/bin/catalina.sh start //启动tomcat服务
#echo “<center><h1>This is10.7.12.60.</h1></center>” > /usr/local/tomcat/webapps/ROOT/index.html
测试访问: http://10.7.12.60:8080
9、至此HA负载均衡的Web服务器集群搭建完成:
10、测试:
Windows客户端修改本地hosts文件添加:
10.7.12.7 test.likai.com
访问:http://test.likai.com //不断刷新可在10.7.12.50和10.7.12.60之间切换。
11、切换策略设置:
Nginx负载均衡的策略设置:
A、 轮询(默认)
每个请求按时间顺序逐一分配到不通的后端服务器,如果有机器down掉,则自动剔除;
B、 weight
加权轮询,weight和访问比率成正比,用于后端服务器性能不均的情况;
例如:
upstream a.com {
server 10.7.12.50weight=10;
server 10.7.12.60weight=20;
}
C、 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如:
upstream a.com {
ip_hash;
server 10.7.12.50:80;
server 10.7.12.60:8080;
}
D、 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。例如:
upstream a.com {
serverserver1;
server server2;
fair;
}
E、 url_hash(第三方)
按访问url的hash结果来分配请求,是每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。例如:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法:
upstream resinserver {
server squid1:3128;
server squid2:3128;
hash $request_url;
hash_method crc32;
}
F、 upstream resinserver {#定义负载均衡设备的IP及设备状态
ip_hash;
server 10.7.12.50:80 down;
server 10.7.12.60:80 weight=2;
server 10.7.12.70:80 1;
server 10.7.12.80:80 backup;
}
down:表示当前server暂时不参与负载均衡;
weight:默认为1,weight越大负载越大;
max_fails:允许请求失败的次数,默认为1;
backup:其它非backup机器down或mang时才请求backup机器。
扫一扫关注作者公众号