LVS(Linux Virtual Server)集群中的IP负载均衡技术 之DR(直接路由模式)模型

LVS简介

LVS中文官方手册: http://www.linuxvirtualserver.org/zh/index.html 。这个手册对于了解lvs的背景知识很有帮助。

LVS英文官方手册: http://www.linuxvirtualserver.org/Documents.html 。这个手册比较全面,对于了解和学习lvs的原理、配置很有帮助。

LVS(Linux virtual server),即Linux虚拟服务器。是因为LVS自身是个负载均衡器(director),不直接处理请求,而是将请求转发至位于它后端真正的服务器realserver上,所以是虚拟服务器

LVS是四层(传输层tcp/udp)、七层(应用层)的负载均衡工具,只不过大众一般都使用它的四层负载均衡功能ipvs,而七层的内容分发负载工具ktcpvs(kernel tcp virtual server)不怎么完善,使用的人并不多。

ipvs是集成在内核中的框架,可以通过用户空间的程序 ipvsadm 工具来管理,该工具可以定义一些规则来管理内核中的ipvs。就像iptables和netfilter的关系一样。

LVS相关的几种IP:

VIP :virtual IP,LVS服务器上接收外网数据报文的网卡IP地址。
DIP :director,LVS服务器上发送数据报文到realserver的网卡IP地址。
RIP :realserver(常简称为RS)上的IP,即提供服务的服务器IP。
CIP :客户端的IP。

lvs的四种工作模式

DR  >  TUN(隧道) > NAT > FULLNAT

DR(直接路由模式): client ->VS -> RS ->client

NAT(地址转换模式): client ->VS -> RS

TUN(隧道模式): client -> VS ->RS ->client

#以上三种都没有抗攻击能力

FULLNAT:    client ->VS -> RS
#支持多vlan,抗攻击,进行两次NAT,
五元组:地址,目标地址,端口,目标端口,协议

DR(直接路由模式): client ->VS -> RS ->client

这里写图片描述

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

这里写图片描述

  在VS/DR中,根据缺省的TCP/IP协议栈处理,请求报文的目标地址为VIP,响应报文的源地址肯
定也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,
而不会知道是哪一台服务器处理的。VS/DR负载调度器跟VS/TUN一样只处于从客户到服务器的半连
接中,按照半连接的TCP有限状态机进行状态迁移。

详细知识点来源于官网:点击这里了解详更多细内容

环境配置

server1VS(Virtual Server) 调度器
server2RS (Real Server) 真实后端服务器
server3RS (Real Server) 真实后端服务器

1.随机匹配MAC地址

在server1(调度器)上:

我们需要ipvsadm来编写策略,而一般的yum源里没有ipvsadm,所以我们需要扩充高可用yum源

[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo
[rhel6.5]
name=rhel6.5
baseurl=http://172.25.78.254/rhel6.5
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.78.254/rhel6.5/LoadBalancer
enabled=1

在这里插入图片描述

[root@server1 ~]# yum repolist

[root@server1 ~]# yum install -y ipvsadm   # 下载编写调度策略的软件
[root@server1 ~]# ipvsadm -l       # 查看策略 
[root@server1 ~]# ipvsadm -A -t 172.25.78.100:80 -s rr   # 添加算法,-A表示添加一个虚拟服务,把数据进行分摊,rr表示轮询调度算法
[root@server1 ~]# ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.2:80 -g  # 添加虚拟ip,-a表示添加,-g表示采用直连模式即DR模式
[root@server1 ~]# ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.3:80 -g
[root@server1 ~]# ipvsadm -l   # 再次查看发现策略添加成功

在这里插入图片描述

[root@server1 ~]# ip addr add 172.25.78.100/24 dev eth0   # 给eth0设备上添加虚拟ip
[root@server1 ~]# ip addr show   # 查看添加成功

在这里插入图片描述

[root@server1 ~]# /etc/init.d/ipvsadm save   # 保存策略
[root@server1 ~]# cat /etc/sysconfig/ipvsadm  # 这样我们添加的策略就可以在文件中查看了
-A -t 172.25.78.100:80 -s rr
-a -t 172.25.78.100:80 -r 172.25.78.2:80 -g -w 1
-a -t 172.25.78.100:80 -r 172.25.78.3:80 -g -w 1

在这里插入图片描述

在后端服务器上(server2和server3上)
[root@server2 ~]# /etc/init.d/httpd start
[root@server3 ~]# /etc/init.d/httpd start
在真机上访问测试(虽然测试不成功,后端服务器确实被调度了,这是因为后端服务器没有相应的ip取响应,所以才不会成功)
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
^C
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
^C
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
^C
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
^C
在server1(调度器)上查看
[root@server1 ~]# ipvsadm -l

在这里插入图片描述

在后端服务器上添加虚拟ip去响应调度器
[root@server2 ~]# ip addr add 172.25.78.100/32 dev eth0  # 32表示此ip只在本机使用
[root@server3 ~]# ip addr add 172.25.78.100/32 dev eth0 
再次测试,发现可以成功响应(实现轮询)
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
www.westos.org -- server3
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
www.westos.org ---server2
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
www.westos.org -- server3
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
www.westos.org ---server2

在这里插入图片描述

[kiosk@foundation78 Desktop]$ arp -an | grep 100   #查看172.25.78.100绑定的mac地址
? (172.25.78.100) at 52:54:00:c2:0c:10 [ether] on br0

在这里插入图片描述

经过查看,发现绑定的是调度器(server1)上的,所以才会在后端服务器上进行轮询

在这里插入图片描述

[kiosk@foundation78 Desktop]$ arp -d 172.25.78.100   # 清除缓存,出现这种情况的原因是权限不够,切换到root就行了
SIOCDARP(dontpub): Operation not permitted    
[kiosk@foundation78 Desktop]$ su -
Password:
[root@foundation78 ~]# arp -d 172.25.78.100   # 清除缓存
[root@foundation78 ~]#  curl 172.25.78.100   # 再次测试发现访问的是server2
www.westos.org ---server2
[root@foundation78 ~]#  curl 172.25.78.100
www.westos.org ---server2
[root@foundation78 ~]#  curl 172.25.78.100
www.westos.org ---server2 

经过测试发现,可以看出其访问具有随机性,因为三台server在同一VLAN下具有相同的ip,因此并不能保证每次都访问的是调度器server1,如果访问到的不是server1(调度器),那么后端服务器就会被客户端直接访问,后果不堪设想,因此我们现在来解决这个问题,为了让客户端通过vs访问服务器,需要给rs设置ARP抑制,来禁止客户端直接访问服务器度器

2.用arptables实现绑定mac地址

  arptables是控制内核响应,用来屏蔽数据包,拦截ip冲突,因为虚拟机与real-server的地址一致啊,所以进入
real-server时就需要把虚拟ip DROP掉,也就就是拦截掉real-server的虚拟ip
在后端服务器上设置
[root@server2 ~]# yum install -y arptables_jf
[root@server2 ~]# arptables -L   # 查看策略

在这里插入图片描述

[root@server2 ~]# arptables -A IN -d 172.25.78.100 -j DROP # 当172.25.78.100来访问时,直接DROP掉,不做响应 
[root@server2 ~]# arptables -A OUT -s 172.25.78.100 -j mangle --mangle-ip-s 172.25.78.2  # -A控制arp协议,由于tcp三次握手原因,所以出去的时候仍要以vip地址出去才会实现握手,而真正将数据传输给客户端的就是real-server,  mangle参数就是这个功能
[root@server2 ~]# /etc/init.d/arptables_jf save 
[root@server2 ~]# arptables -L  # 查看策略添加成功

在这里插入图片描述

[root@server3 ~]# yum install -y arptables_jf
[root@server3 ~]#  arptables -A IN -d 172.25.78.100 -j DROP
[root@server3 ~]# arptables -A OUT -s 172.25.78.100 -j mangle --mangle-ip-s 172.25.78.3
[root@server3 ~]# /etc/init.d/arptables_jf save

在这里插入图片描述

测试
[root@foundation78 ~]# arp -d  172.25.78.100   # 清除缓存
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org -- server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org ---server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org -- server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org ---server2

在这里插入图片描述

3.健康检查

当后端服务器挂掉之后,客户端会发现异常,这不是我们的目的,我们要让客户端更好的享用服务,所以我们需要在调度器上对服务端进行健康检查

在server2和server3上
[root@server2 ~]# /etc/init.d/httpd stop
[root@server3 ~]# /etc/init.d/httpd stop
测试
[root@foundation78 ~]# curl 172.25.78.100     # 在客户端直接就看到报错了
curl: (7) Failed connect to 172.25.78.100:80; Connection refused
[root@foundation78 ~]# curl 172.25.78.100
curl: (7) Failed connect to 172.25.78.100:80; Connection refused
我们来配置健康检查,解决这个问题
在调度器上
[root@server1 ~]# ipvsadm -C   # 清除所有的策略
[root@server1 ~]# /etc/init.d/ipvsadm save   # 保存策略
[root@server1 ~]# ipvsadm -A -t 172.25.78.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.2:80  -g
[root@server1 ~]# ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.3:80  -g
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo  # 配置改可用yum源
[rhel6.5]name=rhel6.5
baseurl=http://172.25.78.254/rhel6.5
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.78.254/rhel6.5/LoadBalancer
enabled=1
[HighAvailability]name=HighAvailability
baseurl=http://172.25.78.254/rhel6.5/HighAvailability
enabled=1	    

在这里插入图片描述

[root@server1 ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm -y
[root@server1 ~]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm   # 查看所有的配置文件

在这里插入图片描述

[root@server1 ~]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@server1 ~]# cd /etc/ha.d/
[root@server1 ha.d]# vim ldirectord.cf  
 virtual=172.25.78.1:80 
         real=172.25.78.2:80 gate 
         real=172.25.78.3:80 gate 
         fallback=127.0.0.1:80 gate 
         service=http 
         scheduler=rr 
         #persistent=600 
         #netmask=255.255.255.255 
         protocol=tcp 
         checktype=negotiate 
         checkport=80 
         request="index.html" 
         #receive="Test Page" 
         #virtualhost=www.x.y.z

在这里插入图片描述

[root@server1 ha.d]# /etc/init.d/ldirectord start
[root@server1 ha.d]# cd /var/www/html/
[root@server1 html]# ls
bansys  class_socket.php  config.php  index.php  purge_action.php  static
[root@server1 html]# rm -fr *
[root@server1 html]# vim index.html
网站正在维护中。。。[
root@server1 html]# vim /etc/httpd/conf/httpd.conf   # 修改端口
Listen 80     
[root@server1 html]# /etc/init.d/httpd restart
再次测试,客户端就不会发现异常
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org ---server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org ---server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org ---server2	

在这里插入图片描述

当所有的后端服务器都down时,调度器会给客户端回应
[root@foundation78 ~]# curl 172.25.78.100
网站正在维护中。。。
[root@foundation78 ~]# curl 172.25.78.100
网站正在维护中。。。
[root@foundation78 ~]# curl 172.25.78.100
网站正在维护中。。。	

在这里插入图片描述

我们现在解决了后端服务器的后端检查,但是,我们只有一个调度器,当我们的调度器down掉之后,后端服务器就都不能使用,所以我们现在来做高可用,防止调度器down

4.给集群做高可用(keepalived)

keepalived主要作用
   keepalived采用VRRP(virtual router redundancy protocol),虚拟路由冗余协议,以
软件的形式实现服务器热备功能。通常情况下是将两台linux服务器组成一个热备组(master-backup),
同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),
这个VIP只存在master上并对外提供服务。如果keepalived检测到master宕机或服务故障,备服务
器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复
后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。
环境配置
server1maser(virt-server)
server2backup(virt-server)
server3real-server
server4real-server

keepalived安装包来源:Keepalived for Linux(官方网站)

在调度器(server1)上:
[root@server1 ~]# tar zxf keepalived-2.0.6.tar.gz 
[root@server1 ~]# cd keepalived-2.0.6
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived  --with-init=SYSV   # 编译的时候会有依赖
[root@server1 keepalived-2.0.6]# yum install -y openssl-devel  # 下载依赖包
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived  --with-init=SYSV    # 再次编译

在这里插入图片描述

[root@server1 keepalived-2.0.6]# make && make install
[root@server1 keepalived-2.0.6]# cd /usr/local/
[root@server1 local]# ls
keepalived
[root@server1 local]# chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived 
[root@server1 local]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d
[root@server1 local]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 local]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server1 local]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 local]# /etc/init.d/ldirectord stop  # keepalived自带健康检查,所以不需要ldirectord来健康检查
[root@server1 local]# chkconfig ldirectord off
[root@server1 local]# ip addr del 172.25.78.100 dev eth0  # 删除虚拟ip,因为keepalived会自动生成虚拟ip
[root@server1 local]# cd
[root@server1 ~]# cd /etc/keepalived/
[root@server1 keepalived]# vim keepalived.conf 
 ! Configuration File for keepalived  
   
 global_defs {  
    notification_email {  
         root@localhost   # 指定keepalived在发生切换时需要发送email到的对象,一行一个  
     }  
    notification_email_from keepalived@localhost   # 指定发件人  
    smtp_server 127.0.0.1   # 指定smtp服务器地址,此处写本机  
    smtp_connect_timeout 30  # 指定smtp连接超时时间 
     router_id LVS_DEVEL       # 运行keepalived机器的一个标识 
     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 78  # VPID标记 相同VRID的LVS属于同一组,根据优先级选举出一个主 
      priority 100  #优先级,高优先级竞选为master 
      advert_int 1    # 检查间隔,默认1秒 
      authentication {   # 设置认证 
          auth_type PASS   # 认证方式 
          auth_pass 1111   # 认证密码(密码只识别前8位) 
      } 
      virtual_ipaddress {   # 设置vip 
          172.25.78.100 
      } 
  } 
   
  virtual_server 172.25.78.100 80 { 
      delay_loop 6  # 健康检查时间间隔 
      lb_algo rr     # 调度算法 
      lb_kind DR     # 负载均衡转发规则 
      persistence_timeout 50   # 会话保持时间 
      protocol TCP      # 使用的协议 
   
      real_server 172.25.78.2 80 { 
          TCP_CHECK{ 
          weight 1    # 默认为1,0为失效 
              connect_timeout 3  # 连接超时时间 
              retry 3              # 重连次数 
              delay_before_retry 3 # 重连间隔时间 
          } 
      } 
      real_server 172.25.78.3 80 {
           TCP_CHECK{ 
          weight 1 
              connect_timeout 3 
              retry 3 
              delay_before_retry 3 
          } 
    }
   
 }		

在这里插入图片描述

在这里插入图片描述

[root@server1 keepalived]# /etc/init.d/keepalived start
[root@server1 keepalived]# scp -r /usr/local/keepalived/ server4:/usr/local/
[root@server1 keepalived]# ip addr show

在这里插入图片描述

在另外一台调度器上
[root@server4 ~]# vim /etc/yum.repos.d/rhel-source.repo 

在这里插入图片描述

[root@server4 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d
[root@server4 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server4 ~]# cd /etc/keepalived/
[root@server4 keepalived]# vim keepalived.conf  
18     state BACKUP   # 设置server4为备用 
21     priority 50      # 修改优先级,比master的优先级低即可
[root@server4 keepalived]# /etc/init.d/keepalived start
测试:
# 当两台后端服务器都正常服务时:
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org -- server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org ---server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org -- server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org ---server2	

在这里插入图片描述

# 当一台服务器坏掉之后
[root@server2 ~]# /etc/init.d/httpd stop  	

# 测试
[root@foundation78 ~]# curl 172.25.78.100  # 调度器会自动进行健康检查,如果出现报错,是延迟的问题,等一会儿就好了
www.westos.org -- server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org -- server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org -- server3 
# 当一台主调度器down掉之后,会自动切换到备用调度器
[root@server4 keepalived]# ip addr show  # 查看备用调度器,虚拟ip已经自动切换了

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值