LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好.
LVS 负载均衡是将用户访问请求根据一定的转发策略分发到后端多台服务器 (支持物理机 / 虚机 / 容器等) 的流量分发控制服务。它采用 LVS(Linux Virtual Server) + keepalived 的方式实现,设置虚拟服务地址 (VIP),通过健康检查自动摘除不可用的服务器,从而提升应用的整体服务能力,增强应用的可用性。
使用 BGP+ECMP 的模式构建集群,用 ECMP 将数据包散列到集群中各个节点上,通过 BGP 协议保证单台机器故障后将这台机器的路由动态的剔除出去,由此做到了动态 failover。
lvs集群的类型:
lvs: ipvsadm/ipvs
ipvsadm:用户空间的命令行工具,规则管理器
用于管理集群服务及RealServer
ipvs:工作于内核空间netfilter的INPUT钩子上的框架
工作模式:
DR:直接路由,Direct Routing,采用半开放式的网络结构
NAT:地址转换,Network Address Translation,
TUN:隧道,IP Tunnel,采用开放式的网络结构
FULLNAT:
RIP:真实web服务器的IP
DIP:负载服务器的IP
VIP:负载服务器的虚拟IP
CIP:客户端主机的IP
lvs-nat模式
lvs-nat:
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑
出的RS的RIP和PORT实现转发
(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
LVS采用三层结构:调度器、服务器池、共享存储,结构如下图:
负载调度器(load balancer/Director):由一台或多台负载调度器组成,主要作用类似一个路由器,将用户请求分发给服务器池上的real server;
服务器池(server pool/Realserver):一组真正执行客户请求的服务器,执行的服务一般有WEB、MAIL、FTP和DNS等。
共享存储(shared storage):为服务器池提供一个共享的存储区,能使得服务器池拥有相同的内容,提供相同的服务。
LVS需要在内核的TCP/IP协议栈对数据流进行过滤筛选,这就需要有内核的模块来支持,而这样的过滤转发规则又是由用户进行定义的,我们可以认为LVS是两段式的架构,在内核空间中工作的是”ipvs”,而在用户空间中工作的,用来定义集群服务规则的是”ipvsadm”。
名称 | IP |
---|---|
DR | 192.168.159.135 |
RS1 | 192.168.159.132 |
RS2 | 192.168.159.136 |
[root@DR ~]# yum -y install ipvsadm net-tools
[root@DR ~]# ip addr add 192.168.159.135/32 dev ens33
[root@DR ~]# ip a
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:be:2f:65 brd ff:ff:ff:ff:ff:ff
inet 192.168.159.135/24 brd 192.168.159.255 scope global dynamic ens33
valid_lft 987sec preferred_lft 987sec
inet6 fe80::20c:29ff:febe:2f65/64 scope link
valid_lft forever preferred_lft forever
[root@DR ~]# ip addr add 192.168.159.200/32 dev lo
[root@DR ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.159.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:be:2f:65 brd ff:ff:ff:ff:ff:ff
inet 192.168.159.135/24 brd 192.168.159.255 scope global dynamic ens33
valid_lft 987sec preferred_lft 987sec
inet6 fe80::20c:29ff:febe:2f65/64 scope link
valid_lft forever preferred_lft forever
[root@DR ~]# ping 192.168.159.200 //看能不能拼通
PING 192.168.159.200 (192.168.159.200) 56(84) bytes of data.
64 bytes from 192.168.159.200: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from 192.168.159.200: icmp_seq=2 ttl=64 time=0.045 ms
64 bytes from 192.168.159.200: icmp_seq=3 ttl=64 time=0.044 ms
64 bytes from 192.168.159.200: icmp_seq=4 ttl=64 time=0.044 ms
[root@RS1 ~]# ip addr add 192.168.159.200/32 dev eno
[root@RS1 ~]# ip a
2: eno16777736: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:4a:7e:86 brd ff:ff:ff:ff:ff:ff
inet 192.168.159.132/24 brd 192.168.159.255 scope global dynamic eno16777736
valid_lft 1353sec preferred_lft 1353sec
inet6 fe80::20c:29ff:fe4a:7e86/64 scope link
valid_lft forever preferred_lft forever
[root@RS1 ~]# vim /etc/sysctl.conf
//添加下列内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# sysctl -p //读一下
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# ip addr add 192.168.159.200/32 dev lo
[root@RS1 ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.159.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:4a:7e:86 brd ff:ff:ff:ff:ff:ff
inet 192.168.159.132/24 brd 192.168.159.255 scope global dynamic eno16777736
valid_lft 1353sec preferred_lft 1353sec
inet6 fe80::20c:29ff:fe4a:7e86/64 scope link
valid_lft forever preferred_lft forever
[root@RS2 ~]# ip addr add 192.168.159.200/32 dev eno
[root@RS2 ~]# ip a
2: eno16777736: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:2e:bc:ec brd ff:ff:ff:ff:ff:ff
inet 192.168.159.136/24 brd 192.168.159.255 scope global dynamic eno16777736
valid_lft 1343sec preferred_lft 1343sec
inet6 fe80::20c:29ff:fe2e:bcec/64 scope link
valid_lft forever preferred_lft forever
[root@RS2 ~]# vim /etc/sysctl.conf
//添加下列内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# sysctl -p //读一下
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS2 ~]# ip addr add 192.168.159.200/32 dev lo
[root@RS2 ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.159.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft foreve preferred_lft forever
2: eno16777736: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:2e:bc:ec brd ff:ff:ff:ff:ff:ff
inet 192.168.159.136/24 brd 192.168.159.255 scope global dynamic eno16777736
valid_lft 1343sec preferred_lft 1343sec
inet6 fe80::20c:29ff:fe2e:bcec/64 scope link
valid_lft forever preferred_lft forever
[root@DR ~]# route add -host 192.168.159.200/32 dev lo
[root@DR ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.159.2 0.0.0.0 UG 100 0 0 ens33
192.168.159.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.159.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@RS1 ~]# route add -host 192.168.159.200/32 dev lo
[root@RS1 ~]#
[root@RS1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.159.2 0.0.0.0 UG 100 0 0 eno16777736
192.168.159.0 0.0.0.0 255.255.255.0 U 100 0 0 eno16777736
192.168.159.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@RS2 ~]# route add -host 192.168.159.200/32 dev lo
[root@RS2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.159.2 0.0.0.0 UG 100 0 0 eno16777736
192.168.159.0 0.0.0.0 255.255.255.0 U 100 0 0 eno16777736
192.168.159.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@DR ~]# ipvsadm -A -t 192.168.159.200:80 -s wrr
[root@DR ~]# ipvsadm -a -t 192.168.159.200:80 -r 192.168.159.132 -g
[root@DR ~]# ipvsadm -a -t 192.168.159.200:80 -r 192.168.159.136 -g
[root@DR ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@DR ~]# 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.159.200:80 wrr
-> 192.168.159.132:80 Route 1 0 0
-> 192.168.159.136:80 Route 1 0 0
[root@RS1 ~]# cd/var/www/html/
[root@RS1 html]# echo 'rs1' > index.html //添加首页
[root@RS1 ~]# yum -y install httpd //安装httpd
[root@RS1 ~]# systemctl start httpd //启动服务
[root@RS2 ~]# cd/var/www/html/
[root@RS2 html]# echo 'rs2' > index.html //添加首页
[root@RS2 ~]# yum -y install httpd //安装httpd
[root@RS2 ~]# systemctl start httpd //启动服务