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

lvs搭建LB的更多相关文章

  1. 用 LVS 搭建一个负载均衡集群(转)

    http://blog.jobbole.com/87503/ 第一篇:<如何生成每秒百万级别的 HTTP 请求?> 第二篇:<为最佳性能调优 Nginx> 第三篇:<用 ...

  2. Keepalived+lvs 搭建高可用负载均衡

    本站点停止更新,请访问:blog.coocap.com 不了解负载均衡高可用的童鞋,强烈建议先看keepalived+nginx高可用负载均衡: 传送门(求粉):http://www.cnblogs. ...

  3. LVS搭建负载均衡(二)DR模型

    应用场景:LVS配置负载均衡方式之一:dr 测试环境: 配置步骤: 1. 在主机lvs上安装ipvsadm ~]# yum install ipvsadm -y ~]# ipvsadm //启动:该命 ...

  4. LVS搭建负载均衡(一)NAT模型

    应用场景:LVS配置负载均衡方式之一:nat 测试环境: 测试步骤: 1. 在主机lvs上安装ipvsadm lvs~]# yum install ipvsadm -y lvs~]# ipvsadm ...

  5. CentOS 7 NAT模式LVS搭建

    NAT模式下 , 调度器需要有两个IP , 一个公网IP一个内网IP , web服务器只需要内网IP 调度器LB : 192.168.94.11(内网IP)  192.168.29.11 (仅主机模式 ...

  6. Linux系统LVS搭建笔记

    因为客户是国有企业,且一次性购买了14台服务器(16核),14台中暂且先用8台,其中LVS使用5台,NFS一台主要为了共享WEB系统(多台电脑的1.5T的硬盘容量浪费了).MySQL两台,Memcac ...

  7. 每秒处理3百万请求的Web集群搭建-用 LVS 搭建一个负载均衡集群

    这篇文章是<打造3百万次请求/秒的高性能服务器集群>系列的第3部分,有关于性能测试工具以及优化WEB服务器部分的内容请参看以前的文章. 本文基于你已经优化好服务器以及网络协议栈的基础之上, ...

  8. 160526、高并发之LVS搭建负载均衡

    LVS介绍: LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器.它是我们国家的章文嵩博士的一个开源项目.在linux内核2.6中,它已经成为内核的一部分,在此之前的内 ...

  9. LVS搭建负载均衡集群(一)——NAT模式

    (1).集群技术的分类 集群技术主要分为三大类:负载均衡(Load Balance)集群,简称LB集群:高可用(High Availability)集群,简称 HA 集群:高性能计算(High Per ...

  10. 高可用Keepalived+LVS搭建流程

    本流程搭建1个master,1个backup节点的Keepalived,使用lvs轮询2个节点的服务. 一.使用版本 CentOS 7.7 Keepalived 1.3.5 ipvsadm 1.27( ...

随机推荐

  1. 【代码审计】Emlog存在SQL注入+XSS漏洞

    1.源码简介 EMLOG 是一款轻量级开源博客和CMS建站系统,速度快.省资源.易上手,适合各种规模的站点搭建. 2.漏洞描述 EMLOG $keyword参数存在SQL注入漏洞. EMLOG art ...

  2. python-docx 设置表格边框

    # -*- coding: utf-8 -*- """ Created on Sat Oct 24 17:21:31 2020 pip install -i https: ...

  3. NOIP集训 P4137 Rmq Problem / mex 题解

    前置指使:可持久化线段树 题解:P4137 Rmq Problem / mex 有一个长度为 \(n\) 的数组 \(\{ a_1,a_2,...,a_n \}\) . \(m\) 次询问,每次询问一 ...

  4. [java与https]第一篇、证书杂谈

    一.算法.密钥(对).证书.证书库 令狐冲是个马场老板,这天,他接到店里伙计电话,说有人已经签了租马合同,准备到马场提马,,他二话不说,突突突就去了,到了之后,发现不认识租客. 令狐冲说,你把你租马合 ...

  5. js技术之“自定义包含方案”

    调用 // 用于判断包含 function diaoyong(arr, str){ // 初始化 var sizes = ['L','XL','S','M']; for (var i = 0; i & ...

  6. ARM终端 KylinOS 容器镜像导入排障

    背景信息 电脑:华为擎云L420 CPU:ARM架构,HUAWEI Kirin 9006C OS:Kylin桌面操作系统V10(SP1) Kernel:5.4.96 Docker: 27.5.1 已准 ...

  7. Grid 布局-子项补充及常用布局

    上篇我们介绍了 Grid 布局容器项的内容, 看上去属性很多, 其实并没有, 记住关键的概念和简写就行啦. 因为是二维的, 这个属性的数量就比 flex 要多很多哦, 但其实真正也没有常用那没多啦. ...

  8. 应用内存管理:Linux的应用与内存管理

    应用程序想要使用内存,必须得找操作系统申请,那就有必要先了解下Linux内核怎么管理内存的,然后再去分析应用程序的内存管理细节. 硬件架构 现代计算机体系结构被称为Non-Uniform Memory ...

  9. ODOO14里面qweb使用案例

    在ODOO里面中,通过QWeb来对模板进行渲染后加载到浏览器中,故作笔记以便于查询简介:Qweb被用作OpenERP的Web客户端模板引擎.它是一种基于XML的模板语言,同Genshi, Thymel ...

  10. WPF与WinForm的对比

    WPF与WinForm的对比 本文同时为b站WPF课程的笔记,相关示例代码 创建新项目 在vs2022中,这两者分别叫做WPF应用和Windows窗体应用. 渲染引擎和设计 WPF使用DirectX作 ...