概述
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能,工作在网络模型的7层。
IPVS:LVS 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。那么用户是如何配置 VIP 等相关信息并传递到 IPVS 呢,就需要用到了 ipvsadm 工具。
ipvsadm:ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能。它是基于 netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 netfilter,那么 ipvsadm 就是类似 iptables 工具的地位。
LVS 调度算法
- 轮询rr - 这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
- 加权轮询wrr - 这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多。实际生产环境的服务器配置可能不同,根据服务器配置适当设置权重,可以有效利用服务器资源。
- 最少连接lc - 这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
- 加权最少链接 wlc - 这个算法比 lc 多了一个权重的概念。
- 基于局部性的最少连接调度算法 lblc - 这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器。
- 复杂的基于局部性最少的连接算法 lblcr - 记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
- 目标地址散列调度算法 dh - 该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
- 源地址散列调度算法 sh - 与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
工具安装
yum install ipvsadm -y
ipvsadm参数
参数(短格式) | 参数(长格式) | 参数说明 |
-A | --add-service | 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。 |
-E | --edit-service | 编辑内核虚拟服务器表中的一条虚拟服务器记录。 |
-D | --delete-service | 删除内核虚拟服务器表中的一条虚拟服务器记录。 |
-C | --clear | 清除内核虚拟服务器表中的所有记录。 |
-R | --restore | 恢复虚拟服务器规则 |
-S | --save | 保存虚拟服务器规则,输出为-R 选项可读的格式 |
-a | --add-server | 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 |
-e | --edit-server | 编辑一条虚拟服务器记录中的某条真实服务器记录 |
-d | --delete-server | 删除一条虚拟服务器记录中的某条真实服务器记录 |
-L|-l | --list | 显示内核虚拟服务器表 |
-Z | --zero | 虚拟服务表计数器清零(清空当前的连接数量等) |
- | --set tcp tcpfin udp | 设置连接超时值 |
- | --start-daemon | 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。 |
- | --stop-daemon | 停止同步守护进程 |
-h | --help | 显示帮助信息 |
-t | --tcp-service service-address [vip:port] or [real-server-ip:port] | 说明虚拟服务器提供的是tcp 的服务 |
-u | --udp-service service-address [vip:port] or [real-server-ip:port] | 说明虚拟服务器提供的是udp 的服务 |
-f | --fwmark-service fwmark | 说明是经过iptables 标记过的服务类型。 |
-s | --scheduler scheduler | 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq默认的调度算法是: wlc |
-p | --persistent [timeout] | 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300秒。 |
-M | --netmask netmask | persistent granularity mask |
-r | --real-server server-address | 真实的服务器[Real-Server:port] |
-g | --gatewaying | 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式) |
-i | --ipip | 指定LVS 的工作模式为隧道模式 |
-m | --masquerading | 指定LVS 的工作模式为NAT 模式 |
-w | --weight weight | 真实服务器的权值 |
- | --mcast-interface | interface 指定组播的同步接口 |
-c | --connection | 显示LVS 目前的连接 如:ipvsadm -L -c |
- | --timeout | 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout |
- | --daemon | 显示同步守护进程状态 |
- | --stats | 显示统计信息 |
- | --rate | 显示速率信息 |
- | --sort | 对虚拟服务器和真实服务器排序输出 |
- | --numeric -n | 输出IP 地址和端口的数字形式 |
示例配置环境
lb-192.168.1.10
web01-192.168.1.11
web02-192.168.1.12
VIP-192.168.1.100
DR(直接路由)模式
通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。
DR技术可极大地提高集群系统的伸缩性。但要求调度器LB与真实服务器RS都有一块物理网卡连在同一物理网段上,即必须在同一局域网环境。
lb配置
ipvsadm -C #清楚原有规则
ipvsadm -A -t 192.168.1.100:80 -s rr #添加tcp服务
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g #添加web01服务器
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -g #添加web02服务器
ipvsadm -ln -t 192.168.1.100:80 #查看配置信息
web配置(网页显示内容应有些许不同,方便区分)
#配置lo
ifconfig lo:0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.0 up
#配置内核参数
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
测试(curl 192.168.1.100或者访问网页查看)
NAT 模式
通过网络地址转换,重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器,真实服务器的响应报文处理之后,返回时必须要通过调度器,经过调度器时报文的源地址被重写,再返回给客户,完成整个负载调度过程。
lb配置
echo 1 > /proc/sys/net/ipv4/ip_forward #配置允许转发
ipvsadm -C #清楚原有规则
ipvsadm -A -t 192.168.1.100:80 -s rr #添加tcp服务
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -m #添加web01服务器
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -m #添加web02服务器
ipvsadm -ln -t 192.168.1.100:80 #查看配置信息
web配置(网页显示内容应有些许不同,方便区分)
route add default gw 192.168.1.10 dev ens33 #配置默认网关
测试(curl 192.168.1.100或者访问网页查看)
Tunnel 模式
采用NAT技术时,由于请求和响应的报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈,为了解决这个问题,调度器把请求的报文通过IP隧道(相当于ipip或ipsec )转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户,这样调度器就只处理请求的入站报文。由于一般网络服务应答数据比请求报文大很多,采用 Tunnel技术后,集群系统的最大吞吐量可以提高10倍。
Tunnel工作流程,它的连接调度和管理与NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,连接数多少,动态地选择一台服务器,将原请求的报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的真实服务器;真实服务器收到报文后,先将收到的报文解封获得原来目标地址为VIP地址的报文, 服务器发现VIP地址被配置在本地的IP隧道设备上(此处要人为配置),所以就处理这个请求,然后根据路由表将响应报文直接返回给客户
lb配置
ipvsadm -C #清楚原有规则
ipvsadm -A -t 192.168.1.100:80 -s rr #添加tcp服务
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -i #添加web01服务
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -i #添加web02服务器
ipvsadm -ln -t 192.168.1.100:80 #查看配置信息
web配置(网页显示内容应有些许不同,方便区分)
modprobe ipip
ifconfig tunl0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.0 up
echo "0" > /proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
测试(curl 192.168.1.100或者访问网页查看)