lvs搭建LB
一、LVS介绍
- 中国人发明的
1、工作模式
1、nat模式

- 网站服务器是私网的
2、DR模式
-
lvs服务器提供一个调度的功能
-
客户端发送个lvs服务器,然后将请求分发给后台服务器
-
然后后台服务器直接回应给客户端,不需要回复给lvs服务器了
-
如果是nat模式的话,传送的太频繁了
-
要求网站服务器也是公网ip
3、隧道模式

2、调度算法
二、LVS/nat模式集群搭建LB集群

-
服务器是内网的
-
lvs服务器有多个网卡,一个连接着外网,一个连接着服务器
1、规划
-
vmware上面做的话,都是仅主机模式完成
-
2台网站服务器,一个lvs服务器2个网卡,一个客户端
192.168.200. 是公网
192.168.100. 是私网
# 客户端ip地址为 192.168.200.62
# lvs公网ip地址为192.168.200.80,私网ip地址为192.168.100.80
# 网站服务器ip地址为 192.168.100.61 192.168.100.63
- 网站服务器内网的数据,想要出去的话,就需也就是配置网关,192.168.100.80
2、网站服务器和客户端网关配置
# 2台机器都需要配置
[root@httpd-63 ~]# route add default gw 192.168.100.80
# 这样的话,2个内网服务器就可以访问到192.168.200.80这个ip了
# 就可以访问到lvs的公网ip了,但是访问不到客户端的公网ip
-
lvs服务器需要开启路由转发功能,充当路由器的角色
-
因此的话,客户端需要配置网关,就能访问192.168.100.80了
[root@client network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.200.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@client network-scripts]# route add default gw 192.168.200.80
[root@client network-scripts]# ping 192.168.100.80
PING 192.168.100.80 (192.168.100.80) 56(84) bytes of data.
64 bytes from 192.168.100.80: icmp_seq=1 ttl=64 time=1.05 ms
64 bytes from 192.168.100.80: icmp_seq=2 ttl=64 time=0.222 ms
# 这样客户端就能访问到lvs的内网ip了
[root@client network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.200.80 0.0.0.0 UG 0 0 0 ens33
192.168.200.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
-
客户端,发送不是本网段的数据包的时候,就会将数据包发送给192.168.200.80这个lvs机器
-
网站服务器也是一样的,不是本网段的数据包的话,就会发送到192.168.100.80这个lvs机器上面
-
但是了实现了上面的步骤后,还是客户端不能与网站服务器进行通信
-
因此,lvs服务器需要开启路由转发功能,传输2个不同网段的数据包的,启动内核模块
1、开启路lvs由转发功能
# 查看内核设置
[root@proxy ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 0 # 路由转发功能
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
[root@proxy ~]# vim /etc/sysctl.conf
kernel.sysrq=0
net.ipv4.ip_forward=1 # 改成1即可
[root@proxy ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
2、不同网段实现了通信
- 上面的情况,客户端可以不用配置网关,但是了,这样就不能实现通信了,但是后面配置了lvs配置后,依然可以访问到,因此用的是地址转换
[root@client /]# ping 192.168.100.61
PING 192.168.100.61 (192.168.100.61) 56(84) bytes of data.
64 bytes from 192.168.100.61: icmp_seq=1 ttl=63 time=0.914 ms
64 bytes from 192.168.100.61: icmp_seq=2 ttl=63 time=0.703 ms
[root@httpd-s61 ~]# ping 192.168.200.62
PING 192.168.200.62 (192.168.200.62) 56(84) bytes of data.
64 bytes from 192.168.200.62: icmp_seq=1 ttl=63 time=1.10 ms
64 bytes from 192.168.200.62: icmp_seq=2 ttl=63 time=0.519 ms
- 实验,一个nat模式的机器,2个仅主机模式的机器,然后配置网关,然后实现了仅主机模式上网,开启路由转发功能,dns服务器找nat模式
3、LVS的nat配置LB集群
- 访问192.168.200.80的时候,lvs将请求分发到61和632个机器上面
1、安装lvs软件
# lvs服务器安装ipvsadm软件
[root@proxy yum.repos.d]# yum -y install ipvsadm
# 显示当前的配置,L是列出,n是以数字显示地址和端口号
[root@proxy ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 因为是新安装的,什么都没有配置
2、配置lvs
# 添加一个虚拟服务
# -A 是添加一个虚拟服务
# -t是tcp协议
# 地址lvs的访问地址
# -s 是算法为轮询的
[root@proxy ~]# ipvsadm -A -t 192.168.200.80:80 -s rr
[root@proxy ~]# 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.200.80:80 rr
# 为这个虚拟服务配置网站服务器
# -m是地址伪装,也就是nat
# 这些都是临时写入的,重启电脑的话,这些会消失掉
[root@proxy ~]# ipvsadm -a -t 192.168.200.80:80 -r 192.168.100.61:80 -m
[root@proxy ~]# 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.200.80:80 rr
-> 192.168.100.61:80 Masq 1 0 0
# 添加真正的网站服务器
[root@proxy ~]# ipvsadm -a -t 192.168.200.80:80 -r 192.168.100.63:80 -m
[root@proxy ~]# 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.200.80:80 rr
-> 192.168.100.61:80 Masq 1 0 0
-> 192.168.100.63:80 Masq 1 0 0
3、客户端测试
[root@client /]# curl 192.168.200.80
192.168.200.63
[root@client /]# curl 192.168.200.80
61
[root@client /]# curl 192.168.200.80
192.168.200.63
[root@client /]# curl 192.168.200.80
61
# 在这个实验环境下,gw是必须要配置的,保证了几个设备之间能够互相通信
4、永久保存配置
-
上面的命令是临时保存,因此的话,重启就会消失
-
保存在/etc/sysconfig/ipvsadm里面
-
需要注意的是,需要做域名解析,否则的话,下次重启,ip地址就会变成主机名了
[root@ipvs100 ~]# ipvsadm-save
-A -t ipvs100:http -s rr
-a -t ipvs100:http -r 192.168.100.61:http -m -w 1
-a -t ipvs100:http -r 192.168.100.63:http -m -w 1
# 需要做一个域名解析,这样的话,重启系统的时候,就知道ipvs100对应的哪一个ip地址
[root@ipvs100 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.80 ipvs100
[root@ipvs100 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@ipvs100 ~]# cat /etc/sysconfig/ipvsadm
-A -t ipvs100:http -s rr
-a -t ipvs100:http -r 192.168.100.61:http -m -w 1
-a -t ipvs100:http -r 192.168.100.63:http -m -w 1
[root@ipvs100 ~]# systemctl enable ipvsadm
# 重启
reboot
# 查看策略
# 这样就永久保存了
[root@ipvs100 ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.200.80:80 -s rr
-a -t 192.168.200.80:80 -r 192.168.100.61:80 -m -w 1
-a -t 192.168.200.80:80 -r 192.168.100.63:80 -m -w 1
# 重启服务的时候就会将这个文件里面的内容加载进去
4、nat模式工作过程
# 首先客户端192.168.200.62(源地址) 请求192.168.200.80(目的地址)
# 然后目的地址通过地址转换为192.168.100.61或者192.168.100.63
# 网站服务器回应一个请求,192.168.100.61为源地址,目标地址为192.168.200.62,lvs调度器将源地址修改为自己的vip,也就是192.168.200.80,从而实现与客户端的通信
# 一定要明确目标ip地址和源ip地址
1、nat模式缺点
-
lvs调度器有瓶颈,因为客户端和服务器都需要经过lvs调度器
-
数据包的进入和出去都需要经过这个lvs调度器才行
-
解决方法是客户端经过lvs调度器,然后服务器直接回复到客户端,不需要金经过lvs调度器了,使用的就是DR模式
2、查看字节数
[root@ipvs100 /]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts I
-> RemoteAddress:Port
TCP 192.168.200.80:80 25 123 72
-> 192.168.100.61:80 12 69 44
-> 192.168.100.63:80 13 54 28
[root@ipvs100 /]#
# 进来的字节数是客户端访问lvs产生的
# 出去的字节数是服务器回报lvs产生的
# 因此会收到这个调度器影响
三、lvs集群管理命令
1、修改调度算法
[root@ipvs100 sysconfig]# ipvsadm -E -t 192.168.200.80:80 -s wrr
2、清空所有策略
ipvsadm -C
# 然后保存才行,否则重启还是存在策略
ipvsadm-save > /etc/sysconfig/ipvsadm
3、删除一个虚拟服务
[root@ipvs100 sysconfig]# ipvsadm -D -t 192.168.200.80:80
4、删除一个realserver
# -d是删除realserver
# -t 是tcp协议
# 192.168.200.80:80 是虚拟服务
# -r 是轮询算法
# 192.168.100.61 是realserver
[root@ipvs100 sysconfig]# ipvsadm -d -t 192.168.200.80:80 -r 192.168.100.61\
[root@ipvs100 sysconfig]# 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.200.80:80 rr
-> 192.168.100.63:80 Masq 1 0 0
6、修改权重值
# -e 修改后端服务器的权重值
[root@ipvs100 sysconfig]# ipvsadm -e -t 192.168.200.80:80 -r 192.168.100.61 -m -w 3
四、lvs的DR模式搭建LB集群

1、lvsDR模式工作原理
-
服务器回应的给客户端的时候,不需要经过lvs调度器,直接回复到客户端
-
因此realserver 需要有vip,源ip直接转换为vip,发送到客户端
-
但是因此会产生一个问题,就是三个机器上面都有vip地址,因此客户端在发送请求时,需要2个网站服务器的vip不接受,只有lvs接收请求即可
-
lvs只负责分发请求
-
计算机的通信规则,访问的是100,回报的数据也的是100,如果是其他网段,不接收
-
需要解决的问题
-
让realserver 拥有vip地址
-
让realserver 不响应客户端访问vip地址的arp广播包
-
-
都是在同一个网段下的
2、实验前准备

# 2台网站服务器 100.61 100.63
# 一台lvs服务器 100.80 100.88
# 一台server端 100.62
# 都是在同一个网段下面的
# 因此的话lvs上面只需要一张网卡
# vip地址为192.168.100.88
# 防火墙和selinux都需要关掉
3、操作
- 解析
vip的问题
回包的时候需要vip地址
lo接口配置vip的问题
lo接口无法与客户端进行通信,因此的话,需要修改内核参数
# 因为lvs的DR工作模式为服务器直接返回给客户端,不需要通过lvs服务器
# 因此的话,就需要在server上面配置vip,但是配置了vip的话,就有3台机器能接受请求
# 因此vip配置在lo接口上面,就不会接收客户端访问vip的请求了
# 但是配置在lo接口上面,就无法与客户端进行通信了
# 因此开启内核模块 2 ,允许server上面的物理网卡帮lo转换到客户端,实现通信
# 内核 1 也解决了客户端访问vip地址时,需要的是访问的ip地址是本接口的真实ip地址,因此server上面的物理网卡不会帮lo接口接收客户端访问vip请求,因为地址不一样,vip地址与server上面的物理网卡地址不一样
# server上面的物理网卡地址帮lo进行收发流量,但是 内核 1 限制了访问vip的时候,地址需要一样
# 这样就实现了要求,既有server上面有vip地址,但是不会接受到客户端发送给vip的请求,然后server能通过物理网卡帮lo实现转发流量到客户端了
1、绑定vip地址和开启内核
[root@ipvs100 ~]# ifconfig ens36:1 192.168.100.88/32
[root@ipvs100 ~]# ifconfig ens36:1
ens36:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.88 netmask 0.0.0.0 broadcast 255.255.255.255
ether 00:0c:29:31:ee:e2 txqueuelen 1000 (Ethernet)
# 临时添加,重启失效
# server绑定vip
[root@httpd-63 /]# ifconfig lo:1 192.168.100.88/32
# 但是配置在lo接口上的话,还是无法与客户端上面的物理网卡进行通信
# 因此server上面可以让ens160帮忙转发lo接口的流量
# 修改内核参数
[root@httpd-61 conf]# pwd
/proc/sys/net/ipv4/conf
# 1就是目标ip在本接口上才能接收
# 2就是ens160帮lo接口收发流量
# 只有1和2协同工作才能实现,访问vip的时候,server上面的物理网卡不会帮lo接口收到流量,只有lvs服务器的物理接口才能收到这个流量
# server直接通过lo接口转发到自己物理网卡发送到客户端上面,实现了通信
# 因此lo接口只能与自己进行通信,不能与其他主机的物理网卡进行通信,但是有了2这个功能,自己的物理网卡能帮忙lo进行接收和转发流量
# 但同时开启了1接口,就保证了客户端访问vip的时候,不会被lo接口接收到
[root@httpd-61 conf]# ls
all default ens33 lo
[root@httpd-61 conf]# echo 1 > lo/arp_ignore
[root@httpd-61 conf]# echo 1 > all/arp_ignore
[root@httpd-61 conf]# echo 2 > lo/arp_announce
[root@httpd-61 conf]# echo 2 > all/arp_announce
2、ipvsadm配置
[root@ipvs100 ~]# ipvsadm -A -t 192.168.100.88:80 -s rr
[root@ipvs100 ~]# 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.100.88:80 rr
# 创建server
# -g是路由模式,默认是nat模式
[root@ipvs100 ~]# ipvsadm -a -t 192.168.100.88:80 -r 192.168.100.61:80 -g
[root@ipvs100 ~]# ipvsadm -a -t 192.168.100.88:80 -r 192.168.100.63:80 -g
[root@ipvs100 ~]# 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.100.88:80 rr
-> 192.168.100.61:80 Route 1 0 0
-> 192.168.100.63:80 Route 1 0 0
# 这样就配置好了
3、永久保存配置一样的操作
3、客户端测试
[root@client ~]# curl 192.168.100.88
192.168.200.63
[root@client ~]# curl 192.168.100.88
61
# 出去的包没有,只有进来的包
# 进来的包客户端请求lvs服务器
# 回来的包直接到客户端,没有到lvs服务器
# 因此的话,lvs只进行了分发
[root@ipvs100 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.100.88:80 14 84 0 5572 0
-> 192.168.100.61:80 7 42 0 2786 0
-> 192.168.100.63:80 7 42 0 2786 0
4、lvs的DR模式总结

-
一般都是临时配置的vip,不会单独有一个物理网卡来配置vip
-
客户端发送请求到lvs服务器vip,然后进行调度算法到真实的服务器上面
-
真实的服务器接收到数据后,通过自己的vip地址直接发送给客户端,而不是通过lvs服务器回复的
-
这样的话,减少了数据包的传输路径,提高了性能
-
真实的服务器通过vip地址来回复客户端
客户端地址 192.168.100.81
lvs的vip地址 192.168.100.80 DIP 地址 192.168.100.88
server的地址 192.168.100.61 62
# 客户端发送一个请求到lvs的vip上面,此时源地址为 81 目标地址为 80
# lvs通过调度算法将目标地址mac改为 61或者62,目标ip地址不变(vip)
# 然后通过dip接口出去访问到真实的服务器上面,而不是从vip接口出去(从这里面出去,目标mac就是vip,而不是真实的服务器)
# 到达了真实的服务器后,发现目标ip为自己的本地的vip,因此响应为,源地址为vip,目标地址为客户端地址,客户端的地址一直没有变化
# 变化的只是mac地址
-
没有健康检查服务,就是停掉一个网站服务的话,分发请求仍然会发送到故障的服务器上面的

浙公网安备 33010602011771号