淘宝架构师李智慧大牛的书籍《大型网站技术架构》以及旭龙兄的博客 --->【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡。html
从上参考而得来本文,本文旨在记录本身的学习过程,同时给你们参考,不对的地方欢迎你们拍砖,拍砖的同时也但愿甚至恳请你们能写出缘由,让你们都有所明白和收获!linux
相关的概念我这里就很少讲了,能够从如上的书籍和旭龙兄的博客中去了解,那么下面直接开始咱们的实践!git
路漫漫其修远兮,吾将上下而求索!github
github:https://github.com/youzhibingweb
码云(gitee):https://gitee.com/youzhibing算法
本机 + virtualBox + 4台centOs虚拟机,以下图shell
virtualBox安装以及CentOS安装这里就再也不演示,你们自行搭建;本机在本次试验中扮演的角色就是客户端,起到一个发送请求的做用,两台CentOS作负载均衡服务器(一台为主机,一台为备机),另外两台做为真实的Web服务器(安装有tomcat)。vim
本次实验基于DR负载均衡模式(直接路由,旭龙兄的博客有讲解),设置一个VIP(Virtual IP)为192.168.1.200,用户只须要访问这个IP地址便可得到网页服务。其中,负载均衡主机为192.168.1.114(master),备机为 192.168.1.112(brucelee)。Web服务器A为192.168.1.111(youzhibing),Web服务器B为192.168.1.115(youzhibing03),四台机器命名除了master外都不太规范,但不影响实验。四台CentOS的防火墙都须要关闭。利用Xshell连接CentOS,以下图centos
和本地部署web项目同样,将myWeb部署到tomcat中,开启tomcat,宿主机访问(virtualBox安装linux,并搭建tomcat请点这),以下图浏览器
将这两台web服务器都配置成lvs的real server,编辑realserver脚本文件,进入指定文件夹:cd /etc/init.d/,编辑脚本文件:vim realserver,以下图
/etc/init.d/realserver 内容以下
#vi /usr/local/sbin/realserver.sh #!/bin/bash # description: Config realserver lo and apply noarp #Written by :NetSeek http://www.linuxtone.org SNS_VIP=192.168.1.200 . /etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP /sbin/route add -host $SNS_VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $SNS_VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
保存脚本文件后更改该文件权限:chmod 755 realserver,开启realserver服务:service realserver start;
注意:配置real server是web服务器都须要配置的,有多少台就配置多少台!
yum install -y keepalived
在CentOS下,经过yum install命令能够很方便地安装软件包,可是前提是你的虚拟机要联网,若没有联网则先从有网的地方下载压缩包,而后拷贝或者上传到linux系统,再进行安装;
①进入keepalived.conf所在目录:cd /etc/keepalived
②首先清除掉keepalived原有配置:> keepalived.conf
③从新编辑keepalived配置文件:vi keepalived.conf
内容以下:
global_defs { notification_email { 997914490@qq.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.1.114 smtp_connection_timeout 30 router_id LVS_MASTER # 设置lvs的id,在一个网络应该是惟一的 } vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备 interface eth0 # 当前进行vrrp通信的网络接口卡(当前centos的网卡) virtual_router_id 66 # 虚拟路由编号,主从要一直 priority 100 # 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数) authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.200 # 定义虚拟ip(VIP),可多设,每行一个 } } # 定义对外提供的LVS的VIP以及port virtual_server 192.168.1.200 8080 { delay_loop 6 # 设置健康检查时间,单位为秒 lb_algo wrr # 设置负载调度的算法为wrr lb_kind DR # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式 nat_mask 255.255.255.0 persistence_timeout 0 # 同一IP 0秒内的请求都发到同个real server protocol TCP real_server 192.168.1.111 8080 { # 指定real server1的ip地址 weight 3 # 配置节点权值,数值越大权重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.1.115 8080 { weight 3 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } }
和主负载服务器同样,先安装keepalived,而后编辑keepalived.conf,内容以下,与主负载服务器有些许差异
global_defs { notification_email { 997914490@qq.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.1.112 smtp_connection_timeout 30 router_id LVS_BACKUP # 设置lvs的id,在一个网络应该是惟一的 } vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备 interface eth0 # 当前进行vrrp通信的网络接口卡(当前进行vrrp通信的网络接口卡) virtual_router_id 66 # 虚拟路由编号,主从要一致 priority 99 # 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数) authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.200 # 定义虚拟ip(VIP),可多设,每行一个 } } # 定义对外提供的LVS的VIP以及port virtual_server 192.168.1.200 8080 { delay_loop 6 # 设置健康检查时间,单位为秒 lb_algo wrr # 设置负载调度的算法为wrr lb_kind DR # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式 nat_mask 255.255.255.0 persistence_timeout 0 # 同一IP 0秒内的请求都发到同个real server protocol TCP real_server 192.168.1.111 8080 { # 指定real server1的ip地址 weight 3 # 配置节点权值,数值越大权重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.1.115 8080 { weight 3 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } }
启动keepalive服务,主从都要启动!
service keepalived start
这里出现了问题,发现同一个浏览器一段时间内刷新,获得的结果是同一个,也就是说同一个ip某一段时间内的请求交给了同一台real server处理,用centos上的浏览器测试也是一段时间内的请求获得的是同一个结果,可是与宿主机却有所不一样,好比宿主机获得的是相同的192.168.1.115,而centos上获得的倒是192.168.1.111,,可明明我配置了persistence_timeout 0,找了很多资料,仍是没能解决!但愿知道的朋友能够不吝赐教,在评论区进行留言,谢谢了!
a.web服务器出现故障
192.168.1.115发生故障,关闭115也就是youzhibing03的tomcat服务
那么宿主机与虚拟机上的结果都只有一个,都获得以下结果
b.web服务器修复,从新启动115的tomcat服务
宿主机获得以下结果
可虚拟机上显示的却仍是192.168.111的结果
a.关闭主负载服务器的keepalived服务
刷新页面,依然能获得以下结果
那么也就说明从负载服务器(brucelee)接管了,咱们来看下日志
发现从负载服务器确实接管了主负载服务器的任务
b.当以前的主负载服务器(master)修复后,日志文件以下
主负载服务器恢复后,从负载服务器让出位置,回到最初的主从状态了!
总的来讲,最终的效果仍是符合标题的,虽然在负载均衡那一块有些许疑问,好像没有达到负载均衡的目的,可是也确实只是好像,由于整体而言仍是有负载均衡效果的,好比宿主机的获得的是115的结果,而虚拟机上的获得的是111的结果;
目前流行的LVS解决方案中,在Web服务器端也有采用了Nginx+Tomcat这样的搭配类型,静态文件和动态文件分开进行处理,也不失为一种有效的尝试。在之后的日子里,我会陆续进行实践,并分享给你们!
这篇博客其实周六就写好了,可是一直纠结负载均衡那个位置,迟迟没有发表出来,也是但愿对本身和对你们负责吧;可是有好心不必定就有好的结果,查阅了很多资料,也进行了很多修改,可负载均衡的效果一直没有改变(不是没有哦!),离我预期的有些出入,虽然有出入,但我认为负载均衡的效果是存在的,只是与单个浏览器刷新而获得两个效果之间轮流切换有一些不一样罢了!
另外提一点,若是你们想亲手实践下的话,我建议你们的硬件不要过低了,个人i7处理器 + 4G内存,运行主机 +4台虚拟机有点卡,建议你们内存上大点,最好8G以上;
最后强调一点:实践是检验真理的惟一标准! 有些许的冲动就赶快去实践!