1. 网络通信图解

image.png

2. 网络流转拓扑图

image.png

根据拓扑图,我们可以得出一个结论:TCP/IP协议中,基于下一跳的机制:IP是记录断点间的,而mac地址记录的是节点间的。

3. LVS四层负载均衡图解

image.png

对于LVS四层负载均衡,并不会和客户端和服务端分别建立三次握手,而是在传输层进行控制,客户端还是和服务端进行三次握手,因为传输层协议都是在内核级别,所以避免cpu切换,速度也会得到极大的提升。 因此LVS也是比nginx七层负责有着更到的并发量。一般在企业公司,都是由LVS接入整个机房的访问,然后在nginx负载到各个服务。

image.png

4. D-NET模型

image.png

D-NET模型中,LVS是在请求时,就目标由VIP转换为RIP,在响应时由RIP转换为VIP,是基于三、四层协议进行改造。该种模式由于请求和响应并不是对称的(响应时的内容往往比请求多)会导致带宽挤压,导致带宽成为瓶颈,并且由于IP的频繁转换,比较消耗算力。

5. DR模型

image.png

DR模型中,LVS主要是基于二层数据链路层改造,将mac地址换成服务器的mac地址,从而让网络包请求到具体的服务,并且在响应时,由于服务端会封装VIP(对外隐藏,对内可见),在响应时将目标IP直接修改为VIP,此时客户端就可以正常接收。此模型速度快、成本低,但是LVS和server必须在同一局域网,因为mac地址是记录于节点间的。

该种模型也称为mac地址欺骗。

6. TUN模型

image.png

TUN模式中,LVS主要也是基于三四层协议改造,但是它并不是更改ip,而是将原来的网络包再封装一层给服务端,然后服务端接收到拆开,处理完后,利用VIP发送回去,从而实现负载。VPN就是利用这种技术。

7. LVS中DR模型负载均衡搭建

image.png

step1: node1(LVS)

  1. 添加另外一个IP:注意:ens32是因为本机网卡名称为它,需要替换成当前服务器实际的网卡名称

ifconfig ens32:2 192.168.184.100/24

step2: node2 & node3(RS)

  1. 修改内核,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

  1. 设置隐藏的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

  1. 清除ipvsadm配置 ipvsadm -C
  2. 卸载配置的虚拟IP ifconfig ens32:2 down

    step2: node1 & node4

  3. yum install keepalived ipvsadm -y

  4. 配置

cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vi keepalived.conf

  1. vrrp:虚拟路由冗余协议!
  2. vrrp_instance VI_1 {
  3. state MASTER // node04 BACKUP
  4. interface ens32
  5. virtual_router_id 51
  6. priority 100 // node04 50
  7. advert_int 1
  8. authentication {
  9. auth_type PASS
  10. auth_pass 1111
  11. }
  12. virtual_ipaddress {
  13. 192.168.184.100/24 dev ens32 label ens32:3
  14. }
  15. }
  16. virtual_server 192.168.184.100 80 {
  17. delay_loop 6
  18. lb_algo rr
  19. lb_kind DR
  20. nat_mask 255.255.255.0
  21. persistence_timeout 0
  22. protocol TCP
  23. real_server 192.168.184.12 80 {
  24. weight 1
  25. HTTP_GET {
  26. url {
  27. path /
  28. status_code 200
  29. }
  30. connect_timeout 3
  31. nb_get_retry 3
  32. delay_before_retry 3
  33. }
  34. }
  35. real_server 192.168.184.13 80 {
  36. weight 1
  37. HTTP_GET {
  38. url {
  39. path /
  40. status_code 200
  41. }
  42. connect_timeout 3
  43. nb_get_retry 3
  44. delay_before_retry 3
  45. }
  46. }

scp ./keepalived.conf root@node04:pwd`<br />service keepalived start`

弊端:当keeplalived强制杀死还没有来的及卸载网卡时,会导致出现多个相同虚拟IP,导致服务不可用。