LVS
一、简介
-
概念
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中
-
特点
- 数据包转发级别(特别快)
- 不会和客户端握手
- 后端服务器必须是镜像的
- 负载均衡服务器拥有偷窥能力并且记录,3次握手连接+1,四次挥手连接-1
-
比较
- LVS-用于hold住流量(只要网速够快,就没有上限)
- nginx 用于hold 住握手(7层,但有负载上线)
-
工作模式
- NAT模式
- DR模式
- TUN模式
详情见https://blog.csdn.net/qq_43583755/article/details/121504437?spm=1001.2014.3001.5501
二、隐藏VIP方法
-
特点
对外隐藏,对内可见
-
kernel parameter
目标mac地址为全F,交换机触发广播
在linux系统中一切皆文件,在该目录**/proc/sys/net/ipv4/conf/IF/**可以修改内核设置,但不能直接vi修改,只能通过echo修改
- arp_ignore
- 0:只要本地配置的有相应地址,就给予响应
- 1:仅在请求的目标(MAC)地址配置请求到达接口上的时候,才给予响应
- arp_announce
- 0:将本地任何接口上的任何地址向外通告
- 1:试图仅向目标网络通告与其网络匹配的地址
- 2:仅向与本地接口上地址匹配的网络进行通告
为了方便理解,举一个例子:
情景:-
arp_ignore(响应-被动)
- 0 某人问我爱人电话号码-告诉他
- 1 某人问我爱人电话号码-不告诉他
-
arp_announce(通告-主动)
一个网卡上可以有多个ip地址也就是一个人可以有多个手机号(公用,私用)
- 0 电话都告诉某人
- 1 只告诉某人公用的(网络号不同)
- 2 都不告诉
结论:如果要配隐藏VIP,那么就要配arp设置和添加虚拟ip到环回接口上
- arp_ignore
-
调度算法
- 静态
- rr 轮询
- wrr 加权轮询
- dh 目标地址散列调度
- sh 源地址散列调度
- 动态
- Ic:最少连接
- Wic:加权最少连接
- sed:最短期望延迟
- nq:never queue
- dblc:基于本地的最少连接
- DH 目标地址散列调度
- LBLCR:基于本地的带复制功能的最少连接
问题引入:
负载均衡服务器如何知道最少连接的是哪台服务器,如何知道它连接的服务器的信息?
负载均衡服务器拥有偷窥能力并且记录
client发送sync数据包,经过负载均衡服务器,该服务器会看sync中的信息(ip,port)并记录,当client或者server发送ack确认的时候,会在server上握手连接+1,这里四次挥手连接-1同理
TIP:
如果我们要操作lvs内核设置,需要安装一个ipvs内核模块 ipvsadm(对于大多数程序来说)
下图为可能用到的命令,在实践的时候会进行详细的说明.
- 静态
三、DR模型(LVS)实践
在准备服务器的时候会遇到一些问题:
配置三台node服务器
https://www.jb51.net/article/115686.html
Centos 6无法使用yum解决办法
https://www.xmpan.com/944.html
1.LVS
node01:
添加网卡-ifconfig eth0:8 192.168.150.100/24 (这里的24代表255.255.255.0)
删除网卡-ifconfig eth0:2 down
node02~node03:
1)修改内核:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
2)设置隐藏的vip:
ifconfig lo:3 192.168.150.100 netmask 255.255.255.255
问题:
1.为什么添加lo:2时,子网掩码是255.255.255.255而不是255.255.255.0?
如果是255.255.255.0,它的IP和MASK进行与运算和eth0走的是同一个网络号,又因为物理网卡(eth0)和虚拟网卡(lo:2)之间虚拟网卡更近,所以会优选虚拟网卡,换回接口将数据又发给自己,这样就死循环了,数据就发不出去了所以会出现如下情况:
- 若 ping 192.168.188.1, 则数据会发不出去(因为如果是255.255.255.255那么它会先将IP和MASK进行与运算,获得网络号192.168.188.100)
- 若 ping 192.168.188.1, 则走eth0,数据能发出去
2.RS中的服务
node02~node03:
yum install httpd -y
service httpd start
vi /var/www/html/index.html
from 192.168.150.1x
这里主要是看效果,所以写的不一样
3.LVS服务配置
如果我们要操作lvs内核设置,需要安装一个ipvs内核模块 ipvsadm(对于大多数程序来说)
node01:
yum install ipvsadm
ipvsadm -A -t 192.168.150.100:80 -s rr
ipvsadm -a -t 192.168.150.100:80 -r 192.168.150.12 -g -w 1
ipvsadm -a -t 192.168.150.100:80 -r 192.168.150.13 -g -w 1
ipvsadm -ln
4.验证
验证:
浏览器访问 192.168.150.100 看到负载 疯狂F5
node01:
netstat -natp 结论看不到socket连接
node02~node03:
netstat -natp 结论看到很多的socket连接
node01:
ipvsadm -lnc 查看偷窥记录本
TCP 00:57 FIN_WAIT 192.168.150.1:51587 192.168.150.100:80 192.168.150.12:80
FIN_WAIT: 连接过,偷窥了所有的包
SYN_RECV: 基本上lvs都记录了,证明lvs没事,一定是后边网络层出问题