拓扑:
说明:这里只是简单测试,所以都在同一个网段。Director和后端web服务器都需要配置VIP地址
一、Director主机配置
1、关闭防火墙和selinux
[root@director ~]# systemctl stop firewalld
[root@director ~]# systemctl disable firewalld
[root@director ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2、检查系统内核是否支持ipvs(只要IPVS transport protocol load balancing support都是y,说明ipvs已经支持在这些协议工作)2.4.26,2.6.4及以后的kernel版本内核已经默认支持IPVS
[root@director ~]# uname -r
3.10.0-957.el7.x86_64
[root@director ~]# grep -i "ipvs" -A 5 /boot/config-3.10.0-957.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
--
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
--
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
--
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8
#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PE_SIP=m
3、安装ipvsadm
[root@director ~]# yum install -y ipvsadm
4、Director地址配置
DIP地址:192.168.14.12(物理机IP,已经配置好)
VIP地址:192.168.14.210(临时生效,重启就没有了。永久生效就修改配置)
[root@director ~]# ifconfig ens32:0 192.168.14.210 netmask 255.255.255.255 broadcast 192.168.14.210 up
-bash: ifconfig: command not found
如果提示:ifconfig:command not found,安装net-tools即可
[root@director ~]# yum install -y net-tools
[root@director ~]# ifconfig ens32:0 192.168.14.210 netmask 255.255.255.255 broadcast 192.168.14.210 up
[root@director ~]# route add -host 192.168.14.210 dev ens32:0
5、调度策略配置:
添加一条新的虚拟服务
[root@director ~]# ipvsadm -A -t 192.168.14.210:80 -s rr
在一个虚拟服务中添加新的真实服务器(后端web服务器)
[root@director ~]# ipvsadm -a -t 192.168.14.210:80 -r 192.168.14.13 -g
[root@director ~]# ipvsadm -a -t 192.168.14.210:80 -r 192.168.14.27 -g
参数说明:
-A --add-service | 添加一条新的虚拟服务 |
-E --edit-service | 编辑虚拟服务 |
-D --delete-service | 删除虚拟服务 |
-C --clear | 清除所有的虚拟服务规则 |
-R --restore | 恢复虚拟服务规则 |
-a --add-server | 在一个虚拟服务中添加一个新的真实服务器 |
-e --edit-server | 编辑某个真实服务器 |
-d --delete-server | 删除某个真实服务器 |
-L | -l --list | 显示内核中的虚拟服务规则 |
-n --numeric | 以数字形式显示IP端口 |
-c --connection | 显示ipvs中目前存在的连接,也可以用于分析调度情况 |
-Z --zero | 将转发消息的统计清零 |
-p --persistent | 配置持久化时间 |
--set tcp tcpfin udp | 配置三个超时时间(tcp/tcpfin/udp) |
-t | -u | TCP/UDP协议的虚拟服务 |
-g | -m | -i | LVS模式为:DR | NAT | TUN |
-w | 配置真实服务器的权重 |
-s | 配置负载均衡算法,如:rr, wrr, lc等 |
--timeout | 显示配置的tcp/tcpfin/udp超时时间 |
--stats | 显示历史转发消息统计(累加值) |
--rate | 显示转发速率信息(瞬时值) |
6、打开转发功能
[root@director ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
或编辑配置文件修改,使它永久生效(dr模型中要改的几个参数也可以写在这个文件):
[root@director ~]#vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@director ~]#sysctl -p 让它立即生效
二、WEB1配置(方法1:修改配置永久生效)
1、关闭防火墙和selinux
[root@web1 ~]# systemctl stop firewalld
[root@web1 ~]# systemctl disable firewalld
[root@web1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2、配置内核参数
[root@web1 ~]# cd /proc/sys/net/ipv4/conf/
这里每个接口都有相应的目录,一般修改all和lo,all表示所有接口都生效,为了万无一失,所以把all也定义了
如果只需要临时生效:
[root@web1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web1 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web1 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@web1 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
如果需要永久生效,vim /etc/sysctl.conf添加:
[root@web1 conf]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
[root@web1 conf]#sysctl -p 让它立即生效
3、地址配置
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.14.210
NETMASK=255.255.255.255
BROADCAST=192.168.14.210
ONBOOT=yes
[root@web1 ~]# route add -host 192.168.14.210 dev lo:0
[root@web1 ~]# systemctl restart network
4、web服务配置
yum源
[root@web1 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=aliyun epel
baseurl=http://mirrors.aliyun.com/epel/7Server/x86_64/
gpgcheck=0
yum安装
[root@web1 ~]# yum install -y nginx
[root@web1 ~]# vim /usr/share/nginx/html/index.html
web1-server
[root@web1 ~]# systemctl start nginx
5、客户端测试访问(只能访问web1,web2还没配置)
[root@client ~]# curl http://192.168.14.210
web1-server
三、WEB2配置(可选方法2:脚本配置,临时生效,要手动启动)
1、关闭防火墙和selinux
[root@web2 ~]# systemctl stop firewalld
[root@web2 ~]# systemctl disable firewalld
[root@web2 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2、配置路由功能,关闭ARP查询功能并设置回环IP(此脚本用于节点服务器绑定 VIP ,并抑制响应 VIP 的 ARP 请求。这样做的目的是为了不让关于 VIP 的 ARP 广播时,节点服务器应答( 因为节点服务器都绑定了 VIP ,如果不做设置它们会应答,三台机器都有相同的VIP地址,就会出现IP冲突)
[root@web2 ~]# vim /etc/rc.d/init.d/realserver.sh
#!/bin/bash
SNS_VIP=192.168.14.210
# /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
添加执行权限并运行脚本(需要安装net-tools包,要不ifconfig命令无法执行)
[root@web2 ~]# cd /etc/rc.d/init.d/
[root@web2 init.d]# pwd
/etc/rc.d/init.d
[root@web2 init.d]# chmod u+x realserver.sh
[root@web2 init.d]# yum install -y net-tools
[root@web2 init.d]# ./realserver.sh start
RealServer Start OK
3、web服务器配置
yum源
[root@web2 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=aliyun epel
baseurl=http://mirrors.aliyun.com/epel/7Server/x86_64/
gpgcheck=0
安装
[root@web2 ~]# yum install -y nginx
[root@web2 ~]# vim /usr/share/nginx/html/index.html
web2-server
[root@web2 ~]# systemctl start nginx
四、client访问测试
1、访问192.168.14.210,可以看到是轮询访问
[root@client ~]# curl http://192.168.14.210
web1-server
[root@client ~]# curl http://192.168.14.210
web2-server
[root@client ~]# curl http://192.168.14.210
web1-server
五、设置长连接访问,需要修改服务器
1、在原来的配置上修改(-E是修改,-p表示长连接,单位为秒)
[root@director ~]# ipvsadm -E -t 192.168.14.210:80 -s rr -p 10
2、客户端访问,10秒内访问都会指向同一台后端web服务器
[root@client ~]# curl http://192.168.14.210
web1-server
[root@client ~]# curl http://192.168.14.210
web1-server
[root@client ~]# curl http://192.168.14.210
web1-server
3、服务器端查看连接状态
[root@director ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.14.210:80 rr persistent 10
-> 192.168.14.13:80 Route 1 0 0
-> 192.168.14.27:80 Route 1 0 5
LVS的八种调度算法
1. 轮叫调度 rr
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
2. 加权轮叫 wrr
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
3. 最少链接 lc
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
4. 加权最少链接 wlc
这个算法比 lc 多了一个权重的概念。
5. 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
6. 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
7. 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
8. 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
LVS的三种工作模式
NAT模式(VS-NAT):LVS将客户端发来的数据包的IP头的目的地址转换成其中一台RS(real server)的IP地址,由RS处理数据并返回给LVS,LVS再把数据包的源IP改为自己的IP,目的地址IP改为客户端的IP地址发送给客户端。
IP隧道模式(VS-TUN):将客户端发来的数据包封装一个新的目的IP头标记,通过IP隧道转发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后直接返回给客户端,不需要再经过LVS。
DR模式(VS-DR):客户端发送请求到VIP,LVS将请求报文的目标MAC地址改为RS的MAC地址,将请求转发给RS,而RS响应后的处理结果直接返回给客户端。