/////////////////////////////目录///////////////////////////////////////
一、LVS/NAT配置
二、LVS/DR配置
三、LVS/DR+Keepalived配置
(包括了配置Keepalived的BACKUP)
///////////////////////////写在前面/////////////////////////////////////
常用的负载均衡开源软件有:nginx,lvs,keepalived,HAproxy
商业的硬件负载设备:F5,Netscale,但是硬件负载设备价格十分昂贵,因此我们通常用软件实现LB
LB集群是load balance集群的简写,即负载均衡集群
LVS是一个实现负载均衡集群的开源软件项目
LVS架构从逻辑上可以分为调度层,server集群层和共享储存层
LVS是由内核空间的ipvs和用户空间的ipvsadm组成,其中前者工作在INPUT链上,后者工作在POSTROUTING链上。因此如果有请求报文被ipvs事先定义了,就会将该请求报文接取下来并以特定的模型(就是工作方式)修改报文并转发
LVS可分为三种工作方式:
LVS/NAT模式:
工作流程:请求--> 前端分发器director--> director把请求转发给real_server--> real_server返回数据给director--> director把数据返回给用户
条件:director和real_server同处一个网段内,real_server可以不和外网连接,但是director要和外网连接,即同处一个vip网段,但是需要有rip
依赖防火墙实现,而且real_server的网关必须是director
优势:可以把所有的web server隐藏在后端,可以实现端口映射,修改端口
缺点:director的网络吞吐量会很大
LVS/DR模式 :
工作流程:请求--> 前端分发器director--> director把请求转发给real_server--> real_server直接把数据返回给用户
(director将请求下来的数据包的目标mac地址修改为real_server的mac地址)
条件:director和real_server同处一个网段内,为vip,同时,real_server有自己的对外ip
优势:减少网络吞吐量
缺点:会把后端的主机暴露出来
LVS/TUN模式:
工作流程:请求--> 前端分发器director--> director把请求转发给real_server--(隧道)--> real_server直接把数据返回给用户
优势:经过隧道之后数据加密
LVS/FULL模式:
这是一种比较新的工作模式,尚未了解,待补充
LVS的调度算法:轮叫调度(Round Robin)(简称rr)
加权轮叫(Weighted Round Robin)(简称wrr)
最少链接(least connection)(LC)
加权最少连接(Weighted Least Connections)(WLC)
其他算法参考拓展学习链接
Keepalived:
Keepalived是一个基于VRRP协议来实现的WEB服务的高可用方案
一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP)
MASTER会定期给BACKUP发送icmp包来确定MASTER是否挂掉,挂掉了就根据优先级顶替为MASTER
VRRP协议(虚拟路由冗余协议):
VRRP协议将局域网的一组路由器(包括一个Master 即活动路由器和若干个Backup 即备份路由器)组织成一个虚拟路由器,称之为一个备份组,这是一个逻辑概念,本身这个虚拟路由器并不存在。
虚拟路由器的IP地址可以和备份组内某个路由器接口的IP地址相同
局域网内的主机仅仅知道这个虚拟路由器的IP,而并不知道具体的Master路由器的IP以及Backup 的IP
局域网内的主机将自己的缺省路由下一跳地址设置为该虚拟路由器的IP
如果这个MASTER挂掉,那么就会根据选举策略选出另外一个MASTER
//////////////////////////负载均衡集群//////////////////////////////////
一、LVS/NAT配置
----这个需要依赖防火墙
三台服务器一台作为director,两台作为real server1
director有一个外网IP(192.168.31.166)和一个内网IP(192.168.21.166),两个real server上只有内网IP(192.168.21.100)和(192.168.21.101)并且需要把两个real server的内网网关设置为director的内网IP(192.168.21.166)
两个real server上都需要安装http (只是用来作为一个服务而已)
httpd: yum install -y httpd
director上安装ipvsadm :
yum install -y ipvsadm
director上
vim /usr/local/sbin/lvs_nat.sh //增加如下内容 #!/bin/bash #director服务器上开启路由转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward #关闭icmp的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects #director设置nat防火墙 iptables -t nat -F iptables -t nat -X(删除链) iptables -t nat -A POSTROUTING -s 192.168.21.0/24 -j MASQUERADE(伪装) #director 设置ipvsadm IPVSADM='/sbin/ipvsadm' $IPVSADM -C(也就相当于iptables -F) $IPVSADM -A(增加一个Dir) -t 192.168.31.166:80 -s lc -p 300 $IPVSADM -a(增加一个real server) -t 192.168.31.166:80 -r 192.168.21.100:80 -m -w 1 $IPVSADM -a -t 192.168.31.166:80 -r 192.168.21.101:80 -m -w 1 # 参数说明: # -s是算法 # -p是长链接 # -w 权重weight # -g 表示DR模式 # -m 表示NAT模式 # -t 表示TUN模式 # rr是轮询 (最常用) # wrr 加权轮询算法 (最常用) # wlc 加权最小链接 (最常用) # lc是不带权重的最小链接(最常用)
配置完毕后
直接运行这个脚本即可:
/bin/bash /usr/local/sbin/lvs_nat.sh
通过浏览器测试两台机器上的httpd的内容
也可以用curl 192.168.31.166 查看结果
二、LVS/DR配置
---其实DR比TUN好
DR实验需要三台机器:
director(eth0 192.168.31.166,vip eth0:0 192.168.31.110)
real server1 (eth0 rip :192.168.31.100,vip lo:0: 192.168.31.110)
real server2 (eth0 rip :192.168.31.101,vip lo:0: 192.168.31.110)
Director上:
vim /usr/local/sbin/lvs_dr.sh //增加如下: #!/bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip=192.168.31.110 rs1=192.168.31.100 rs2=192.168.31.101 ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up #上面的命令作用是创建一块虚拟网卡 route add -host $vip dev eth0:0 $ipv -C $ipv -A -t $vip:80 -s rr $ipv -a -t $vip:80 -r $rs1:80 -g -w 1 $ipv -a -t $vip:80 -r $rs2:80 -g -w 1
两台rs上:
vim /usr/local/sbin/lvs_dr_rs.sh #!/bin/bash vip=192.168.31.110 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip 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/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
配置完毕后,在director和real_server主机上执行脚本:
sh /usr/local/sbin/lvs_dr.sh
sh /usr/local/sbin/lvs_dr_rs.sh
三、LVS/DR+Keepalived配置
问题分析:
前面的lvs虽然已经配置成功了,也实现了负载均衡,但是我们测试的时候发现,当某台real server把httpd进程停掉,那么director照样会把请求转发过去,这样就造成了某些请求不正确
因此需要有一种机制用来检测real server的状态,这就是keepalived
他的作用除了可以检测rs状态外,还可以检测备用的director状态,换而言之keepalived可以实现ha集群的功能,当然了也需要一台备用的director。
备用的director也需要安装一下keepalived软件
特别说明:这篇文章的实验时按顺序做下来的,因此虽然我们前面已经配置过一些操作,但是下面我们使用keepalived操作和之前是有些冲突的,所以如果之前配置过DR,请先做如下操作:
在director上执行:
$ipv -C ifconfig eth0:0 down
安装keepalived
yum install -y keepalived
安装好后,编辑配置文件:
vim /etc/keepalived/keepalived.conf //加入如下内容: vrrp_instance VI_110{ #可以理解成全局配置 state MASTER #备用服务器上则改为BACKUP interface eth0 virtual_router_id 51 priority 100 #备用服务器上为90 advert_int 1 authentication{#这个是认证相关的 auth_type PASS auth_pass 1111 } virtual_ipaddress{ 192.168.0.110 } } virtual_server 192.168.31.110 80{ #配置这个虚拟路由器 delay_loop 6 #每隔6秒查询real server状态 lb_algo wlc #lvs算法 lb_kind DR #Direct Route persistence_timeout 60 #长链接,同一个IP的连接超过60秒会被分配到同一台real server上 protocol TCP #使用TCP协议检查realserver的状态 real_server 192.168.31.100 80{ weight 100 #权重 TCP_CHECK{ connect_timeout 10 #10秒无响应超时 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.31.101 80{ weight 100 #权重 TCP_CHECK{ connect_timeout 10 #10秒无响应超时 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
以上为MASTER的director的配置文件,
这个如果配置BACKUP的director
在director2里面安装keepalived
BACKUP的director的配置文件只需要修改
state MASTER -> state BACKUP
priority 100 -> priority 90
配置完keepalived后,需要开启端口转发功能(主从都要做):
echo 1 > /proc/sys/net/ipv4/ip_forward
然后,在两个rs上执行/usr/local/sbin/lvs_dr_rs.sh脚本
最后,两个director上启动keepalived服务(先主后从):
/etc/init.d/keepalived start
另外,需要注意的是,启动keepalived服务会自动生成vip和ipvsadm规则,不需要再去执行上面提到的/usr/local/sbin/lvs_dr.sh脚本
拓展学习:
如果要实现Keepalived的互为主从,可以参考:
http://anyisalin.blog.51cto.com/10917514/1762030
dr模式参考这篇文章:
http://os.51cto.com/art/201105/264303.htm
这篇文章介绍的还是挺详细的:
http://www.it165.net/admin/html/201401/2248.html
LVS的八种算法详解:
http://www.aminglinux.com/bbs/thread-7407-1-1.html
关于arp_ignore和arp_announce,参考:
http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
haproxy+keepalived实现高可用负载均衡(里面有讲到keepalived原理)
http://blog.csdn.net/xrt95050/article/details/40926255
nginx, lvs, keepalived比较 :
http://www.csdn.net/article/2014-07-24/2820837
http://www.my.oschina.net/hncsowc/blog/158746
www.linuxidc.com/Linux/2012-08/69383.htm