LVS负载均衡之DR模式

仙人技术

共 10742字,需浏览 22分钟

 ·

2021-04-27 17:40

目录

  • 1、LVS 的 DR 模式介绍

  • 2、LVS 的 DR 模式部署过程

    • 2.1 web 服务器准备

    • 2.2 lvs 服务器配置

    • 2.3 web 服务器配置

    • 2.4 测试

    • 2.5 keepalived 结合 lvs_DR 模式


本文来自我的博客旧文章~

1、LVS 的 DR 模式介绍

参考自官网:http://www.linuxvirtualserver.org/zh/lvs3.html

VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。该方法与IBMNetDispatcher产品中使用的方法类似(其中服务器上的IP地址配置方法是相似的),但IBMNetDispatcher是非常昂贵的商品化产品,我们也不知道它内部所使用的机制,其中有些是IBM的专利。VS/DR的体系结构如图所示:调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过高速的交换机或者HUB相连。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只 是用于处理目标地址为VIP的网络请求。

VS/DR的工作流程如图所示:它的连接调度和管理与VS/NATVS/TUN中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现 报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

VS/DR中,根据缺省的TCP/IP协议栈处理,请求报文的目标地址为VIP,响应报文的源地址肯定也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。VS/DR负载调度器跟VS/TUN一样只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。简单来说:请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVSDR模式下需要LVS和绑定同一个VIP(RS 通过将VIP绑定在loopback实现)。一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RSMAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVSDR模式是性能最好的一种模式。优点:效率最高,负载均衡器只用分发请求,应答包通过单独的路由返回给客户端,提高了服务器并发能力。缺点:负载均衡器的网卡必须和物理网卡在同一网段上

2、LVS 的 DR 模式部署过程

环境:

lvs  eth0:10.0.0.31 eth0:1:10.0.0.32 gateway:10.0.0.254
web01 eth0:10.0.0.71 lo:10.0.0.32 gateway:10.0.0.254
web02 eth0:10.0.0.81 lo:10.0.0.32 gateway:10.0.0.254

2.1 web 服务器准备

在 web 服务器上安装 httpd 服务来进行模拟,每台服务器的 web 首页不同,在负载均衡测试的时候以便区分 web01

[root@web01 ~]# yum install -y httpd
[root@web01 ~]# systemctl start httpd.service
[root@web01 ~]# systemctl enable httpd.service
[root@web01 ~]# echo 'web01'> /var/www/html/index.html
[root@web01 ~]# curl 127.0.0.1
web01

web02

[root@web02 ~]# yum install -y httpd
[root@web02 ~]# systemctl start httpd.service
[root@web02 ~]# systemctl enable httpd.service
[root@web02 ~]# echo 'web02'> /var/www/html/index.html
[root@web02 ~]# curl 127.0.0.1
web02

2.2 lvs 服务器配置

[root@lvs ~]# ifconfig eth0:0 10.0.0.32 netmask 255.255.255.255 #为网卡eth0增加辅助ip
[root@lvs ~]# yum install -y ipvsadm    #安装lvs核心管理软件包
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -At 10.0.0.32:80 -s rr
[root@lvs ~]# ipvsadm -at 10.0.0.32:80 -r 10.0.0.71:80 -g
[root@lvs ~]# ipvsadm -at 10.0.0.32:80 -r 10.0.0.81:80 -g
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.32:80 rr
  -> 10.0.0.71:80                 Route   1      0          0
  -> 10.0.0.81:80                 Route   1      0          0

参数说明:-C --clear清除内核虚拟服务器表中的所有记录-A --add-service在内核的虚拟服务器表中添加一条新的虚拟服务器记录-t --tcp-service service-address说明虚拟服务器提供的是 tcp 的服务-s --scheduler scheduler使用的调度算法,调度算法可以指定以下 8 种:rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队)-a --add-server在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器-r --real-server server-address指定真实的服务器[Real-Server:port]-g --gatewaying指定LVS的工作模式为直接路由模式(也是 LVS 默认的模式)-L --list显示内核虚拟服务器表-n不解析端口使用的协议

2.3 web 服务器配置

web01

[root@web01 ~]# ifconfig lo:0 10.0.0.32 netmask 255.255.255.255   #为环回地址增加辅助ip
[root@web01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    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
    inet 10.0.0.32/32 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:22:ee:cd brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.71/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe22:eecd/64 scope link
       valid_lft forever preferred_lft forever

以下操作目的是修改内核参数,开启arp抑制,调整arp内核参数的意义:a)ARP广播会产生的问题 当客户端发起访问VIP对应的域名的请求(curl 10.0.0.32)时,根据网络通信原理会产生ARP广播,因为负载均衡器dir和真实的服务器rs在同一网络并且VIP设置在集群中的每个节点上,此时集群内的真实服务器会尝试回答来自客户端计算机的查找VIPARP广播,这就会产生问题,大家都说我是"VIP"。b)为了达到负载均衡的目的,在所有real server上要关闭所有arp请求,导致不能响应client发出的arp请求(相当于哑巴),只有lvs可以响应,这样请求就会传到lvsvip中,这就是为什么要禁止real serverarp请求和响应。因此必须想法办让真实服务器忽略来自客户端计算机的ARP广播请求 ——》 调整arp内核参数

[root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

web02 的配置和 web01 相同

2.4 测试

测试的时候用这三台机器测试都不能成功,需要在浏览器访问或者另外找一台机器测试 测试的时候访问 10.0.0.32,访问到测试内容,配置 LVS 采用的是轮循模式。第一次是访问 web01,刷新后是访问 web02,再刷新后访问 web01

2.5 keepalived 结合 lvs_DR 模式

配置 keepalived 增加虚拟 ip,从而管理到 lvs,可以进一步配置为 lvs 服务器的高可用

[root@lvs ~]# yum install keepalived -y
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL  #表示keepalived服务器的一个标识
}

vrrp_instance VI_1 {   #定义一个vrrp组,组名唯一
    state MASTER   #定义改主机为keepalived的master主机
    interface eth0   #监控eth0号端口
    virtual_router_id 51  #虚拟路由id号为51,id号唯一,这个id决定了多播的MAC地址
    priority 100   #节点优先级
    advert_int 1   #检查间隔,默认为1秒
    authentication {
        auth_type PASS  #认证方式,密码认证
        auth_pass 1111  #认证密码
    }
    virtual_ipaddress {
        10.0.0.32   #虚拟ip地址
    }
}

virtual_server 10.0.0.32 80 {  #虚拟主机设置
    delay_loop 2    #每隔2秒查询realserver状态
    lb_algo rr     #lvs的调度算法
    lb_kind DR    #lvs的集群模式
    protocol TCP    #用TCP协议检查realserver状态
    real_server 10.0.0.71 80 {  #后端真实主机ip
    weight 1     #每台机器的权重,0表示不给该机器转发请求,直到它恢复正常
    HTTP_GET {     #以下为健康检查项目
        url {
  path /index.html   #访问的url首页
  status_code 200   #返回状态码
        }
        connect_timeout 3   #连接超时时间,单位为秒
        nb_get_retry 3    #检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除
        delay_before_retry 3   #失败重试的间隔时间,单位为秒
    }
    }
    real_server 10.0.0.81 80 {
    weight 1
    HTTP_GET {
        url {
  path /index.html
  status_code 200
        }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
    }
}
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# systemctl start keepalived.service
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.32:80 rr
  -> 10.0.0.71:80                 Route   1      0          0
  -> 10.0.0.81:80                 Route   1      0          0

这里 keepalived 服务启动后,配置的 vip 也成功实现了 lvs 负载均衡,而且实现了对 web 服务器的健康检查,当某个 web 服务器宕机,lvs 的规则也会自动调整。

浏览 117
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报