LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
【1】技术简介:
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
【2】集群采用三层结构:
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
【3】其他特点:
1.lvs是位于传输层,基于IP,对IP进行分流的一种结构,其调度功能使用较多,工作在INPUT链。
2.当作为调度器时,用户发送请求,调度器将请求发送至kernel space,判断IP是否为设定IP,是的话将数据包发送至INPUT链。
3.lvs的实现主要由ipvs和ipvsadm【编写策略的工具】组成。
【4】四种模式:
DR模式【根具mac地址,需要和后端服务器在同一网络】
NAT模式【地址转换】【效率低】
tunl模式【隧道模式】,实现跨网段
fullNAT模式【转换访问来源IP和访问目的IP】【效率低】【需要重新编译内核,很少用】
【5】ipvsadm:Linux虚拟服务器管理
ipvsadm用于在Linux内核中设置、维护或检查虚拟服务器表。Linux虚拟服务器可以用于基于两个或多个节点的集群构建可扩展的网络服务。群集的活动节点重定向对将实际执行服务的服务器主机集合的服务请求。
支持的功能包括两个协议(TCP和UDP)、三种包转发方法(NAT、隧道和直接路由)和八种负载平衡算法(循环,加权循环,最小连接,加权最小连接,基于位置的最小连接,与复制、目标哈希和源哈希的基于位置的最小连接)
在这里,简单来说,就是lvs的管理工具。
下面部分主要为负载均衡的功能实现,以及几种模式的演示:
实验环境:
主机:测试:172.25.12.250
node1:ipvs服务器:安装ipvsadm:172.25.12.1
node2:web服务器1:安装httpd,写入默认发布文件:172.25.12.2
node3:web服务器2:安装httpd,写入默认发布文件:172.25.13.3
一:基础调度器实现:DR模式:
在node1:
yum install ipvsadm -y
ipvsadm -l ##查看策略【还没写,是空的】
systemctl status ipvsadm.service #查看启动时会加载的文件、做的操作
vim /use/lib/systemd/system/ipvsadm.service #查看启动加载文件,里面说当启动时会清空一个文件,然后将更改的策略再写入这个文件
systemctl start ipvsadm #开启服务【但是无法开启,需要再创建一个启动加载文件】【查看报错的提示】【如果可以正常启动,说明文件被自动建立】
touch /etc/sysconfig/ipvsadm 【服务无法开启时需要建立该文件】
systemctl start ipvsadm
vim /etc/sysconfig/ipvsadm-config #编辑配置文件
IPVS_SAVE_ON_RESTAR="yes" #当重启服务时会加载文件
ipvsadm -A -t 172.25.14.100:80 -s rr #添加策略以轮循的方式【rr】 该IP为VIP,是一个对外的公开IP
ipvsadm -a -t 172.25.14.100:80 -r 172.25.14.2:80 -g #指定真实访问地址,本条策略实现调度
ipvsadm -a -t 172.25.14.100:80 -r 172.25.14.3:80 -g #指定真实访问地址,本条策略实现调度
cat /etc/sysconfig/ipvsadm #还没重启服务,没有策略
systemctl restart ipvsadm #重启服务,使策略生效
cat /etc/sysconfig/ipvsadm #查看策略【被导入上述三条策略】
ip addr add 172.25.14.100/24 dev eth0 #添加一个地址【数据入口】
在node2:web1:
systemctl start httpd 【开启apache服务,作为资源服务器】
vim /var/www/html/index.html 【写入默认发布文件,作为访问资源】
ip addr add 172.25.14.100/24 dev eth0 #添加一个地址【入口地址】
在node3:web2:
systemctl start httpd 【开启apache服务,作为资源服务器】
vim /var/www/html/index.html 【写入默认发布文件,作为访问资源】
ip addr add 172.25.14.100/24 dev eth0 #添加一个地址
测试主机:
curl 172.25.14.100 访问入口地址:多次访问,会得到web1和web2的资源/或者只能得到其中一个的资源
情况一:访问VIP时轮询访问资源服务器,得到所有资源
情况二:清除缓存后,再访问,只能得到一台资源服务器的资源
以上两种情况都是正常情况,我们使用arp -an | grep 100
查看访问100这个IP时去查找的真正资源服务器的mac地址,会发现只对应着我们能看到资源的一台服务器。
为了解决上述问题,我们需要再使用一个命令:arptables
arptables,linux命令,用于过滤arp包
arptables用于建立、获取、修改内核的arp包处理表.有几个不同的表,每个表分别含有几条内建的处理链,同时允许用户自定义处理链
每条链是一些规则的列表,每条规则匹配特定的包.每条规则指定一个对匹配的包的操作.这个操作也叫做‘目标’,这个目标也可是跳转到同一个表中的另外的链。
两台web服务器【相同操作】:
yum install -y arptables_jf #安装软件
arptables -nL #查看已有策略
arptables -A INPUT -d 172.25.14.100 -j DROP
#添加INPUT表策略:当有访问100的数据时,丢弃,使其访问无效
arptables -A OUTPUT -s 172.25.12.100 -j mangle --mangle-ip-s 172.25.12.2
【web2用的是web2的IP】 #返回数据时,以100这个IP返回,但是由它自己的lo回环接口通过自己的eth0网卡返回的,没有再次将数据返回给ipvsadm调度器再返回去。
arptables -nL #查看已有策略
arptables-save > /etc/sysconfig/arptables
#编写后的策略文件导入策略执行文件 #导入后是永久的,不导入是临时的
cat /etc/sysconfig/arptables #查看策略执行文件,查看策略
systemctl start arptables.service #开启服务
systemctl status arptables.service #查看状态
arptables -nL #查看已有策略【服务开启时才有策略显示】
测试主机:
arp -d 172.25.12.100 #清除缓存
curl 172.25.12.100 #会再次开始循环,得到两台web服务器的资源
二:tunl隧道模式:
tunl模式是调度器将请求报文进行封装,以伪装后的身份发送给后端服务器,
后端服务器进行拆包,确认是否和自己响应,
响应则直接发送答案响应客户端。
node1:server1服务器:
modprobe ipip #安装模块
ip a #会出现tunl0
ip addr del 172.25.12.100/24 dev eth0 #上一实验中我们添加了100这个IP,我们这里将其移除
ip addr add 172.25.12.100/24 dev tunl0 #添加到tunl0设备中
ip a #查看添加结果
ip link set up tunl0 #刷新设备
ipvsadm -C #清除原有策略
ipvsadm -A -t 172.25.12.100:80 -s rr #添加策略
ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.2:80 -i #指定real server
ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.3:80 -i #同上
systemctl restart ipvsadm.service #重启ipvsadm.service,使策略加载
cat /etc/sysconfig/ipvsadm #查看策略
两台web服务器:
modprobe ipip
ip addr del 172.25.12.100/24 dev eth0
ip addr add 172.25.12.100/24 dev tunl0
ip a
ip link set up tunl0 ##如果卡住,见下方问题解决
sysctl -a | grep rp_filter
sysctl -w 有1的部分=0 #将反向过滤规则关闭
sysctl -p ##刷新,使更改生效
测试主机:
arp -d 172.25.14.100 #清除缓存
curl 172.25.14.100 #可以轮循访问到两台web服务器
问题注意!!
如果给tunl0上添加地址后,该主机网络出现问题,ssh连接断掉,无法ping通其他IP地址:
modprobe -r ipip
modprobe ipip
ip addr add 172.25.14.100/32 dev tunl0
ip link set up tunl0
原因是添加的24位的ipv4的地址不能 ip link set up tunl0 ,具体原因未知。改为使用32位IP则可以正常使用。
大大的小小阳