一、LVS的组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,
定义谁是集群服务,而谁是后端真实的服务器(Real Server)
其实LVS的本身跟iptables很相似,而且连命令的使用格式都很相似,
其实LVS是根据iptables的框架开发的,那么LVS的本身分成了两个部分:
第一部分:是工作在内核空间的一个IPVS的模块,其实LVS的功能都是IPVS模块实现的,
第二部分:是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm,
这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块
二、ipvsadm命令主要格式:
设置虚拟地址并指定调度算法
ipvsadm -A -t 10.0.0.1:80 -s rr
添加真实服务器,指定工作传输模式为NAT 和各个权重
三种工作模式、十种调度算法
--scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
the default scheduler is wlc.
--persistent -p [timeout] persistent service
--netmask -M netmask persistent granularity mask
--real-server -r server-address server-address is host (and port)
--gatewaying -g gatewaying (direct routing) (default)
--ipip -i ipip encapsulation (tunneling)
--masquerading -m masquerading (NAT)
--weight -w weight capacity of real server
--u-threshold -x uthreshold upper threshold of connections
三、LVS相关术语
1. DS:Director Server。指的是前端负载均衡器节点。
2. RS:Real Server。后端真实的工作服务器。
3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
5. RIP:Real Server IP,后端服务器的IP地址。
6. CIP:Client IP,访问客户端的IP地址。
各角色服务器ip如下
虚拟ip地址 10.0.0.1
DS Director Server调度服务器地址 10.0.0.11 10.0.0.12
RS Real Server 真实服务器地址 10.0.0.21 10.0.0.22
四、LVS/NAT 部署配置原理
重点理解NAT方式的实现原理和数据包的改变。
启动Linux的路由转发功能,在NAT模式下此操作是必须的
# cat /proc/sys/net/ipv4/ip_forward #查看Linux是否开启路由转发功能 0 # echo 1 > /proc/sys/net/ipv4/ip_forward #启动Linux的路由转发功能 # cat /proc/sys/net/ipv4/ip_forward 1
添加地址为10.0.0.1:80的虚拟服务,指定调度算法为轮转。
ipvsadm -A -t 10.0.0.1:80 -s rr
ipvsadm -a -t 10.0.0.1:80 -r 10.0.0.21:80 -m
2.在 real server 上配置
设置RS的网关为 DSIP地址
五、LVS/DR 部署配置原理
重将请求报文的目标MAC地址设定为挑选出的RS的MAC地址
关键点
1:Director 上需要配置 VIP 、ipvsadm
2:Real Server 需要关闭ARP协议 同时 要配置VIP
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 这条是可以不用的,因为arp对逻辑接口没有意义,但大多数教程都加上了
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 这条是可以不用的,因为arp对逻辑接口没有意义,但大多数教程都加上了
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
如果你的RS的外部网络接口是eth0,其实真正要执行的是:
echo "1">/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/eth0/arp_announce
所以我个人建议把上面两条all的也加到你的脚本里去,因为万一系统里上面两条默认的值不是0,那有可能是会出问题滴。
sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效。
1 只响应目的IP地址为接收网卡上的本地地址的arp请求。
arp_announce的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址。
sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效。
在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,
因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户
real server 的物理网卡收到数据帧之后:拆开看到目的地址是VIP
查找路由表,自己的lo上绑着VIP,说明这个包是自己需要处理的,就把这个活接了。
产生响应报文
real server返回给客户端的数据帧,源mac是real server物理网卡的mac,里面的源IP地址是VIP
客户端收到数据帧之后,看到目的mac和目的IP都是自己,就会接收。并不会去检查源mac
vip一定要绑定在lo网卡上,子网掩码 一定要是 四个255
或者
ip addr add 10.0.0.1/32 dev lo
3.在DS上设置
ifconfig eth0:0 down
ifconfig eth0:0 10.0.0.1 broadcast 10.0.0.1 netmask 255.255.255.255 up
或者使用这个命令
ip addr add 10.0.0.1/24 dev eth0
route add -host 10.0.0.1 dev eth0:0 lvs/dr里,director的vip的netmask 没必要设置为255.255.255.255,也不需要再去 route add -host $VIP dev eth0:0
查看记录和规则:
# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.1:http rr
-> 10.0.0.21:http Route 1 0 0
-> 10.0.0.22:http Route 1 0 0
六、LVS/Tun 部署配置原理
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IIP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
配置LVS服务器
##TUM模式必须添加VIP。
##给LVS服务器添加VIP
ifconfig eth0:0 10.0.0.1 netmask 255.255.255.255 broadcast 10.0.0.1 up
##添加转发规则
ipvsadm -A -t 10.0.0.1::80 -s rr
ipvsadm -a -t 10.0.0.1::80 -r 10.0.0.21 -i
ipvsadm -a -t 10.0.0.1::80 -r 10.0.0.22 -i
@配置真实服务器
建立一个脚本lvs_tun_real.sh
./lvs_tun_real.sh start 运行脚本
./lvs_tun_real.sh stop 停止脚本
#!/bin/bash
#description : start realserver
VIP=10.0.0.1
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
modprobe ipip
/sbin/ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
;;
stop)
/sbin/ifconfig tunl0 down
echo "close LVS Directorserver"
echo "0" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
七、真实环境配置脚本
vip 10.0.0.90
Director server ip 10.0.0.54
Real server 10.0.0.56 10.0.0.57
1.DR模式
D_server 上配置
# ip addr add 10.0.0.90/24 dev ens32
# ipvsadm -A -t 10.0.0.90:80 -s rr
# ipvsadm -a -t 10.0.0.90:80 -r 10.0.0.56 -g
# ipvsadm -a -t 10.0.0.90:80 -r 10.0.0.57 -g
# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.90:http rr
-> 10.0.0.56:http Route 1 0 0
-> 10.0.0.57:http Route 1 0 0
Real server 10.0.0.56上配置
# ip addr add 10.0.0.90/32 dev lo
# echo 1 > /proc/sys/net/ipv4/conf/ens32/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/ens32/arp_announce
Real server 10.0.0.57上配置
# ip addr add 10.0.0.90/32 dev lo
# echo 1 > /proc/sys/net/ipv4/conf/ens32/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/ens32/arp_announce