文章目录

  • 一、LVS简介
  • 二、DR模式
  • 1.概念
  • 2.原理
  • 三、使用DR模式实现负载均衡
  • 四、可能会出现的问题解决


一、LVS简介

lvs(linux virtual server),linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统,那么负载均衡实现了很好可伸缩性,节点数目可以增长到几千,甚至几万。后期也由很多用户参与开发LVS辅助工具和辅助组件,最出名的就是alexandre为LVS编写的keepalived,它最初专门用于监控LVS,之后又加入VRRP实现高可用功能。
    负载调度器,真实服务器群节点一起被称为LVS,LVS负载调度器(有时也称为负载均衡器),接收服务的所有接入服务集群的请求,并决定集群中的哪个节点应该回复其请求。
    1)、负载调度器(director):作为整个集群的前端,主要将用户请求分发至真实服务器中进行处理。
    2)、真实服务器池:由多个功能相同的真是服务器组成,为用户提供真正的网络服务,如web服务,邮件服务等。且虚拟服务器集群作为一个可伸缩的集群,可自由添加深处真是服务器而并步影响整个集群的正常工作。
    3)、共享存储:作用就是让每个用户访问的资源都是一样的,服务器支持写操作,才建议使用
    LVS集群的高可用,虽然LVS负载均衡性能很好,但是如果其中节点故障,LVS是无法感知的,因此产生了LVS周边的一个辅助工具KeepAlived,用于监控检查兼容性非常好,如果RS一个节点挂掉,keepalived会将此节点从管理列表中剔出,当节点恢复再拉回管理列表,但是此时的调度器存在单点故障的可能性,所以还必须使用其他软件来实现调度器的高可用,比如hearbeat。
    根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。

二、DR模式

1.概念

通过直接路由实现虚拟服务器。DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。DR模式可以极大的提高集群系统的伸缩性,而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器与真实服务器都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。

2.原理

LVS通过控制IP来实现负载均衡。ipvsadm是其具体的实现模块。(ipvsadm安装在调度器上,当用户访问VIP时,先到达调度器,由调度器按照其规则选择真实主机,处理完成返回客户端)

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

四台主机,一台为调度器,两台为真实主机,另外一台为测试机

首先在调度器中添加虚拟IP:VIP

[root@server1 conf]# ip addr add 192.168.110.100/24 dev ens33
[root@server1 conf]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7a:04:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.110.28/24 brd 192.168.110.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.110.100/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7a:49e/64 scope link 
       valid_lft forever preferred_lft forever

给调度器添加策略,使用ipvsadm查看,结果如下,已经成功添加

[root@server1 conf]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  server1:http rr
  -> server3:http                 Route   1      0          0         
  -> server4:http                 Route   1      0          0

分别在两个真实主机安装httpd服务,并且开启;但是当用户向VIP发起请求时,调度器和真实主机都必须有VIP,所以我们要给两个真实主机也添加VIP

[root@server4 ~]# ip addr add 192.168.110.100/32 dev ens33
[root@server4 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:da:bb:6f brd ff:ff:ff:ff:ff:ff
    inet 192.168.110.31/24 brd 192.168.110.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.110.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feda:bb6f/64 scope link 
       valid_lft forever preferred_lft forever

以下就是实现了负载均衡之后的测试机访问VIP界面,可以看到,调度器将需求平均分摊在了两个真是主机上边,实现了轮叫

[root@server5 ~]# for i in {1..10}; do curl 192.168.110.100;done
server1.3
server1.1
server1.3
server1.1
server1.3
server1.1
server1.3
server1.1
server1.3
server1.1
[root@server5 ~]# curl 192.168.110.100
server1.3
[root@server5 ~]# curl 192.168.110.100
server1.1
[root@server5 ~]# curl 192.168.110.100
server1.3
[root@server5 ~]# curl 192.168.110.100
server1.1

调度器也会显示当前不活跃的连接数都是7,实现了负载均衡

[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  server1.2:http rr
  -> 192.168.110.3:http           Route   1      0          7         
  -> 192.168.110.10:http          Route   1      0          7

四、可能会出现的问题解决

如果真实主机中有一台停止工作,那么该如何解决客户端访问报错问题

在出现这种问题的时候,客户端已经报错,但是调度器上却仍然正常显示,因此我们要使调度策略实时更新来解决这一问题

[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  server1.2:http rr
  -> 192.168.110.3:http           Route   1      0          5         
  -> 192.168.110.10:http          Route   1      0          5

首先在调度器上安装keepalived(健康监测)

[root@server1 ~]# yum install -y keepalived -y
[root@server1 keepalived]# yum install -y postfix mailx

在keepalived。conf配置文件中修改配置,包括修改通知邮件,添加自己设置的VIP;添加自己的真实主机,具体如下:

root@localhost
   }
   #notification_email_from Alexandre.Cassen@firewall.loc
   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 ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.110.100
    }
}
virtual_server 192.168.110.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50                (这是在多长的时间内持续的将所有请求交给一个真是主机执行)
    protocol TCP

    real_server 192.168.110.10 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            }
        }
    real_server 192.168.110.3 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3

    }
}
}

先删除我们之前添加的策略以及VIP;启动keepalived服务,再次查看策略,发现已经自动添加,VIP也已经添加成功

[root@server1 keepalived]# systemctl reload keepalived.service 
[root@server1 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.110.100:80 rr persistent 50
  -> 192.168.110.10:80            Route   1      0          10
[root@server1 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:5e:69:1e brd ff:ff:ff:ff:ff:ff
    inet 192.168.110.2/24 brd 192.168.110.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.110.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe5e:691e/64 scope link 
       valid_lft forever preferred_lft forever

现在再次在测试机进行测试,发现不会出现报错,所有的请求都被调度到没有问题的真实主机上

[root@server5 ~]# for i in {1..10}; do curl 192.168.110.100;done
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1
server1.1

当我们的真实主机恢复正常时,我们再次进行测试,会发现出现了轮叫,实现了负载均衡