LVS-DR数据包流向分析

  • 为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-4
    LVS负载均衡群集之DR模式+keepalived群集机构(理论+实践篇)_第1张图片

  • Client向目标VIP发出请求, Director (负载均衡器)接收
  • Director根据负载均衡算法选择RealServer 1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer 1的MAC地址,然后在局域网上发送。
  • RealServer_ _1收到这个帧,解封装后发现目标IP与本.机匹配(RealServer事先绑定 了VIP),于是处理这个报文。随后重新封装报文,发送到局域网。
  • Client将收到回复报文。Client认为得到正常的服务 ,而不会知道是哪一台服务器处理的
  • 注意:如果跨网段,那么报文通过路由器经由Internet返回给用户

LVS-DR中的ARP问题

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

解决ARP的两个问题的设置方法

  • 修改/etc/sysctl.conf文件
    • net.ipv4.conf.lo.arp_ignore = 1
    • net.ipv4.conf.lo.arp_announce = 2
    • net.ipv4.conf.all.arp_ignore = 1
    • net.ipv4.conf.all.arp_announce = 2

Keepalived

  • 在企业应用中,单台服务器承担应用存在单点故障的危险,在企业应用集群中,存在了至少两处单点故障危险,单点故障一旦发生,企业服务将发生中断,造成极大的危害

LVS负载均衡群集之DR模式+keepalived群集机构(理论+实践篇)_第2张图片

Keepalived工具介绍

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

  • 支持故障自动切换(Failover)
  • 支持节点健康状态检查(Health Checking)
  • 官方网站: http://www.keepalived.org/

Keepalived实现原理剖析

  • Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能
  • VRRP,虚拟路由冗余协议,是针对路由器的一-种备份解决方案

    • 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
    • 每个热备组内同- -时刻只有一台主路由器提供服务,其他路由器处于冗余状态
    • 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

    Keepalived master服务器的配置

  • Keepalived配置目录位于F/etc/keepalived/
  • keepalived.conf是主配置文件
    • global_ defs ...}区段指定全局参数
    • vrp_ instance实例名称{..}区段指定VRRP热备参数
    • 注释文字以"!"符号开头
    • 目录samples/,提供了许多配置样例作为参考

常用配置选项讲解

  • router_id HA_TEST_R1: 本路由器(服务器)的名称
  • vrrp_instance VI_1 :定义VRRP热备实例
  • state MASTER:热备状态,MASTER表示主服务器
  • interface ens33 :承载VIP地址的物理接口
  • virtual_router_id 1 :虚拟路由器的ID号每个热备组保持-致
  • priority 80:优先级,数值越大优先级越高
  • advert_int 1:通告间隔秒数(心跳频率)
  • auth_type PASS:认证类型
  • auth_pass 123456:密码字串
  • virtual_ipaddress {vip}:指定漂移地址(VIP),可以有 多个

Keepalived备份服务器的配置与master的配置有三个选项不同

  • router_id:设为自有名称
  • state:设为BACKUP
  • priority:值低于主服务器
  • 其他选项与master相同

负载均衡+高可用群集

  • Keepalived的设计目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器、 管理服务器池,而不仅仅用作双机热备
  • 使用Keepalived构建LVS群集更加简便易用,主要优势体现在:
    • 对LVS负载调度器实现热备切换,提高可用性
    • 对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入

LVS——DR模式+keepalived群集实践

LVS负载均衡群集之DR模式+keepalived群集机构(理论+实践篇)_第3张图片

实验环境

  • 虚拟ip地址:192.168.100.10
  • lvs1调度服务器IP地址:192.168.100.110
  • lvs2调度服务器IP地址:192.168.100.111
  • web1服务器IP地址:192.168.100.200
  • web2服务器IP地址:192.168.100.222
  • client测试机IP地址:192.168.100.20

在lvs1调度服务器上安装keepalived,ipvsadm服务

root@lvs1 ~]# yum install keepalived ipvsadm -y
[root@lvs1 ~]# vim /etc/sysctl.conf             //配置路由转发功能
net.ipv4.ip_forward=1                           //路由功能
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0      //proc响应关闭重定向功能
net.ipv4.conf.ens33.send_redirects = 0
[root@lvs1 ~]# sysctl -p                     //加载生效
[root@lvs1 ~]# cd /etc/sysconfig/network-scripts/
[root@lvs1 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0      //复制虚拟网卡的配置文件
[root@lvs1 network-scripts]# vim ifcfg-ens33:0
DEVICE=ens33:0                                    //添加配置文件信息,原有的信息删除
ONBOOT=yes
IPADDR=192.168.100.10
NETMASK=255.255.255.0
[root@lvs1 network-scripts]# cd /etc/init.d/            //创建脚本便于service使用
[root@lvs1 init.d]# vim dr.sh
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.10                              //虚拟ip
RIP1=192.168.100.200                           //真实web服务器ip
RIP2=192.168.100.222
case "$1" in
start)
                /sbin/ipvsadm --save > /etc/sysconfig/ipvsadm               //保存配置
                systemctl start ipvsadm                                       //启动服务
                /sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up   //设置ens33:0地址,广播地址,子网掩码,并开启
                /sbin/route add -host $VIP dev ens33:0               //添加路由网段信息
                /sbin/ipvsadm -A -t $VIP:80 -s rr                    //指定虚拟服务访问入口,指定轮询算法
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g               //指定真实服务器,dr模式
                /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 "ipvsamd Runing ---------[ok]"
                fi
                ;;
*)
                echo "Usage: $0 {start|stop|status}"
                exit 1
esac
exit 0
[root@lvs1 init.d]# chmod +x dr.sh                                //给执行权限

修改lvs1服务器为仅主机模式,并修改网卡配置

[root@lvs1 init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens33       //修改网卡信息
BOOTPROTO=static
IPADDR=192.168.100.110
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
[root@lvs1 init.d]# service network restart                //重启网络服务
[root@lvs1 init.d]# ifup ens33:0                          //开启虚拟网卡
[root@lvs1 init.d]# service dr.sh start                      //开启lvs服务
ipvsadm starting --------------------[ok]
[root@lvs1 init.d]# systemctl stop firewalld.service              //关闭防火墙
[root@lvs1 init.d]# setenforce 0

修改lvs2调度服务器配置

[root@lvs2 ~]# yum install keepalived ipvsadm -y
[root@lvs2 ~]# vim /etc/sysctl.conf                 //配置路由转发功能
net.ipv4.ip_forward=1                        //路由功能
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0     //proc响应关闭重定向功能
net.ipv4.conf.ens33.send_redirects = 0
[root@lvs2 ~]# sysctl -p                   //加载生效
[root@lvs2 ~]# cd /etc/sysconfig/network-scripts/
[root@lvs2 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0    //复制虚拟网卡的配置文件
[root@lvs2 network-scripts]# vim ifcfg-ens33:0
DEVICE=ens33:0                       //添加配置文件信息,原有的信息删除
ONBOOT=yes
IPADDR=192.168.100.10
NETMASK=255.255.255.0
[root@lvs2 network-scripts]# cd /etc/init.d/             //创建脚本便于service使用
[root@lvs2 init.d]# vim dr.sh
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.10      //虚拟ip
RIP1=192.168.100.200          //真实web服务器ip
RIP2=192.168.100.222
case "$1" in
start)
                /sbin/ipvsadm --save > /etc/sysconfig/ipvsadm     //保存配置
                systemctl start ipvsadm             //启动服务
                /sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up   //设置ens33:0地址,广播地址,子网掩码,并开启
                /sbin/route add -host $VIP dev ens33:0            //添加路由网段信息
                /sbin/ipvsadm -A -t $VIP:80 -s rr               //指定虚拟服务访问入口,指定轮询算法
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g         //指定真实服务器,dr模式
                /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 "ipvsamd Runing ---------[ok]"
                fi
                ;;
*)
                echo "Usage: $0 {start|stop|status}"
                exit 1
esac
exit 0
[root@lvs2 init.d]# chmod +x dr.sh             //给执行权限

[root@lvs2 init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens33         //修改网卡信息,切换为仅主机模式
BOOTPROTO=static
IPADDR=192.168.100.111
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
[root@lvs2 init.d]# service network restart           //重启网络服务
[root@lvs2 init.d]# ifup ens33:0                  //开启虚拟网卡
[root@lvs2 init.d]# service dr.sh start              //开启lvs服务
ipvsadm starting --------------------[ok]
[root@lvs2 init.d]# systemctl stop firewalld.service   ##关闭防火墙
[root@lvs2 init.d]# setenforce 0

配置web1节点服务器

[root@web1 ~]# yum install httpd -y         //安装web服务
[root@web1 ~]# systemctl stop firewalld.service          //关闭防火墙
[root@web1 ~]# setenforce 0
[root@web1 ~]# echo "this is kgc web" > /var/www/html/index.html        //创建网站页面
[root@web1 ~]# cd /etc/sysconfig/network-scripts/   
[root@web1 network-scripts]# cp -p ifcfg-lo ifcfg-lo:0          //修改回环网卡的虚拟网卡
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.100.10
NETMASK=255.255.255.0
ONBOOT=yes
[root@web1 network-scripts]# cd /etc/init.d/
[root@web1 init.d]# vim web.sh                 //编写arp脚本
#!/bin/bash
VIP=192.168.100.10
                case "$1" in
                start)
                                ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $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
[root@web1 init.d]# chmod +x web.sh          //给权限

配置web1网卡

[root@web1 init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens33        //修改网卡,仅主机模式
BOOTPROTO=static
IPADDR=192.168.100.200
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
[root@web1 init.d]# service network restart         //重启网络服务
[root@web1 init.d]# service web.sh start         //启动脚本
RealServer Start OK 
[root@web1 init.d]# systemctl start httpd.service       //开启web服务
[root@web1 init.d]# ifup lo:0                 //开启回环虚拟网卡

配置web2节点服务器和web1相同的配置

[root@web2 ~]# yum install httpd -y               //安装web服务
[root@web2 ~]# systemctl stop firewalld.service      //关闭防火墙
[root@web2 ~]# setenforce 0
[root@web2 ~]# echo "this is accp web" > /var/www/html/index.html     //创建网站页面
[root@web2 ~]# cd /etc/sysconfig/network-scripts/   
[root@web2 network-scripts]# cp -p ifcfg-lo ifcfg-lo:0        //修改回环网卡的虚拟网卡
[root@web2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.100.10
NETMASK=255.255.255.0
ONBOOT=yes
[root@web2 network-scripts]# cd /etc/init.d/
[root@web2 init.d]# vim web.sh                //编写arp脚本
#!/bin/bash
VIP=192.168.100.10
                case "$1" in
                start)
                                ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $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
[root@web2 init.d]# chmod +x web.sh             //给权限

配置web2网卡

[root@web2 init.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens33      //修改网卡,仅主机模式
BOOTPROTO=static
IPADDR=192.168.80.222
NETMASK=255.255.255.0
GATEWAY=192.168.80.1
[[email protected]]# service network restart           //重启网络服务
[[email protected]]# service web.sh start            //启动脚本
RealServer Start OK 
[root@web2 init.d]# systemctl start httpd.service       //开启web服务
[root@web2 init.d]# ifup lo:0            //开启回环虚拟网卡

配置lvs1上keepalived部署

[root@lvs1 init.d]# vim /etc/keepalived/keepalived.conf
global_defs {
    ...
    smtp_server 127.0.0.1              //指向本地
    router_id LVS_01        //指定名称,备份服务器不同名称
    ...             
}

vrrp_instance VI_1 {
    state MASTER                 //备份服务器是BACKUP
    virtual_router_id 10        //组号相同
    ...
    auth_pass abc123             //验证密码
    priority 100                //优先级备份小于主服务器
    ...
    virtual_ipaddress {
                192.168.100.10
        }
    ...
virtual_server 192.168.100.10 80 {
...
    real_server 192.168.100.200 80 {
                weight 1
                TCP_CHECK {
                        connect_port 80       
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                }   
        }   
        real_server 192.168.100.222 80 {
                weight 1
                TCP_CHECK {                       //tcp
                        connect_port 80                  //添加端口
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                }   
        }    
}
[root@lvs1 init.d]# systemctl start keepalived.service 
[root@lvs1 init.d]# scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/    //复制到lvs2服务器上

在lvs2服务器上修改keepalived配置文件

[root@lvs2 init.d]# vim /etc/keepalived/keepalived.conf   ##修改keepalive配置文件
router_id LVS_02   ##router_id不能相同
...
state BACKUP     ##备服务器
...
priority 90    ##优先级低于主服务器
[root@lvs2 init.d]# systemctl start keepalived.service    ##启动keepalive服务

使用client测试机测试(访问不到重启全部服务即可)

LVS负载均衡群集之DR模式+keepalived群集机构(理论+实践篇)_第4张图片LVS负载均衡群集之DR模式+keepalived群集机构(理论+实践篇)_第5张图片