LVS
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
早期的小型运营商使用的LVS:
使每个小区的用户在任意时间平均分配在三个server服务器上,减少单台server的并发量。
实现DR需要隐藏VIP
一切皆文件:把程序或内核映射成文件,修改文件,相当于修改程序的变量,即时生效。
一块网卡可以配置多个IP地址。
隐藏VIP方法:对外隐藏,对内可见 :
kernel parameter:
目标mac地址为全F,交换机触发广播
/proc/sys/net/ipv4/conf/*IF*/
arp_ignore: 定义接收到ARP请求时的响应级别;
0:只要本地配置的有相应地址,就给予响应;(打我的电话可以找到我和我爱人)
1:仅在请求的目标(MAC)地址配置请求到达的接口上的时候,才给予响应;(打我的电话只能找到我)
arp_announce:定义将自己地址向外通告时的通告级别;
0:将本地任何接口上的任何地址向外通告;(三个我的两个手机号工作|生活,我通讯录内的都公布)
1:试图仅向目标网络通告与其网络匹配的地址;(两个手机号工作|生活都公布)
2:仅向与本地接口上地址匹配的网络进行通告;(一个手机号工作公布)
查看本机地址
ifconfig
本机的页面访问本机的tomcat,
请求发出后,访问内核,经过(虚拟网卡)判定就是自己的地址,发出去的包直接变成输入包,找对应端口的tomcat,然后掉头返回。
在虚拟网卡上配置,内核知道,外界不知道,就实现了:对外隐藏,对内可见。
负载均衡调度方法
静态调度方方法:
rr : 轮循调度(Round-Robin Scheduling)
wrr : 加权轮叫调度(Weighted Round-Robin Scheduling)
dh : 目标地址散列调度(Destination Hashing Scheduling)
sh : 源地址散列调度(Source Hashing Scheduling)
动态调度方法:
lc : 最小连接调度(Least-Connection Scheduling)
wlc : 加权最小连接调度(Weighted Least-Connection Scheduling)
sed : 最短期望延迟
nq : never queue
LBLC : 基于局部性的最少链接(Locality-Based Least Connections Scheduling)
DH :
LBLCR : 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
如何知道哪个server的连接次数。
记录了三次握手的过程后,给对应server连接次数+1
ipvs内核模块
负载均衡在内核的模块
安装传递命令用的工具
yum install ipvsadm -y
管理集群服务
添加:-A -t|u|f service-address [-s scheduler]
-t: TCP协议的集群
-u: UDP协议的集群
service-address: IP:PORT
-f: FWM: 防火墙标记
service-address: Mark Number
修改:-E
删除:-D -t|u|f service-address
例 : ipvsadm -A -t 192.168.9.100:80 -s rr
管理集群服务
添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address:事先定义好的某集群服务
-r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
[-g|i|m]: LVS类型
-g: DR
-i: TUN
-m: NAT
[-w weight]: 定义服务器权重
修改:-e
删除:-d -t|u|f service-address -r server-address
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 –g
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -g
查看
-L|l
-n: 数字格式显示主机地址和端口
--stats:统计数据
--rate: 速率
--timeout: 显示tcp、tcpfin和udp的会话超时时长
-:c 显示当前的ipvs连接状况(不建立连接,偷窥的服务器)
删除所有集群服务
-C:清空ipvs规则
保存规则,下次重启电脑还可以使用
-S
# ipvsadm -S > /path/to/somefile
载入此前的规则:
-R
# ipvsadm -R < /path/form/somefile
-S保存规则 -R载入规则 , 相当于数据库的持久化。
LVS的DR模型试验搭建
手册
浏览器 -> vmnet-8(网卡) -> 虚拟网络 -> node01( 192.168.150.11) -> lvs -> 192.168.150.100 ->(192.168.150.11 -> 192.168.150.12 MAC欺骗)
-> httppd -> 192.168.150.12 -> 虚拟网络-> vmnet-8(网卡) ->浏览器
布置网络层
VIP 192.168.150.100 三台都要配置
node01
ifconfig eth0:2 192.168.150/24
24 :代表3个255,/16 :255.255.0.0 , 8个2进制位,255 : 8个1
ifconfig eth0:2 192.168.150.100 netmask 255.255.255.0
ifconfig eth0:2 down //禁用
node02 , node03
为了隐藏VIP,先调整协议修改内核,再改IP
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
隐藏VIP
ifconfig lo:8 192.168.150.100 netmask 255.255.255.255
为什么是4个255?
从环回接口lo :2也可以到192.168.150这个网络,
eth0也可以去192.168.150这个网络,如果现在ping 目标地址192.168.150.1 ,两个口都可以走,虚拟网卡比物理网卡要近,然后发送给环回接口lo :2,然后环回接口lo :2又发给自己,最后这个包永远发布出去。
lo :2 192.168.150.100 255.255.255.255 与运算是:192.168.150.100
eth0 192.168.150.100 255.255.255.0 与运算是:192.168.150.0
规避死循环的风险
如果配成255.255.255.0,xcell会断开连接。
配置应用层
RS中的服务:node02 , node03
//安装:重启生效
yum install httpd -y
//启动:默认占用80端口
service httpd start
//添加页面
vi /var/www/html/index.html
from 191.168.150.12 :node02
from 191.168.150.13 :node03
LVS服务配置
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 //查看
验证
浏览器访问 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没事,一定是后边网络层出问题,网络的确认包没回来。
node01
node02,node03上有记录
偷窥记录表
自己实操搭建
布置网络层
node01
ifconfig ens33:8 192.168.141.100 netmask 255.255.255.0
ifconfig
node02
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:8 192.168.141.100 netmask 255.255.255.255
配置应用层
//安装:重启生效
yum install httpd -y
yum remove ipvsadm //卸载
//启动:默认占用80端口
service httpd start
//添加页面
vi /var/www/html/index.html
from 191.168.141.x :node0x
LVS服务配置
yum install ipvsadm
ipvsadm -A -t 192.168.141.100:80 -s rr
ipvsadm -a -t 192.168.141.100:80 -r 192.168.141.138 -g -w 1
ipvsadm -a -t 192.168.141.100:80 -r 192.168.141.140 -g -w 1
ipvsadm -ln //查看
访问不到
//关闭防火墙
systemctl disable firewalld
//允许80访问
iptables -I INPUT -p TCP --dport 80 -j ACCEPT
//httpd用的是tcp6的80端口 关闭ipv6,重启httpd
sysctl net.ipv6.conf.all.disable_ipv6=1
service httpd restart
我用的是手机热点,所以每次ip都会变,下面是二次验证