LVS负载均衡

一.LVS

        LVS(Linux Virtual Server)即Linux虚拟服务器,是一个虚拟的服务器集群系统,在unix/linux平台下实现负载均衡集群功能。LVS是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
        根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,其工作模式分为NAT模式、TUN模式、以及DR模式。

 

二、DR模式

    DR模式:通过直接路由实现虚拟服务器。DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。DR模式可以极大的提高集群系统的伸缩性,而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器与真实服务器都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
    原理:LVS通过控制IP来实现负载均衡。ipvsadm是其具体的实现模块。
    ipvsadm的主要作用:安装在调度器上面,在调度器上虚拟一个对外访问的IP(VIP)。用户访问VIP,到达调度器,调度器根据一定的规则选择一个真实服务器,处理完成后然后返回给客户端数据。

三、使用DR模式实现负载均衡

1、实验环境:server1为调度器,负载流量均衡(基于4层即传输层进行调度,调度算法有WRR/WLC等,传输协议为TCP/UDP),server2和server3为真实服务器节点。
2、server1安装ipvsadm(用于用户端管理LVS的策略规则)

 3、书写策略:在server1上添加虚拟一个对外访问的IP:172.25.10.100(vip),即提供虚拟服务的ip地址,也可以直接用原有IP,但最好独立出来

 4、  ipvsadm -A 添加规则;-t tcp协议;-s 调度;rr 轮叫

-a向tcp虚拟服务添加

-r real server

-g 直连即DR模式

ipvsadm -ln:查看当前连接情况(-ln不用解析)

 ipvsadm -Ln   
 ipvsadm -A -t 172.25.11.100:80 -s rr
 ipvsadm -a -t 172.25.11.100:80 -r 172.25.10.2:80 -g
 ipvsadm -a -t 172.25.11.100:80 -r 172.25.10.3:80 -g

在server2和server3中: 

安装httpd服务,编写默认访问页面,开启服务

给server2和server3分别添加vip 172.25.52.100/32(LVS-DR集群类型要求,当用户向vip发起请求时,调度器和真实服务器上必须都要有vip)

[root@server2 ~]# echo server2 > /var/www/html/index.html
[root@server2 ~]# systemctl start httpd
[root@server2 ~]# curl localhost
server2
[root@server2 ~]# ip addr add 172.25.10.100/24 dev eth0

[root@server3 ~]# echo server3 > /var/www/html/index.html
[root@server3 ~]# systemctl restart httpd
[root@server3 ~]# curl localhost
server3
[root@server3 ~]# ip addr add 172.25.10.100/24 dev eth0

此时在真机中(客户端)curl 172.25.52.100,出现轮叫: 

 

 ARP协议是将IP地址映射为MAC地址的协议,其在协议上使用ARP请求及ARP应答报文来实现

[root@westos_student73 Desktop]# arp -an | grep 100  
? (172.25.10.100) at 52:54:00:4c:c5:9b [ether] on br0 ( 查看本地ARP缓存的172.25.10.100对应的MAC地址为调度器server1的地址)

[root@westos_student73 Desktop]# arp -d 172.25.10.100  (删除指定虚拟IP的ARP缓存)

[root@westos_student73 Desktop]# arp -an | grep 100
? (172.25.10.100) at 52:54:00:2c:2e:fa [ether] on br0   (查看本地ARP缓存的172.25.10.100对应的MAC地址为调度器server3的地址

arp -d是删除ARP缓存列表的命令,可以删除所有的ARP缓存,也可以删除指定的ARP缓存

总结:使用arp -an查看本地ARP缓存的172.25.52.100对应的MAC地址为调度器server1的地址,当真机执行arp -d 删除指定虚拟IP的ARP缓存后,此时不能过滤得到172.25.52.100的MAC地址。再次执行curl 172.25.10.100,得到的不是不是调度器的地址而是server3的MAC地址(谁先响应就缓存谁的MAC地址)

 为了解决这一问题,给server2和server3安装ARP防火墙arptables(用于管理内核中的ARP包过滤规则表

[root@server2 ~]# yum install -y arptables
[root@server2 ~]# arptables -L
Chain INPUT (policy ACCEPT)

Chain OUTPUT (policy ACCEPT)

Chain FORWARD (policy ACCEPT)

[root@server3 ~]# yum install -y arptables
[root@server3 ~]# arptables -L
Chain INPUT (policy ACCEPT)

Chain OUTPUT (policy ACCEPT)

Chain FORWARD (policy ACCEPT)

设定APR配置规则,DR模式要求服务器节点应该禁掉设备的APR响应

arptable_filter 只有一个表 filter ,不指定 -t 表名时默认就是 filter 表。
filter表有三个链,一个是INPUT,表示外面发进来的ARP包;另外一个是OUTPUT,表示本机发出的ARP包;第三个是FORWARD,转发ARP包。
-A:向规则链中追加规则;
-d:指定要匹配ARP包的目的IP地址;
-j:指定满足添加的规则时执行的动作;
-s:指定要匹配ARP包的源ip地址;
-g:直连
-r:真实服务器地址

 当数据包的目的地址是100时就丢弃该数据包,当从本机发送出的数据包IP是100时,mangle转换数据包源地址,伪装源地址IP为172.25.102.2。

[root@server2 ~]# arptables -A INPUT -d 172.25.10.100 -j DROP
[root@server2 ~]# arptables -A OUTPUT -d 172.25.10.100 -j mangle --mangle-ip-s 172.25.10.2
[root@server2 ~]#  arptables -L
Chain INPUT (policy ACCEPT)
-j DROP -d server2

Chain OUTPUT (policy ACCEPT)
-j mangle -d server2 --mangle-ip-s server2

[root@server3 ~]#  arptables -A INPUT -d 172.25.10.100 -j DROP
[root@server3 ~]#  arptables -A OUTPUT -d 172.25.10.100 -j mangle --mangle-ip-s 172.25.10.3

[root@server2 ~]# arptables-save > /etc/sysconfig/arptables   将添加的链放在文件中防止清除
[root@server3 ~]#  arptables -L
Chain INPUT (policy ACCEPT)
-j DROP -d server3

Chain OUTPUT (policy ACCEPT)
-j mangle -d server3 --mangle-ip-s server3

策略永久保存

【 client->DR-RS->clinet】
1:DR和RS在同一个vlan(局域网)中,DR和RS的vip会冲突,数据包必须在DR修改mac,丢弃RS的vip,mac在二层数据链路层,不支持路由,所以DR和RS需要在同一vlan
2:DR>Tunnel(隧道模式)>NAT(dnat和snat,进出各1此,数据是原路经返回)>fullNAT(进2次出2次)
3:ipvs和iptables,iptables>ipvs,firewall不需要地址转换

问题:

1.当real server2 down 了,怎么办?   ----------------->  健康检测

 当real server2 down 了后,客户端访问real server2时会报错,vs依然会出现变化

 2.LVS 本身down 了,怎么办?-----> --LVS冗余(高可用)

四.高可用 

[root@server1 ~]# ipvsadm -C
[root@server1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server4 

 健康检测

ipvsadm没有健康检测功能,即检测策略对应的后端服务是否正常,因此我们需要安装keepalived 

[root@server1 ~]# yum install -y keepalived   ##健康检测
[root@server1 ~]# yum install -y mailx    ##邮件

 

删掉server1上手动设置的虚拟ip172.25.52.100
ipvsadm -C清除设置的规则,
启动keepalived软件(在配置文件中已设置,需将手动添加的ip删除) 

 [root@server1 keepalived]# ip addr del 172.25.10.100/24 dev eth0

[root@server1 keepalived]# ip addr

[root@server1 ~]# cd /etc/keepalived/
[root@server1 keepalived]# ls
keepalived.conf
[root@server1 keepalived]# vim keepalived.conf

编写keepalived配置文件:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {

        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.10.100
    }
}

virtual_server 172.25.10.100 80 {
    delay_loop 6
    lb_algo rr

    lb_kind DR
    #persistence_timeout 50 (持续连接,50秒之内来自同一个客户端的请求持续转发到同一个后端,一个后端处理一个客户端的请求,在50秒之内看不到负载均衡的效果)
    protocol TCP

    real_server 172.25.10.2 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            delay_before_retry 3
        }
    }

       real_server 172.25.10.3 80 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
                delay_before_retry 3
        }
    }
}

[root@server1 keepalived]# scp keepalived.conf  server4:/etc/keepalived/

[root@server1 keepalived]# systemctl start keepalived.service
[root@server1 keepalived]# cat /var/log/messages

在server4 中操作:

root@server4 ~]# yum install -y ipvsadm
[root@server4 ~]# yum install -y keepalived

[root@server4 ~]# cd /etc/keepalived/
[root@server4 keepalived]# ls

[root@server4 keepalived]# vim keepalived.conf

编写keepalived配置文件:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 60
    priority 50
    advert_int 1
    authentication {

        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.10.100
    }
}

virtual_server 172.25.10.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 60
    priority 50                 修改状态和优先级,此处的状态为备用,优先级必须比主用的优先级低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.10.100
    }
}

virtual_server 172.25.10.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP

    real_server 172.25.10.2 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            delay_before_retry 3
        }
    }

       real_server 172.25.10.3 80 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
                delay_before_retry 3
        }
    }
}

测试

[root@server1 keepalived]# systemctl stop keepalived.service 

[root@server4 keepalived]# systemctl start keepalived.service

当server1的keepalived服务停止后,server4是MASTER

 开启server1的 keepalived服务之后,172.25.52.100的MAC地址是server1的MAC地址,此时server4为BACKUP

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值