前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LVS负载均衡之DR模式

LVS负载均衡之DR模式

作者头像
仙人技术
发布2020-04-29 14:07:44
7370
发布2020-04-29 14:07:44
举报

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模式部署过程

环境:

代码语言:javascript
复制
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

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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服务器配置

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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内核参数

代码语言:javascript
复制
[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服务器的高可用

代码语言:javascript
复制
[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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、LVS的DR模式介绍
  • 2、LVS的DR模式部署过程
    • 2.1、web服务器准备
      • 2.2、lvs服务器配置
        • 2.3、web服务器配置
          • 2.4、测试
            • 2.5、keepalived结合lvs_DR模式
            相关产品与服务
            负载均衡
            负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档