lvs负载均衡

1. 核心内容

  • 负载均衡 lvs 负责对数据进行转发
    • 一次请求,一次响应
  • 反向代理 nginx/haproxy 负责代替用户找数据,找到后再发送给用户
    • 两次请求,两次响应

2. arp

  • DNS 为域名解析,将域名解析为IP地址
  • arp协议 为地址解析协议 将IP地址解析到mac地址
    • ip地址为网络层,3层
    • mac地址为2层
    • arp协议属于3层协议,但工作在2层
2.1 arp解析过程
  • 假如有A、B、C、D四台设备连接在同一个交换机上,A想连接B,A知道B的IP地址10.0.0.8,但 不知道B的mac地址,A将会发广播:Who has 10.0.0.8?Tell 10.0.0.7(谁知道10.0.0.8的mac地址?请告诉A10.0.0.7”),B、C、D设备都会接受到该广播,但C、D设备的IP地址都不是10.0.0.8,则会丢弃该广播,B设备收到广播后知道A是要自己的mac地址,则B会悄悄(一对一)的将自己的mac地址发送给A,A收到B返回的信息后会缓存一份数据,用于下次连接B的时候用。
2.2 linux的arp缓存查看命令
arp -n   # 若无此命令,则需要安装 net-tools
2.3 手动缓存其他设备的mac地址,只需手动在该设备上ping对应设备的IP地址
[root@lb01 ~]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
10.0.0.1                 ether   00:50:56:c0:00:08   C                     eth0
10.0.0.254               ether   00:50:56:f2:d4:34   C                     eth0
[root@lb01 ~]# ping 10.0.0.7
PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.
64 bytes from 10.0.0.7: icmp_seq=1 ttl=64 time=3.37 ms
64 bytes from 10.0.0.7: icmp_seq=2 ttl=64 time=1.27 ms
^C
--- 10.0.0.7 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.272/2.324/3.376/1.052 ms
[root@lb01 ~]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
10.0.0.1                 ether   00:50:56:c0:00:08   C                     eth0
10.0.0.7                 ether   00:0c:29:8e:5d:df   C                     eth0
10.0.0.254               ether   00:50:56:f2:d4:34   C                     eth0
[root@lb01 ~]# 
2.4 通过抓包查看缓存mac地址过程
Vmware_86:09:1d	Broadcast	    ARP	60	Who has 10.0.0.7? Tell 10.0.0.5 #Broadcast为广播
Vmware_8e:5d:df	Vmware_86:09:1d	ARP	60	10.0.0.7 is at 00:0c:29:8e:5d:df
Vmware_c0:00:08	Vmware_86:09:1d	ARP	42	Who has 10.0.0.5? Tell 10.0.0.1
Vmware_86:09:1d	Vmware_c0:00:08	ARP	60	10.0.0.5 is at 00:0c:29:86:09:1d

5问:谁有7的mac地址?

7回:我有,地址是…

7问:谁有5的mac地址?

5回:我有,地址是…

说明:第一次讯问为广播,一旦有回应之后,则进行缓存,下次再讯问则不是广播,而是直接按照缓存去一对一连接。

2.5 删除arp 缓存命令
# arp -d ip地址,例如:
arp -d 10.0.0.7
2.6 arp欺骗
  • 描述:A和B都连接与同一个交换机,并都通过这个交换机上网,即A和B也都缓存着这个交换机的mac地址,突然有一天B大量的发出广播“交换机的mac地址是我B设备的mac地址”,慢慢的其他设备会逐渐替换并缓存B广播的这个假消息,导致其他设备误认为B设备为交换机,导致不能上网了。

3. lvs

  • lvs专业名称为:linux virtual server 即linux虚拟服务器

  • 因为lvs处理请求支持的并发特别高,以至于lvs模块嵌入到了linux内核中,即 ip_vs

  • 管理 ip_vs 有两种方式:通过ipvsadm管理命令 和 keepalived(keepalived for lvs)

4. lvs的工作模式

  • dr direct routing 直接路由模式(使用较多)
  • nat (使用较多)
  • tun 隧道模式(使用少)
  • full nat(使用少)
4.1 预备知识
  • 名词
    • 用户
      • 用的IP地址为:CIP
    • 负载均衡
      • 负载均衡利用高可用软件生成的的IP地址为:VIP
      • 负载均衡设备本身的IP地址为:DIP
    • 真实服务器(RS服务器)
      • 真实服务器的IP地址为:RIP
4.2 nat模式
  • 用户访问过程:
    • 用户发出请求时携带源IP(CIP)、目标IP(VIP)到达复杂均衡服务器,lvs执行DNAT,将用户数据包的目标IP地址修改为RIP(网络设备会保存修改记录用于相同访问使用)发给RS服务器,RS服务器收到并处理后将RIP设为源IP、CIP设为目标IP发送给lvs,lvs执行SNAT,将RS服务器发来的源IP由RIP修改为VIP,即此时的数据包源IP为VIP,目标IP为CIP,由负载均衡发给用户。
    • 此过程只涉及IP地址,不涉及mac地址。
  • 特点:
    • lvs与RE服务器可以不再同一局域网
    • 用户访问端口和后端RS服务器响应的端口可以不一致
    • nat模式流量出入都要经过lvs,效率、性能不高
4.3 dr模式
  • 用户访问过程:

    • 用户发出请求时携带源IP(CIP)、目标IP(VIP)到达复杂均衡服务器,lvs将用户数据包的目标IP的mac地址修改为RS服务器的mac地址(随机选择任一台RS服务器)发给RS服务器,RS服务器收到后校对mac地址时发现与自己mac地址一致,所以接受并解封装数据包,因为所有RS服务器的lo网卡已经绑定了VIP,所以拆数据包时发现目标IP与自己绑定的VIP一致,所以RS服务器将处理结果直接发给用户。

      • 小知识:windows中删除arp缓存方法

        # 用管理员权限打开cmd
        arp -d
        
  • 为什么要做arp抑制

  • 因为所有RS服务器的lo回环网卡都绑定了VIP,所以lvs服务器以及所有RS服务器都有了VIP,当用户查询具有VIP的服务器的mac地址时,如果不做抑制,则lvs服务器以及所有RS服务器都会同时响应用户的请求,这样就发生混乱导致用户不能正常访问,给所有RS服务器做arp抑制之后,用户请求时,RS服务器不会响应,仅lvs服务器响应,则用户可以正常访问。

  • 特点

    • lvs dr模式中,lvs只负责转发并修改用户请求的目标mac地址,称为dmact
    • lvs dr模式中,后端RS服务器处理完的数据直接响应给用户
    • lvs dr模式中,RS服务器也要有公网IP
    • lvs dr模式中,支持更高的并发数,几万甚至几十万
    • lvs dr模式中,lvs服务器和后端RS服务器必须在同一个局域网
    • lvs dr模式中,用户请求过来的端口是不能修改的,所以后端RS服务器就要开启用户访问的端口
4.4 dr模式环境准备
4.4.1 配置web01、web02
# web01要能够访问http://10.0.0.7/oldboy.html
# web02要能够访问http://10.0.0.8/oldboy.html
[root@web01 ~]# cat /etc/nginx/nginx.conf 
worker_processes  1;
events {
    worker_connections  1024;
}
http{
server {
    server_name www.oldboy.com;
    listen 80;
    root  /usr/share/nginx/html/ ;
 }
}

# 在oldboy.html中写入主机名
[root@web01 ~]# echo 'hostname' >/usr/share/nginx/html/oldboy.html

# 关闭nginx
[root@web01 ~]# pkill nginx

# 重启nginx
[root@web01 ~]# systemctl restart nginx
4.4.2 配置lb01、lb02
# 关闭lb01、lb02的keeplived  nginx负载均衡
[root@lb01 ~]# systemctl stop keepalived nginx
[root@lb01 ~]# systemctl disable keepalived nginx

# lb01安装ipvsadm
[root@lb01 ~]# yum install -y ipvsadm

# lb01手动添加vip
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth:0

# lb01手动添加池塘
[root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
#参数:-A 创建池塘(VIP:端口) -t tcp协议  -s 轮询算法  wrr 加强轮询  -p 会话保持时间,默认是300秒

# lb01手动添加RS服务器
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r  10.0.0.7:80 -g -w 1
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
# 参数:-a 添加RS服务器  -t tcp协议  -r 指定RS服务器(IP:端口)  -g dr模式  -w 权重

# lb01查看ipvs规则
[root@lb01 ~]# ipvsadm -Ln    #注意:与iptables进行区分(-nL)

# lb01查看ipvs规则及详细信息(查看具体流量信息)
[root@lb01 ~]# ipvsadm -Ln --stats

# 清空ipvs规则命令
[root@lb01 ~]# ipvsadm -C

# 设置tcp超时时间
[root@lb01 ~]# ipvsadm --set 30   # 常用超时时间为30  5  60

# 注意:ipvsadm是linux管理ip_vs的命令,无需启动操作,直接使用。
4.4.3 配置RS服务器(web)
# 所有RS服务器lo网卡绑定vip(永久)
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.3
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback

# 所有RS服务器抑制arp解析
cat >>/etc/sysctl.conf<<EOF 
net.ipv4.conf.all.arp_ignore = 1 
net.ipv4.conf.all.arp_announce = 2 
net.ipv4.conf.lo.arp_ignore = 1 
net.ipv4.conf.lo.arp_announce = 2 EOF 

# 配置生效
sysctl -p

# RS服务器检查lo网卡
[root@web01 ~]# ip a s lo

# 注意:
	# 1. 不要在lvs服务器本地进行curl测试,会失败;
	# 2. lvs负载均衡当用户与访问量巨大的时候,才会使各个RS服务器的分配接近1:1,而平时测试访问量小的时			候,会长时间分配在同1台RS服务器上,要等1-2分钟才会变。
	
# 此时可以通过浏览器访问VIP网页测试
# 如访问失败,故障排查流程:
# 1. 浏览器通过负载均衡访问 10.0.0.3/oldboy.html
# 2. RS服务器通过ping/telnet连接负载均衡,查看是否成功
# 3. 在RS服务器上通过命令行curl 负载均衡vip网址
# 4. 浏览器单独访问RS服务器 RIP地址的网页,查看是否能正常访问
# 5. 查看RS服务器配置是否正确
4.4.4 lvs规则的备份与恢复
# 将ipvs规则打印到屏幕上
[root@lb01 ~]# ipvsadm-save -n

# 将ipvs规则保存到文件
[root@lb01 ~]# ipvsadm-save -n >/root/ipvsadm.conf

# 将ipvs规则从文件恢复
[root@lb01 ~]# ipvsadm-restore </root/ipvsadm.conf

5. lvs与keepalived配合使用

# 清除lb上手动添加的VIP,最简单的办法是重启网卡
systemctl restart network

# 配置lb01的keepalived配置文件(主)
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   router_id lb01      #keepalived身份 id  每个keepalived 不同
}

vrrp_instance oldboy {    #实例名称   在同1对主备之间 要一致 
    state MASTER          #MASTER BACKUP
    interface eth0        #指定网卡 公网网卡 
    virtual_router_id 62  #虚拟路由id  同1对 主备之间要一致  在同1个keepalived文件中要不同
    priority 100          #优先级 主>备  相差50 
    advert_int 1          #interval 间隔 心跳间隔  秒   每隔1秒检查
    authentication {      #认证 方式 
        auth_type PASS    #简单认证 
        auth_pass 1234    #在同1对 主备之间一直 
    }
    virtual_ipaddress {   #vip
        10.0.0.3/24 dev eth0 label eth0:0
    }
}

virtual_server 10.0.0.3 80 { #创建组 池塘 
	delay_loop 6 
	lb_algo wrr #轮询算法
	lb_kind DR # lvs DR模式 
	nat_mask 255.255.255.0 #vip对应的子网掩码 
	persistence_timeout 50 #会话保持时间 -p 
	protocol TCP #协议 -t

	real_server 10.0.0.7 80 { #rs服务器的配置 
		weight 1 #权重 
		TCP_CHECK { #-t TCP_CHECK 检查 传输层 
		connect_timeout 8 
		nb_get_retry 3 #number of get retry 重试的次数 
		delay_before_retry 3 #每次检查之前 等待3秒 
		connect_port 80 #检查端口 
		} 
	}

	real_server 10.0.0.8 80 { 
		weight 1 
		TCP_CHECK {
		connect_timeout 8 
		nb_get_retry 3 
		delay_before_retry 3 
		connect_port 80 
		} 
	} 
}

# 重启lb01的keepalived,并查看ipvs规则
[root@lb01 ~]# systemctl restart keepalived.service
[root@lb01 ~]# ipvsadm -Ln

# 配置lb02的keepalived配置文件(备)
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
	#GLOBAL CONFIGURATION   全局定义部分
global_defs {
   router_id lb02      #keepalived身份 id  每个keepalived 不同
}
	#VRRPD CONFIGURATION  vrrp实例部分    虚拟路由冗余协议 
	##vrrp
vrrp_instance oldboy {    #实例名称   在同1对主备之间 要一致 
    state BACKUP          #MASTER BACKUP
    interface eth0        #指定网卡 公网网卡 
    virtual_router_id 62  #虚拟路由id  同1对 主备之间要一致  在同1个keepalived文件中要不同
    priority 50           #优先级 主>备  相差50 
    advert_int 1          #interval 间隔 心跳间隔  秒   每隔1秒检查
    authentication {      #认证 方式 
        auth_type PASS    #简单认证 
        auth_pass 1234    #在同1对 主备之间一直 
    }
    virtual_ipaddress {   #vip
        10.0.0.3/24 dev eth0 label eth0:0
        #ip addr add 10.0.0.3/24 dev eth0 label eth0:0 
    }
}

virtual_server 10.0.0.3 80 { #创建组 池塘 
	delay_loop 6 
	lb_algo wrr #轮询算法
	lb_kind DR # lvs DR模式 
	nat_mask 255.255.255.0 #vip对应的子网掩码 
	persistence_timeout 50 #会话保持时间 -p 
	protocol TCP #协议 -t

	real_server 10.0.0.7 80 { #rs服务器的配置 
		weight 1 #权重 
		TCP_CHECK { #-t TCP_CHECK 检查 传输层 
		connect_timeout 8 
		nb_get_retry 3 #number of get retry 重试的次数 
		delay_before_retry 3 #每次检查之前 等待3秒 
		connect_port 80 #检查端口 
		} 
	}

	real_server 10.0.0.8 80 { 
		weight 1 
		TCP_CHECK {
		connect_timeout 8 
		nb_get_retry 3 
		delay_before_retry 3 
		connect_port 80 
		} 
	} 
}

# 重启lb02的keepalived,并查看ipvs规则
[root@lb02 ~]# systemctl restart keepalived.service
[root@lb02 ~]# ipvsadm -Ln
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值