lvs搭建LB

一、LVS介绍

  • 中国人发明的

1、工作模式

1、nat模式

img

  • 网站服务器是私网的

2、DR模式

  • lvs服务器提供一个调度的功能

  • 客户端发送个lvs服务器,然后将请求分发给后台服务器

  • 然后后台服务器直接回应给客户端,不需要回复给lvs服务器了

  • 如果是nat模式的话,传送的太频繁了

  • 要求网站服务器也是公网ip

3、隧道模式

img

2、调度算法

二、LVS/nat模式集群搭建LB集群

img

  • 服务器是内网的

  • 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集群

img

1、lvsDR模式工作原理

  • 服务器回应的给客户端的时候,不需要经过lvs调度器,直接回复到客户端

  • 因此realserver 需要有vip,源ip直接转换为vip,发送到客户端

  • 但是因此会产生一个问题,就是三个机器上面都有vip地址,因此客户端在发送请求时,需要2个网站服务器的vip不接受,只有lvs接收请求即可

  • lvs只负责分发请求

  • 计算机的通信规则,访问的是100,回报的数据也的是100,如果是其他网段,不接收

  • 需要解决的问题

    • 让realserver 拥有vip地址

    • 让realserver 不响应客户端访问vip地址的arp广播包

  • 都是在同一个网段下的

2、实验前准备

img

# 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模式总结

img

  • 一般都是临时配置的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地址
  • 没有健康检查服务,就是停掉一个网站服务的话,分发请求仍然会发送到故障的服务器上面的

posted @ 2025-06-27 16:34  乔的港口  阅读(15)  评论(0)    收藏  举报