专栏首页山山仙人的专栏LVS负载均衡之DR模式

LVS负载均衡之DR模式

1、LVS的DR模式介绍

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

VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群 系统的吞吐量。该方法与IBM的NetDispatcher产品中使用的方法类似(其中服务器上的IP地址配置方法是相似的),但IBM的 NetDispatcher是非常昂贵的商品化产品,我们也不知道它内部所使用的机制,其中有些是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)直接返回给用户,返回的时候不经过 LVS。 DR模式下需要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设置在集群中的每个节点上,此时集群内的真实服务器会尝试回答来自客户端计算机的查找VIP的ARP广播,这就会产生问题,大家都说我是"VIP"。 b)为了达到负载均衡的目的,在所有real server上要关闭所有arp请求,导致不能响应client发出的arp请求(相当于哑巴),只有lvs可以响应,这样请求就会传到lvs的vip中,这就是为什么要禁止real server 的 arp请求和响应。因此必须想法办让真实服务器忽略来自客户端计算机的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的规则也会自动调整。

部分内容参考:http://www.cnblogs.com/windysai/p/6122277.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LVS负载均衡之NAT模式

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

    山山仙人
  • 使用git-svn迁移SVN至GitLab

    后面的步骤中对git版本有一定要求,通过yum安装的git版本较低,这里进行编译安装

    山山仙人
  • Linux远程执行Windows机器任务

    近期测试人员提出需求需要在Linux下调用Windows系统下的cmd的命令完成自动构建和测试并生成测试报告。

    山山仙人
  • ASP.NET那点不为人知的事(四)

    虽然开发中很少接触多线程,但你必须承认你离不开他。 接着上篇博客(ASP.NET那点不为人知的事(三)),基本可以实现一个Mini版的服务器,但也有不足: 倘若...

    用户1161731
  • docker学习5-docker安装tomcat环境和部署war包

    tomcat部署web项目非常方便,把war包放到webapps目录就可以了。本篇使用docker快速搭建一个tomcat环境

    上海-悠悠
  • 003.SSH密钥对登陆

    在ssh-client将公钥导入至[需要登陆的用户家目录]/.ssh/authorized_keys

    木二
  • 为ubuntu操作系统增加root用户

    1:当安装好虚拟机,安装好Ubuntu操作系统后,登陆的时候发现除了自己的设置的用户就是外来用户,其实Ubuntu中的root帐号默认是被禁用了的,所以登陆的时...

    别先生
  • Linux用户管理常用命令

    以"root:x:0:0:root:/root:/bin/bash"这一行为例,以":"为分隔符,说明每一列的意义

    CoderJed
  • SQL语句执行原理清空缓存的方法

    文章转载:原文地址 原理: 第一步:应用程序把查询SQL语句发给服务器端执行。 我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发...

    Albert陈凯
  • 刷脸背后,卷积神经网络的数学原理原来是这样的

    在自动驾驶、医疗以及零售这些领域,计算机视觉让我们完成了一些直到最近都被认为是不可能的事情。今天,自动驾驶汽车和无人商店听起来不再那么梦幻。事实上,我们每天都在...

    CDA数据分析师

扫码关注云+社区

领取腾讯云代金券