1. 网络通信图解
2. 网络流转拓扑图
根据拓扑图,我们可以得出一个结论:TCP/IP协议中,基于下一跳的机制:IP是记录断点间的,而mac地址记录的是节点间的。
3. LVS四层负载均衡图解
对于LVS四层负载均衡,并不会和客户端和服务端分别建立三次握手,而是在传输层进行控制,客户端还是和服务端进行三次握手,因为传输层协议都是在内核级别,所以避免cpu切换,速度也会得到极大的提升。 因此LVS也是比nginx七层负责有着更到的并发量。一般在企业公司,都是由LVS接入整个机房的访问,然后在nginx负载到各个服务。
4. D-NET模型
D-NET模型中,LVS是在请求时,就目标由VIP转换为RIP,在响应时由RIP转换为VIP,是基于三、四层协议进行改造。该种模式由于请求和响应并不是对称的(响应时的内容往往比请求多)会导致带宽挤压,导致带宽成为瓶颈,并且由于IP的频繁转换,比较消耗算力。
5. DR模型
DR模型中,LVS主要是基于二层数据链路层改造,将mac地址换成服务器的mac地址,从而让网络包请求到具体的服务,并且在响应时,由于服务端会封装VIP(对外隐藏,对内可见),在响应时将目标IP直接修改为VIP,此时客户端就可以正常接收。此模型速度快、成本低,但是LVS和server必须在同一局域网,因为mac地址是记录于节点间的。
该种模型也称为mac地址欺骗。
6. TUN模型
TUN模式中,LVS主要也是基于三四层协议改造,但是它并不是更改ip,而是将原来的网络包再封装一层给服务端,然后服务端接收到拆开,处理完后,利用VIP发送回去,从而实现负载。VPN就是利用这种技术。
7. LVS中DR模型负载均衡搭建
step1: node1(LVS)
- 添加另外一个IP:注意:ens32是因为本机网卡名称为它,需要替换成当前服务器实际的网卡名称
ifconfig ens32:2 192.168.184.100/24
step2: node2 & node3(RS)
- 修改内核,ens32也需要替换成实际网卡名称
echo 1 > /proc/sys/net/ipv4/conf/ens32/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens32/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- 设置隐藏的vip:
ifconfig lo:3 192.168.184.100 netmask 255.255.255.255
step3: node2 & node3(RS)
yum install httpd -y
service httpd start
vi /var/www/html/index.html
— 写入内容随意,主要是区分负载到哪一台机器上,eg:from192.168.184.12
step4: node1(LVS)
yum install ipvsadm -y
ipvsadm -A -t 192.168.184.100:80 -s rr
— 可通过 ipvsadm -ln
查看 ipvsadm -a -t 192.168.184.100:80 -r 192.168.184.12 -g -w 1
ipvsadm -a -t 192.168.184.100:80 -r 192.168.184.13 -g -w 1
结果验证
浏览器访问 192.168.184.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没事,一定是后边网络层出问题
8. keepalived
对于第7点中LVS存在2点问题 1:LVS为单点,一旦发生故障,服务就不可用。 2:某个服务发生故障,lvs还是会负载给它,用户有机会访问失败。
为了解决这个问题,我们引入keeplived解决。
step1: node1
- 清除ipvsadm配置
ipvsadm -C
卸载配置的虚拟IP
ifconfig ens32:2 down
step2: node1 & node4
yum install keepalived ipvsadm -y
- 配置
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vi keepalived.conf
vrrp:虚拟路由冗余协议!
vrrp_instance VI_1 {
state MASTER // node04 BACKUP
interface ens32
virtual_router_id 51
priority 100 // node04 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.184.100/24 dev ens32 label ens32:3
}
}
virtual_server 192.168.184.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.184.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.184.13 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
scp ./keepalived.conf root@node04:
pwd`<br />
service keepalived start`
弊端:当keeplalived强制杀死还没有来的及卸载网卡时,会导致出现多个相同虚拟IP,导致服务不可用。