LVS是Linux Virtual Server的简写,在1998年5月由章文嵩博士成立,工作在OSI模型的四层,基于IP进行负载均衡, 在linux2.2内核时,IPVS就已经以内核补丁的形式出现, 从2.4版本以后,IPVS已经成为linux官方标准内核的一部分。
系统必须有ip_vs模块
1 | #查看ip_vs模块 |
LVS的安装
yum安装
1 |
|
源码包安装
1 | #https://mirrors.edge.kernel.org/pub/linux/utils/kernel/ipvsadm/选择与内核相同版本的软件 |
ipvsadm命令详解
ipvsadm是ipvs的管理器,需要yum安装。
LVS 相关软件
程序包:ipvsadm Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm
ipvsadm 命令
ipvsadm核心功能:
1 | 1、集群服务管理:增、删、改 |
ipvsadm 工具用法:
1 | #管理集群服务 |
防火墙标记
FWM:FireWall Mark MARK target 可用于给特定的报文打标记 –set-mark value 其中:value 可为0xffff格式,表示十六进制数字 借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务 进行调度 实现方法: 在Director主机打标记:
1 | iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER |
范例:
1 | [root@lvs ~]#iptables -t mangle -A PREROUTING -d 172.16.0.100 -p tcp -m |
在Director主机基于标记定义集群服务:
1 | ipvsadm -A -f NUMBER [options] |
范例:
1 | [root@lvs ~]#ipvsadm -A -f 10 |
LVS 持久连接
session 绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现 持久连接( lvs persistence )
模板:实现无论使用任何调度算法,在一段时间内(默认360s ),能够实现将来自同一个地址的请求始终发往同一个RS
1 | ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] |
持久连接实现方式:
1 | 1、每端口持久(PPC):每个端口定义为一个集群服务,每集群服务单独调度 |
范例:
1 | [root@lvs ~]#ipvsadm -E -f 10 -p |
部署LVS NAT
LVS NAT模式注意事项
LVS NAT模式工作原理用户请求LVS VIP到达director(LVS服务器:LB)(公网VIP:211.1.1.1),director 将请求的报文的目标IP地址改成后端的real server IP地址,同时将报文的目标端口也改成后端选定的real server相应端口,最后将报文发送到real server,real server将数据返给director,director再把数据发送给用户。(两次请求都经过director, 所以访问大的话,director会成为瓶颈),
1 | 1)、LVS服务器至少2块物理网卡,一块连接公网(VIP),一块连接内网; |
实验环境
1 | DR: inode1:外网ip:10.0.0.101 内网ip:172.16.1.101 |
部署RS1和RS2的nginx
这里已经部署好了:
1 | [root@inode2 ~]# curl 172.16.1.102 |
将RS1和RS2的网关配置为DR的内网ip地址:172.16.1.101
1 | [root@inode2 ~]# sed -i '$aGATEWAY=172.16.1.101' /etc/sysconfig/network-scripts/ifcfg-eth1 |
部署NAT的LVS
第一步:安装LVS
1 | yum install -y ipvsadm |
第二步:把DR的外网ip:10.0.0.101作为VIP,加入lvs集群
1 | ipvsadm -A -t 10.0.0.101:80 -s rr |
第三步:在虚拟集群10.10.10.101中,加入后端Realserver服务器
1 | ipvsadm -a -t 10.0.0.101:80 -r 172.16.1.102 -m -w 50 |
查看LVS信息
1 | [root@inode1 ~]# ipvsadm -L -n |
第四步:LVS NAT模式能够实现数据转发,还要依靠Linux内核开启转发功能
1 | #临时生效 |
第五步:测试
在inode4上访问10.0.0.101
1 | [root@inode4 ~]# curl 10.0.0.101 |
在DR inode1上观察InAction发现是负载均衡
1 | [root@inode1 ~]# ipvsadm -Ln |
注意:
在实验模式NAT时,要关闭RS服务器上的外网网卡,否则会因为RS上有外网路由的问题,造成VIP地址无法访问后端页面
删除和添加RS
删除RS1(inode2)
1 | [root@inode1 ~]# ipvsadm -d -t 10.0.0.101:80 -r 172.16.1.102 |
继续在inode4上访问VIP
1 | [root@inode4 ~]# curl 10.0.0.101 |
RS1被删除后,客户端访问没有影响。
重新添加会RS1:
1 | [root@inode1 ~]# ipvsadm -a -t 10.0.0.101:80 -r 172.16.1.102 -m -w 50 |
inode4上访问VIP:
1 | [root@inode4 ~]# curl 10.0.0.101 |
lvs自动均衡到2台服务器上。
我们关闭RS1(inode2)上的nginx服务:
1 | [root@inode2 ~] |
继续使用inode4上访问:
1 | [root@inode4 ~]# curl 10.0.0.101 |
一个访问正常,一个访问报错,因为LVS只是前端调度的功能,没有健康检查(下一篇文章会加入Keepalive来解决这个问题)。
保存lvs规则
1 | [root@node1 ~]# ipvsadm -Sn > /tmp/ipvsadm |
清空lvs规则并重新导入
1 | #清空ipvsadm规程 |
部署单网段LVS DR
LVS DR模式注意事项
LVS DR模式工作原理 用户请求LVS VIP到达director(LB均衡器),director将请求的报文的目标MAC地址改成后端的real server MAC地址,目标IP为VIP(不变),源IP为用户IP地址(保持不变),然后Director将报文发送到real server,real server检测到目标IP为自己本地VIP,如果在同一个网段,然后将请求直接返给用户。如果用户跟 real server不在一个网段,则通过网关返回用户。
DR模式注意事项
1 | 1)LVS DR模式要求LVS和RS服务器同一个物理网段(二层网络); |
实验环境
1 | [root@inode1 ~]# uname -r |
router和client部署及LVS RS1 RS2的ip
Router部署
1 | echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf |
Client部署
1 | [root@node4 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 |
LVS (node1) ip
1 | [root@node1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 |
RS1 (node2) ip
1 | [root@node2 network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 |
RS2 (node3 )ip
1 | [root@node3 network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 |
部署RS1和RS2的nginx
这里已经部署好了:
1 | [root@inode2 ~]# curl 10.0.0.102 |
部署LVS
第一步:安装LVS
1 | yum install -y ipvsadm |
第二步:把10.0.0.111作为VIP,加入lvs集群
1 | ipvsadm -A -t 10.0.0.111 -s rr |
第三步:把RS1 inode2和RS2 inode3加入lvs集群
1 | ipvsadm -a -t 10.0.0.111:80 -r 10.0.0.102:80 -g -w 50 |
查看ipvsadm
1 | [root@node1 ~]# ipvsadm -Ln |
第四步:DR (inode1) 上绑定VIP地址
方法一:
1 | [root@node1 ~]# ifconfig eth0:0 10.0.0.111 netmask 255.255.255.255 broadcast 10.0.0.111 |
方法二:
1 | [root@node1 ~]# cd /etc/sysconfig/network-scripts/ |
第五步:RS1 (inode2)和RS2 (inode3)绑定VIP地址
方法一:
1 | [root@node2 ~]# ifconfig lo:0 10.0.0.111 netmask 255.255.255.255 broadcast 10.0.0.111 |
方法二:
1 | [root@node2 ~]# cd /etc/sysconfig/network-scripts/ |
第六步:在RS1 (inode2)和RS2 (inode3)上配置arp抑制
1 | [root@node2 ~]#echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore |
第七步:测试
在inode4上访问VIP
1 | [root@inode4 ~]# curl 10.0.0.111 |
部署多网段LVS DR
多网段LVS DR是vip与RIP不在同一个网段
1 | [root@inode1 ~]# uname -r |
router和client部署及LVS RS1 RS2的ip
Router部署
1 | [root@node5 network-scripts]#echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf |
Client部署
1 | [root@node4 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 |
LVS (node1) ip
1 | [root@node1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 |
RS1 (node2) ip
1 | [root@node2 network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 |
RS2( node3) ip
1 | [root@node3 network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 |
RS1和RS2部署nginx
这里已经部署好了:
1 | [root@inode2 ~]# curl 10.0.0.102 |
DR (inode1 )上绑定VIP地址
方法一:
1 | [root@inode1 ~]# ifconfig lo:1 192.168.1.100 netmask 255.255.255.255 broadcast 192.168.1.100 |
方法二:
1 | [root@inode1 ~]# cd /etc/sysconfig/network-scripts/ |
RS1 (inode2)和RS2 (inode3)上绑定VIP地址
方法一:
1 | [root@inode2 ~]# ifconfig lo:1 192.168.1.100 netmask 255.255.255.255 broadcast 192.168.1.100 |
方法二:
1 | [root@inode2 ~]# cd /etc/sysconfig/network-scripts/ |
RS1 (inode2)和RS2 (inode3)上配置arp抑制
1 | [root@inode2 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore |
在DR(inode1)上部署LVS
第一步:安装LVS
1 | [root@inode1 ~] |
第二步:把192.168.1.100作为VIP,加入lvs集群
1 | [root@inode1 ~]# ipvsadm -A -t 192.168.1.100 -s rr |
第三步:把RS1 inode2和RS2 inode3加入lvs集群
1 | [root@inode1 ~]# ipvsadm -a -t 192.168.1.100:80 -r 10.0.0.102:80 -g -w 50 |
查看ipvsadm
1 | [root@node1 ~]# ipvsadm -Ln |
测试
1 | [root@node4 ~]# curl 192.168.1.100 |
lvs_dr脚本
lvs_dr_vs.sh:
1 |
|
lvs_dr_rs:
1 |
|