部署LVS-DR(LVS+Keepalived)群集

一、LVS-DR数据包流向分析

dzXKyT.md.jpg

1、Client向目标VIP发出请求,Director(负载均衡器)接收

  • IP包头及数据帧头信息
Src mac Dst mac type source ip src port dst ip dsc pot CRC
192.168.57.135 55014 192.168.57.126 80
source MAC dest MAC
00:18:82:3c:e8:96 00:0c:29:6a:8d:5d

2、Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送

  • IP包头及数据帧头信息
Src mac Dst mac type source ip src port dst ip dsc pot CRC
192.168.57.135 55014 192.168.57.126 80
source MAC dest MAC
00:0c:29:6a:8d:5d 00:0c:29:b1:97:82

3、RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),于是处理这个报文,随后重新封装报文,发送到局域网

  • IP包头及数据帧头信息
Src mac Dst mac type source ip src port dst ip dsc pot CRC
192.168.57.126 80 192.168.57.135 55014
source MAC dest MAC
00:0c:29:b1:97:82 00:18:82:3c:e8:96

4、Client将收到回复报文。Client人为得到正常的服务,而不会知道是哪一台服务器处理的

  • 注意:如果跨网段,则报文通过路由器经由Internet返回给用户

二、LVS-DR中的ARP问题

  • 在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址
  • 在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱
  1. 当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
  2. 只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播
  • 对节点服务器进行处理,使其不响应针对VIP的ARP请求
  1. 使用虚接口lo:0承载VIP地址
  2. 设置内核参数arp_ignore=1:系统只响应目的IP为本地IP的ARP请求
  • RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址
  • 发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址(如:ens33接口)
源IP VIP
源MAC RealServer的MAC
目的IP 路由器的IP
目的MAC
  • 路由器收到ARP请求后,将更新ARP表项
  • 原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址
IP MAC
VIP Director的MAC
IP MAC
VIP RealServer的MAC
  • 问题:路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效

  • 解决方法:对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

三、Keepalived简介及原理

(一) Keepalived简介

  • 企业应用中,单台服务器承载应用存在单点故障的危险

  • 单点故障一旦发生,企业服务将发生中断,造成极大的危害

  • Keepalived是专为LVS和HA设计的一款健康检查工具

  1. 支持故障自动切换(Failover)
  2. 支持节点健康状态检查(Health Checking)

(二)Keepalived实现原理剖析

  • Keepalived采用VRRP热备份协议,实现Linux服务器的多机热备功能
  • VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案
  1. 由多台路由器组成一个热备组,通过共同的虚拟IP地址对外提供服务
  2. 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
  3. 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

四、实验:构建负载均衡(DR)+高可用群集

  • 实验软件环境:VMware Workstation 15.5、Xshell 6、Centos7.6
  • IP地址及服务器指责规划
设备 IP地址 职责
LVS+Keepalived(1) 192.168.100.128/192.168.100.10(VIP) LVS-DR(主)
LVS+Keepalived(2) 192.168.100.129/192.168.100.10(VIP) LVS-DR(备)
Web节点1 192.168.100.201 提供web页面
Web节点2 192.168.100.202 提供web页面
客户端(Win10) 192.168.100.20 测试访问
  • 实验步骤

1、实验前准备,在两台LV上安装keepalived和ipvsadm工具;在两台Web服务器上安装http服务

yum -y install keepalived ipvsadm
yum -y install httpd

2、将以上工具下载安装完成后,将所有服务器节点及客户机网卡均设置为仅主机模式

3、分别在两台VLS调度器上进行如下配置

vi /etc/sysctl.conf         ## 编辑配置文件
添加如下内容:
net.ipv4.ip_forward=1       ## 开启流量转发功能

proc响应关闭重定向功能:
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens33.send_redirects=0

保存退出后使用sysctl -p命令使配置生效

4、分别在两台VLS调度器上配置网卡及VIP

cd /etc/sysconfig/network-scripts/      ## 进入网卡配置目录
cp -p ifcfg-ens33 ifcfg-ens33:0         ## 复制配置文件作为VIP的配置
vim ifcfg-ens33:0                       ## 编辑虚拟网卡
添加如下内容:
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.100.10                   ## 这个就是虚拟IP(VIP) 
NETMASK=255.255.255.0

配置本地物理网卡,信息如下:
vim ifcfg-ens33      ## 编辑物理网卡

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=f5f4c669-a4b3-48fd-9b96-69455b90d1d0
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.128                   ## 物理网卡IP地址
NETMASK=255.255.255.0
GATEWAY=192.168.100.1

配置LVS-DR(备)的过程同上,这里就不再赘述了,只需要把物理网卡IP改为192.168.100.129即可

5、配置DR模式启动脚本

cd /etc/init.d/
vim vim dr.sh 
写入如下内容:
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.10
RIP1=192.168.100.201
RIP2=192.168.100.202
case "$1" in
start)
       /sbin/ipvsadm --save > /etc/sysconfig/ipvs      ## 保存默认配置(centos7需要,6不需要)
       systemctl start ipvsadm
       /sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
       /sbin/route add -host $VIP dev ens33:0               ## 添加路由网段
       /sbin/ipvsadm -A -t $VIP:80 -s rr                   ## 指向DR模式(以下三行)
       /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
       /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
       echo "ipvsadm starting -------------------[ok]"
       ;;
       stop)
       /sbin/ipvsadm -C
       systemctl stop ipvsadm
       ifconfig ens33:0 down                                        ## 关闭逻辑网口
       route del $VIP                                               ## 删除路由条目
       echo "ipvsamd stoped -------------------[ok]"
       ;;
       status)
       if [ ! -e /var/lock/subsys/ipvsadm ];then
       echo "ipvsadm stoped -------------------"
       exit 1
            else
            echo "ipvsadm Runing -------------------[ok]"
       fi
       ;;
       *)
       echo "Usage:$0{start|stop|status}"
       exit 1
       esac
       exit 0
       
保存退出后为脚本添加执行权限:chmod +x dr.sh
重启网卡:service network restart
执行脚本:service dr.sh start
关闭系统防火墙:systemctl stop firewalld
             setenforce 0

另一台LVS-DR的操作步骤同上,不需要更改任何内容

6、配置两台Web节点服务器

cd /etc/sysconfig/network-scripts/      ## 进入网卡配置目录
cp -p ifcfg-lo ifcfg-lo:0               ## 复制配置文件作为VIP的配置
vim ifcfg-lo:0                          ## 编辑虚拟网卡
添加如下内容:
DEVICE=lo:0
IPADDR=192.168.100.10
NETMASK=255.255.255.0
ONBOOT=yes

配置本地物理网卡,信息如下:
vim ifcfg-ens33      ## 编辑物理网卡

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=046613c1-dc28-4a0a-ab6c-89d7bd207756
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.201
NETMASK=255.255.255.0
GATEWAY=192.168.100.1                   

7、分别在两台Web节点服务器上创建配置服务管理脚本

cd /ect/init.d/    ## 进入service管理目录
vim web.sh         ## 创建脚本
写入如下内容:
#!/bin/bash
VIP=192.168.100.10         ##指定VIP
      case "$1" in
      start)
             ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP     ## 声明VIP地址
             /sbin/route add -host $VIP dev lo:0                           ## 添加路由网段
             echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore              ## ARP过滤(以下四句)
             echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
             echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
             echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
             sysctl -p > /dev/null 2>&1                                  ## 使配置立即生效
             echo "RealServer Start OK"
             ;;
      stop)
             ifconfig lo:0 down
             route del $VIP /dev/null 2>&1                            ## 删除路由条目
             echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore            ## 关闭ARP过滤
             echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
             echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
             echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
             echo "RealServer Stopd"
             ;;
          *)
             echo "Usage:$0 {start|stop}"
             exit 1
      esac
      exit 0
      
保存退出后为脚本添加执行权限:chmod +x dr.sh
重启网卡:service network restart
执行脚本:service dr.sh start
关闭系统防火墙:systemctl stop firewalld
             setenforce 0

另一台Web节点2的操作步骤同上,不需要更改任何内容

8、分别在分别在两台Web节点服务器上默认站点首页

cd /var/www/html/
vim index.html
写入以下内容:
<h1>test1</h1>

在另一台Web节点2上同上操作,只需要将test1改为test2即可

9、下面在LVS调度服务器上配置Keepalived

vim cd /etc/keepalived/keepalived.conf    ## 编辑keepalived配置文件

修改后的配置文件:
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1              ## 邮件服务器指向本地
   smtp_connect_timeout 30
   router_id LVS_01                   指定router_ip,不能相同
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER                  ## 备机为BACKUP
    interface ens33               ## 接口为物理网卡接口
    virtual_router_id 51
    priority 100                  ## 备机优先级必须要小于主机
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.10           ## VIP地址
    }
}

virtual_server 192.168.100.10 80 {       ## 虚拟服务器IP地址及访问端口
    delay_loop 6
    lb_algo rr
    lb_kind DR                      ## 指定LVS模式
    persistence_timeout 50
    protocol TCP

    real_server 192.168.100.201 80 {     ## 真实服务器IP地址
        weight 1
           TCP_CHECK {                 ## 健康状态检查
            connect_port 80            ## 添加80端口
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.100.202 80 {      ## 以下是另一台Web Server节点
        weight 1
           TCP_CHECK {
            connect_port 80 
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


在LVS-DR(1)上配置完成后,直接使用scp命令上传到LVS-DR(2)上即可:
scp keepalived.conf [email protected]:/etc/keepalived/   ## 上传配置文件到对方主机目录下

在LVS+Keepalived(2)上继续进行调整

router_id LVS_02        ## 主为01,备就是02,不一样即可
state BACKUP            ## 角色身份不能一样,要改为BACKUP
priority 90             ## 优先级要改为90

10、在两台LVS上分别启动Keepalived服务

systemctl start keepalived

11、在win10客户机上打开命令提示符,测试VIP连通性

dzXnS0.png

打开浏览器,访问VIP地址192.168.100.10,出现Web页面说明成功!
dzXulV.png

猜你喜欢

转载自blog.csdn.net/u014042047/article/details/108357909