LVS(Linux virtual server)

发布于:2025-07-18 ⋅ 阅读:(18) ⋅ 点赞:(0)

一.集群与分布式简介

1.1集群

Cluster:集群是为了解决某个特定问题将多台计算机组合起来形成的单个系统

cluster常见的三个类型:

LB HA HPC

集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能每有差别,数据和代码都一样

1.2分布式

分布式存储:Ceph,GlusterFs,FastDFS,MogileFs

分布式计算:hadoop,Spark

分布式:一个业务拆成多个子业务,或者本身就是不同业务,部署在多台服务器上。分布式中,每一台服务器实现的功能都是有差别的,数据与代码也不一样,分布式每台服务器功能加起来,才是完整业务

二.LVS

2.1LVS概念

VS:Virtual Server

RS:Real Server

CIP:Client IP

VIP: Virtual serve IP VS外网的IP

DIP: Director IP VS内网的IP

RIP: Real server IP

访问流程:CIP<-->VIP == DIP<-->RIP

2.2lvs集群的类型

lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT

本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发 RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈 支持端口映射,可修改请求报文的目标PORT VS必须是Linux系统,RS可以是任意OS系统

lvs-dr: 操纵封装新的MAC地址

DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变

lvs-tun: 在原请求IP报文之外新加一个IP首部

lvs-fullnat: 修改请求报文的源和目标IP

2.3lvs集群中的增删改

2.3.1管理集群服务中的增删改

-A #添加

-E #修改

-t #tcp服务

-u #udp服务

-s #指定调度算法,默认为WLC

-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver

-f #firewall mask 火墙标记 一个数字

2.3.2管理集群中RealServer的曾增删改

-a #添加realserverNAT

-e #更改realserver

-t #tcp协议

-u #udp协议

-f #火墙 标签

-r #realserver地址

-g #直连路由模式

-i #ipip隧道模式

-m #nat模式

-w #设定权重

-Z #清空计数器

-D #删除某条lvs策略

-C #清空lvs策略

-L #查看lvs策略

-n #不做解析

--rate :输出速率信息

三.LVS-NAT模式

以rhel9为例:

3.1环境配置:

LVS:ip:172.25.254.100 192.168.0.100

RS1:ip:192.168.0.101 GW:192.168.0.100

RS2:ip:192.168.0.102 GW:192.168.0.100

CS:ip:172.25.254.104 

3.1.1关闭所有虚拟机的防火墙与selinux

systemctl disable --now firewalld


setenforce = 0

3.1.2在RS1与RS2中部署httpd

RS1:

ip地址:192.168.0.101 GW:192.168.0.100

dnf install httpd -y

echo webserver1 192.168.0.101 > /var/www/hrml/index.html

systemctl enable --now httpd

RS2:

ip地址:192.168.0.102 GW:192.168.0.100

dnf install httpd -y

echo webserver2 192.168.0.102 > /var/www/html/index.html

systemctl enable --now httpd

3.1.3LVS打开内核路由功能

vim /etc/sysctl.conf
    net.ipv4.ip_forward=1

测试httpd服务在LVS上:

3.2LVS配置:

3.2.1下载LVS软件(ipvsadm)

dnf install ipvsadm

3.2.2在LVS添加调度策略:

ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.102:80 -m

查看策略:

3.3测试

3.3.1客户机测试:

3.3.2修改为权重调用算法:

ipvsadm -E -t 172.25.254.100:80 -s wrr
ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.101:80 -m -w 2
ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.102:80 -m -w 1

查看策略:

测试:

四.LVS-DR模式

4.1环境配置:

以rhel9为例:

五台虚拟机:

关闭所有虚拟机的防火墙:

systemctl disable --now firewalld

4.1.1ip如下:

4.1.2在LVS,RS1,RS2中为lo添加ip地址(操作相同)

vim /etc/NetworkManger/system-connections/lo.nmconnection
    [connection]
    id = lo
    type = loopback
    interface-name = lo

    [ipv4]
    method = manual
    address1 = 127.0.0.1/8
    address2 = 192.168.0.100/32
nmcli connection reload
nmcli connection up lo

4.1.3解决RS1与RS2的响应问题:

R1与R2操作相同

echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf
echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf
echo net.ipv4.conf.lo.arp_ignore = 1 >> /etc/sysctl.conf
sysctl -p

4.2DR配置:

在DR-LVS中布置策略:

ipvsadm -A -t 192.168.0.100:80 -wrr
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.101:80 -g
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.102:80 -g


#查看策略
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.0.100:80 wrr
  -> 192.168.0.101:80             Route   1      0          0         
  -> 192.168.0.102:80             Route   1      0          0  

4.3测试:

五.防火墙标签解决轮询错误:

5.1轮询规则中可能会遇到的错误

以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题
当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上

以LVS-DR为例:

在RS1与RS2中安装mod_ssl并重启apache

dnf install mod_ssl -y
systemctl restart httpd

更改并添加DR-LVS中的策略:

[root@DR-lvs ~]# ipvsadm -E -t 192.168.0.100:80 -s rr
[root@DR-lvs ~]# ipvsadm -e -t 192.168.0.100:80 -r 192.168.0.101:80 -g
[root@DR-lvs ~]# ipvsadm -e -t 192.168.0.100:80 -r 192.168.0.102:80 -g
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.102:443 -g
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.101:443 -g

查看策略:

测试:

5.2防火墙标记解决轮询调度问题

FWM:FireWall Mark
MARK target 可用于给特定的报文打标记

--set-mark value

其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服务:可将多个不同的应用使用同一个集群服务进行调度

iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,.. -j MARK --set-mark number

eg:在DR-LVS中设定端口标签,认为80和443是一个整体并且删除所有策略重新添加

[root@DR-lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
[root@DR-lvs ~]# ipvsadm -A -f 6666 -s rr
[root@DR-lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.101 -g
[root@DR-lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.102 -g

查看策略:

测试:

5.3LVS持久连接

在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡

解决:

在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上
如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。
eg:

在DR-LVS中更改策略

[root@DR-lvs ~]# ipvsadm -E -f 6666 -s rr -p 3000

测试:


网站公告

今日签到

点亮在社区的每一天
去签到