LVS四层负载均衡

一、介绍

LVS (Linux Virtual Server) 是一个高性能、高可用的Linux虚拟服务器集群系统,能通过IP负载均衡将用户的请求分发到后端的多个真实服务器上。

1.1 基本概念

  • 虚拟IP(VIP),会通过此IP地址进行负载均衡。
  • 真实服务器(Real Server),真正提供服务的后端服务器。
  • LVS调度器(Director),请求入口,并且对后端做负载均衡。
  • 客户端(Client)请求的发送者。

1.2 主要模式

1.2.1 NAT(Network Address Translation)

访问过程:

​ 请求过程:调度器修改目标ip地址

    1. 客户端(Client) 发送请求到 LVS调度器(Director),Client IP —>> Virtual IP
    1. LVS调度器(Director)转发请求到后端的真实服务器(Real Server),Client IP —>> Real IP

    响应过程:调度器修改源ip地址

    1. 真实服务器(Real Server)发送相应给LVS调度器(Director),Real IP—>> Client IP
    1. LVS调度器(Director)转发响应给客户端,Virtual IP—>> Client IP

LVS调度器(Director)修改、转发双向的数据流,容易成为性能瓶颈。

lvs-nat

1.2.2 DR(Direct Routing)

LVS调度器(Director)配置 VIP 到对外网卡

真实服务器(Real Server)配置 VIP 到 lo网卡,并禁用arp响应

访问过程:

​ 请求过程:调度器修改目标mac地址

    1. 客户端(Client) 发送请求到 LVS调度器(Director)Client IP—>>VIP IP
    1. LVS调度器(Director)转发请求到后端的真实服务器(Real Server),Director MAC —>> Real MAC

    响应过程:真实服务器直接响应给客户端

    1. 真实服务器(Real Server)发送相应给LVS调度器(Director),VIP IP—>> Client IP

LVS调度器(Director)无需处理响应流量,性能高。调度器和真实服务器必须处于同一局域网。

lvs-dr

1.2.3 TUN(Tunnel)

LVS调度器(Director)转发请求时会嵌套一层IP报文。

真实服务器(Real Server)解封装IP报文后,发现还有一层,也会直接响应。

访问过程:

​ 请求过程:调度器修改目标mac地址

    1. 客户端(Client) 发送请求到 LVS调度器(Director)Client IP—>>VIP IP
    1. LVS调度器(Director)转发请求到后端的真实服务器(Real Server),

      • Director IP—>> Real IP

      • 里面嵌套一层 Client IP—>>VIP IP

    响应过程:真实服务器直接响应给客户端

    1. 真实服务器(Real Server)发送相应给LVS调度器(Director),VIP IP—>> Client IP

LVS调度器(Director)无需处理响应流量,性能高。调度器和真实服务器可以跨机房。但封装解封装带来额外开销。

lvs-tun

二、DR使用

2.1 规划

主机名 ip 用途
lvs-director 192.168.10.101 lvs调度器
rs02 192.168.10.102 真实服务器2
rs03 192.168.10.103 真实服务器3
rs04 192.168.10.104 真实服务器4
192.168.10.100 虚拟ip
1
2
3
4
5
6
cat >> /etc/hosts << EOF
192.168.10.101 lvs-director
192.168.10.102 rs02
192.168.10.103 rs03
192.168.10.104 rs04
EOF

2.2 LVS调度器

  1. 安装
1
yum install ipvsadm -y
  1. Linux系统添加虚拟ip
    永久添加
1
2
nmcli connection modify ens33 +ipv4.addresses 192.168.10.100/32
nmcli connection up ens33

​ 临时添加

1
ip addr add dev ens33 192.168.10.100/32
  1. LVS调度器添加虚拟ip
1
ipvsadm -A -t 192.168.10.100:80 -s rr
  1. LVS调度器添加后端真实服务器
1
2
3
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.102 -g
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.103 -g
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.104 -g

2.3 真实服务器

  1. 安装 nginx ,并配置不同的页面
1
vim /etc/yum.repos.d/nginx.repo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=https://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
1
sudo yum install nginx
1
echo "${HOSTNAME} $(hostname -I)" > /usr/share/nginx/html/index.html
  1. 系统添加虚拟ip地址
    注意:需要在 lo 网卡添加
1
ip addr add dev lo 192.168.10.100/32
  1. 禁用arp响应
1
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
  1. 匹配精确ip地址回包
1
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

2.4 验证

额外的机器上测试,

1
curl 192.168.10.100

2.5 命令汇总

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录
-t #表示为tcp服务
-u #表示为udp服务
-s --scheduler #使用的调度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默认调度算法是 wlc
例:ipvsadm -A -t 192.168.1.2:80 -s wrr

-a --add-server #在服务器表中添加一条新的真实主机记录
-t --tcp-service #说明虚拟服务器提供tcp服务
-u --udp-service #说明虚拟服务器提供udp服务
-r --real-server #真实服务器地址
-m --masquerading #指定LVS工作模式为NAT模式
-w --weight #真实服务器的权值
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-i --ip #指定LVS的工作模式为隧道模式
-p #会话保持时间,定义流量呗转到同一个realserver的会话存留时间
例:ipvsadm -a -t 192.168.1.2:80 -r 192.168.2.10:80 -m -w 1

-E -edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D -delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。
-C -clear #清除内核虚拟服务器表中的所有记录。
-R -restore #恢复虚拟服务器规则
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
-e -edit-server #编辑一条虚拟服务器记录中的某条真实服务器记录
-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list #显示内核虚拟服务器表

--numeric, -n:#以数字形式输出地址和端口号
--exact: #扩展信息,精确值
--connection,-c: #当前IPVS连接输出
--stats: #统计信息
--rate : #输出速率信息

参数也可以从/proc/net/ip_vs*映射文件中查看
-Z –zero #虚拟服务表计数器清零(清空当前的连接数量等)

三、参考文章