LVS集群简介

什么是集群

  • 通过网络将很多服务器集中在一起,提供同一种服务,在客户端看起来就好像只有一个服务器
  • 任务调度是集群系统中的核心技术

集群的目的

  • 提高性能

    如计算密集型应用,如:天气预报、核试验模拟

  • 降低成本

    相对百万美元级的超级计算机,价格便宜

  • 提高可扩展性

    只要增加集群节点即可

  • 增强可靠性

    多个节点完成相同功能,避免单点失败

集群分类

  • 高性能计算集群HPC

    通过以集群开发的并行应用程序,解决复杂的科学问题

  • 负载均衡集群LB

    客户端负载在计算机集群中尽可能平均分摊

  • 高可用集群HA

    避免单点故障,当一个系统发生故障时,可以快速迁移

LVS概述

  • Linux虚拟服务器(LVS)是章文嵩在国防科技大学就读博士期间创建的
  • LVS可以实现高可用的、可伸缩的Web、Mail、Cache和Media等网络服务
  • 最终目标是利用Linux操作系统和LVS集权软件实现一个高可用、高性能、低成本的服务器应用集群

LVS术语

  • Director Server:调度服务器

    将负载分发到Real Server的服务器

  • Real Server:真实服务器

    真正提供应用服务的服务器

  • VIP:虚拟IP地址

    公布给用户访问的虚拟IP地址

  • DIP:调度器连接节点服务器的IP地址

  • RIP:真实IP地址

    集群节点上使用的IP地址

LVS-NAT图示

1.png

  • LVS相当于路由器,需要配置网关

  • 不使用LVS时,会一层一层封装再解封装,效率很慢

LVS工作模式

2.png

  • VS/NAT

    通过网络地址转换实现的虚拟服务器

    大并发访问时,调度器的性能成为瓶颈

  • VS/DR

    直接使用路由技术实现虚拟服务器

    节点服务器需要配置VIP,注意MAC地址广播

  • VS/TUN

    通过隧道方式实现虚拟服务器

负载均衡调度算法

  • LVS目前实现10种调度算法

  • 常用的调度算法

    轮询(Round Robin)

    加权轮询(Weighted Round Robin)

    最少连接(Least Connections)

    加权最少连接(Weighted Least Connections)

    源地址哈希(Source Hash)

  • 其他调度算法

    基于局部性的最少连接

    带复制的基于局部性最少连接

    目标地址散列(Destination Hashing)

    最短的期望的延期

    最少队列调度

LVS-NAT模式

节点规划

节点 角色 IP地址
lvs LVS调度器 ens33:192.168.1.10
ens34:192.168.157.10
web1 Web服务器 ens34:192.168.1.21
web2 Web服务器 ens34:192.168.1.22

准备web服务器

  • web1部署web服务
1
2
3
4
5
6
[root@web1 ~]# yum install httpd -y
[root@web1 ~]# echo "192.168.1.22" > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
[root@web1 ~]# setenforce 0
[root@web1 ~]# iptables -F

  • web2部署web服务
1
2
3
4
5
6
[root@web2 ~]# yum install httpd -y
[root@web2 ~]# echo "192.168.1.22" > /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd
[root@web2 ~]# setenforce 0
[root@web2 ~]# iptables -F

安装ipvsadm软件包

  • 管理内核的工具
1
2
[root@lvs ~]# yum install ipvsadm -y

创建虚拟服务器

  • -A 添加虚拟服务器
  • -t/-u 设置集群地址(VIP、Virtual IP)tcp/udp
  • -s 指定负载调度算法(rr|wrr|lc|wlc|sh…)
1
2
3
4
5
6
7
8
[root@lvs ~]# ipvsadm -A -t 192.168.157.10:80 -s rr

#查看集群规则
[root@lvs ~]# 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.157.10:80 rr

添加real server

  • 添加、删除服务器节点

    -a 添加真实服务器

    -d 删除真实服务器

    -r 指定真实服务器(real Server)的地址

    -m 使用NAT模式

    -g 使用DR模式(默认)

    -i 使用TUN模式

    -w 为节点服务器设置权重,默认为1

1
2
3
4
5
6
7
8
9
10
11
[root@lvs ~]# ipvsadm -a -t 192.168.157.10:80 -r 192.168.1.21:80 -m
[root@lvs ~]# ipvsadm -a -t 192.168.157.10:80 -r 192.168.1.22:80 -m

#查看集群规则
[root@lvs ~]# 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.157.10:80 rr
-> 192.168.1.21:80 Masq 1 0 0
-> 192.168.1.22:80 Masq 1 0 0

开启路由转发

  • 开启路由
1
2
3
[root@lvs ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
  • 关闭防火墙和SElinux
1
2
[root@lvs ~]# iptables -F
[root@lvs ~]# setenforce 0

给后端web服务器配置网关

  • web1配置网关
1
2
3
[root@web1 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.gateway 192.168.1.10

[root@web1 ~]# nmcli connection up ens33
  • web2配置网关
1
2
3
[root@web2 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.gateway 192.168.1.10

[root@web2 ~]# nmcli connection up ens33

浏览器访问测试

  • 通过访问VIP 192.168.157.10
  • Ctrl+F5强制刷新
  • 可以看到在192.168.1.21和192.168.1.22之间切换

LVS-DR模式

3.png

(为方便使用1网段)

准备调度器网络环境

  • 配置VIP(同一网卡)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@lvs ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33{,:0}

[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
TYPE=Ethernet
PROXY_METHOD=none
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.1.15
PREFIX=24

[root@lvs ~]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7e:4b:70 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.1.15/24 brd 192.168.1.255 scope global secondary noprefixroute ens33:0
······

准备web服务器

  • web1部署web服务
1
2
3
4
5
6
[root@web1 ~]# yum install httpd -y
[root@web1 ~]# echo "192.168.1.22" > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
[root@web1 ~]# setenforce 0
[root@web1 ~]# iptables -F

  • web2部署web服务
1
2
3
4
5
6
[root@web2 ~]# yum install httpd -y
[root@web2 ~]# echo "192.168.1.22" > /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd
[root@web2 ~]# setenforce 0
[root@web2 ~]# iptables -F

准备web网络环境

  • web1和web2做相同操作,以web1 为例

  • 伪装VIP

1
2
3
4
5
6
7
8
9
10
11
[root@web1 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo{,:0}
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.1.15
NETMASK=255.255.255.255
NETWORK=192.168.1.15
BROADCAST=192.168.1.15
ONBOOT=yes
NAME=lo:0

  • 不要立刻重启网络服务,会产生地址冲突

  • 忽略地址冲突

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
[root@web1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
#当有arp广播问谁是192.168.1.15时,本机忽略该ARP广播,不做任何回应
#本机不要对外宣传自己的lo回环地址是192.168.1.15
[root@web1 ~]# sysctl -p
[root@web1 ~]# systemctl restart network

[root@web1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.21 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::8680:100b:c108:4594 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:da:8d:df txqueuelen 1000 (Ethernet)
RX packets 3596 bytes 374013 (365.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2763 bytes 380955 (372.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 122 bytes 20478 (19.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 122 bytes 20478 (19.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.1.15 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)

创建LVS-DR集群

安装ipvsadm软件包

  • 管理内核的工具
1
2
[root@lvs ~]# yum install ipvsadm -y

创建虚拟服务器

  • -A 添加虚拟服务器
  • -t/-u 设置集群地址(VIP、Virtual IP)tcp/udp
  • -s 指定负载调度算法(rr|wrr|lc|wlc|sh…)
1
2
3
4
5
6
7
8
#清空所有集群
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 192.168.1.15:80 -s rr
[root@lvs ~]# 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.1.15:80 rr

添加real server

  • 添加、删除服务器节点

    -a 添加真实服务器

    -d 删除真实服务器

    -r 指定真实服务器(real Server)的地址

    -m 使用NAT模式

    -g 使用DR模式(默认)

    -i 使用TUN模式

    -w 为节点服务器设置权重,默认为1

1
2
3
4
5
6
7
8
9
10
11
[root@lvs ~]# ipvsadm -a -t 192.168.1.15:80 -r 192.168.1.21:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.1.15:80 -r 192.168.1.22:80 -g

#查看集群规则
[root@lvs ~]# 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.1.15:80 rr
-> 192.168.1.21:80 Route 1 0 0
-> 192.168.1.22:80 Route 1 0 0

开启路由转发

  • 开启路由
1
2
3
[root@lvs ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
  • 关闭防火墙和SElinux
1
2
[root@lvs ~]# iptables -F
[root@lvs ~]# setenforce 0

浏览器访问测试

  • 通过访问VIP 192.168.1.15
  • Ctrl+F5强制刷新
  • 可以看到在192.168.1.21和192.168.1.22之间切换