企业实战(14)基于LVS-DR模式负载均衡+Keepalived高可用集群实战详解

Keepalived简介

 keepalived 是linux下一个轻量级的高可用解决方案,它与HACMP实现功能类似,都可以实现服务或者网络的高可用,但是又有差别:hacmp是一个专业的、功能完善的高可用软件,它提供了HA软件所需的基本功能,比如心跳检测和资源接管,检测集群中的系统服务,在集群节点间转移共享ip地址所有者等,hacmp功能强大,但是部署和使用相对麻烦,同时也是商业化软件,与hacmp相比,keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然他没有hacmp功能强大,但是keepalived部署使用相对简单,所有配置只需要一个配置文件即可完成。

Keepalived是什么?

 Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。

健康检查失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用Tcp三次握手、Icmp请求,Http请求,Udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。

Keepalvied的工作原理

 Keepalived对服务器运行状态和故障隔离的工作原理:

 Keepalived工作在TCP/IP参考模型的三层、四层、五层(物理层,链路层):
 网络层(3):Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

 传输层(4):Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

 应用层(5):,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。

VRRP协议与工作原理

 在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。

 VRRP协议是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信。
在这里插入图片描述
虚拟路由器: 虚拟路由器是VRRP备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个 一样,可以理解为在一个组中: 主路由器+所有备份路由器=虚拟路由器。虚拟路由器有一个虚拟的IP地址和MAC地址。主机将虚拟路由器当作默认网关。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。

主路由器(MASTER): 虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部同一时间只有一台物理路由器对外提供服务,这台提供服务的物理路由器被称为主路由器。一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP数据转发等。

备份路由器(BACKUP): 虚拟路由器中的其他物理路由器不拥有对外的虚拟IP,也不对外提供网络功能,仅接受MASTER的VRRP状态通告信息,这些路由器被称为备份路由器。当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。

工作过程

 路由器使用VRRP 功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为Master 路由器,优先级低的成为Backup 路由器。Master 拥有对外服务的虚拟IP,提供各种网络功能,并定期发送VRRP 报文,通知备份组内的其他设备自己工作正常;Backup 路由器只接收Master 发来的报文信息,用来监控Master 的运行状态。当Master 失效时,Backup 路由器进行选举,优先级高的Backup 将成为新的Master 。

 在抢占方式下,当Backup 路由器收到VRRP 报文后,会将自己的优先级与报文中的优先级进行比较。如果大于通告报文中的优先级,则成为Master 路由器;否则将保持Backup状态;

 在非抢占方式下,只要Master 路由器没有出现故障,备份组中的路由器始终保持Master 或Backup 状态,Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器;

 如果Backup 路由器的定时器超时后仍未收到Master 路由器发送来的VRRP报文,则认为Master 路由器已经无法正常工作,此时Backup 路由器会认为自己是Master 路由器,并对外发送VRRP报文。备份组内的路由器根据优先级选举出Master 路由器,承担报文的转发功能。

LVS-DR负载均衡+Keepalived高可用实战

使用Keepalived为LVS调度器提供高可用功能,防止调度器单点故障,为用户提供Web服务。
LVS1调度器真实IP地址为192.168.2.130
LVS2调度器真实IP地址为192.168.2.132
服务器VIP地址设置为192.168.2.150/32
真实Web服务器地址分别为192.168.2.128、192.168.2.129
使用加权轮询调度算法,真实web服务器权重不同

环境介绍:

 LVS调度服务器1:192.168.2.130/24

 LVS调度服务器2:192.168.2.132/24

 真实服务器1:192.168.2.128/24 lo:0:192.168.2.150/32

 真实服务器2:192.168.2.129/24 lo:0:192.168.2.150/32

 客户端:192.168.2.135/24

一、后端真实服务器配置

1.两台后端服务器128/129分别安装Nginx

[root@localhost ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz

[root@localhost ~]# yum -y install gcc pcre-devel openssl-devel

[root@localhost ~]# useradd -s /sbin/nologin nginx   //创建禁止登陆解释器的用户(为了安全)

[root@localhost ~]# id nginx
uid=1001(nginx) gid=1001(nginx) 组=1001(nginx)

[root@localhost ~]# tar -xf nginx-1.16.1.tar.gz

[root@localhost ~]# cd nginx-1.16.1

[root@localhost nginx-1.16.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module

         --prefix=/usr/local/nginx                   //指定安装路径
         --user=nginx                               //指定用户
         --group=nginx                              //指定组
         --with-http_ssl_module                    //安装ssl模块,开启其中的SSL加密功能(需要什么模块就安装什么模块)
  ......
  ......
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

[root@localhost nginx-1.16.1]#  make && make install    //编译并且安装
......
	'/usr/local/nginx/conf/scgi_params.default'
test -f '/usr/local/nginx/conf/nginx.conf' \
	|| cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf'
cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default'
test -d '/usr/local/nginx/logs' \
	|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/logs' \
	|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/html' \
	|| cp -R html '/usr/local/nginx'
test -d '/usr/local/nginx/logs' \
	|| mkdir -p '/usr/local/nginx/logs'
make[1]: 离开目录“/root/nginx-1.16.1”

[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module

[root@test2 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module

2.创建测试页面

[root@localhost ~]# echo "I am 192.168.2.128" > /usr/local/nginx/html/index.html

[root@test2 ~]# echo "I am 192.168.2.129" > /usr/local/nginx/html/index.html

3.启动Nginx

[root@localhost nginx-1.16.1]# /usr/local/nginx/sbin/nginx 

[root@localhost nginx-1.16.1]# netstat -antulp | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6079/nginx: master

或者[root@localhost nginx-1.16.1]# netstat -antulp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6079/nginx: master

3.关闭防火墙与selinux

两台后端服务器都需要操作。

[root@test2 ~]# systmctl stop firewalld

[root@test2 ~]# setenforce 0

[root@test2 ~]# getenforce
Disabled

[root@test2 ~]# vim /etc/sysconfig/selinux     //永久关闭selinux
SELINUX=disabled

4.后端服务器配置VIP地址

注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样。

-后端128服务器 
[root@localhost ~]# cd /etc/sysconfig/network-scripts/

[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0

[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0            //网卡名称lo:0
IPADDR=192.168.2.150      //这里为VIP地址
NETMASK=255.255.255.255      //必须是32位掩码(即全255)
NETWORK=192.168.2.150      
BROADCAST=192.168.2.150     //为VIP地址
ONBOOT=yes
NAME=lo:0

[root@localhost ~]# systemctl restart network

[root@localhost ~]# ifconfig lo:0    //查看配置的VIP地址
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.2.150  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

-后端129服务器
[root@test2 ~]# cd /etc/sysconfig/network-scripts/
[root@test2 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@test2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0            //网卡名称lo:0
IPADDR=192.168.2.150      //这里为VIP地址
NETMASK=255.255.255.255      //必须是32位掩码(即全255)
NETWORK=192.168.2.150      
BROADCAST=192.168.2.150     //为VIP地址
ONBOOT=yes
NAME=lo:0

[root@test2 ~]#  systemctl restart network

[root@test2 ~]# ifconfig lo:0    //查看配置的VIP地址
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.2.150  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

 以上是防止地址冲突的问题:因为后端服务器也配置与调度器一样的VIP地址,默认肯定会出现地址冲突。

5.后端服务器配置sysctl.conf文件
在这里插入图片描述
在这里插入图片描述

-后端128服务器
[root@localhost network-scripts]# cat >> /etc/sysctl.conf <<EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.lo.arp_ignore = 1
> net.ipv4.conf.lo.arp_announce = 2
> net.ipv4.conf.all.arp_announce = 2
> EOF

[root@localhost network-scripts]# sysctl -p
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward = 1
以下4行配置是新添加的:
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

[root@localhost network-scripts]# systemctl restart NetworkManager
[root@localhost network-scripts]# systemctl restart network

-后端129服务器
[root@test2 network-scripts]# cat >> /etc/sysctl.conf <<EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.lo.arp_ignore = 1
> net.ipv4.conf.lo.arp_announce = 2
> net.ipv4.conf.all.arp_announce = 2
> EOF

[root@localhost network-scripts]# sysctl -p
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

[root@test2 network-scripts]# systemctl restart NetworkManager
[root@test2 network-scripts]# systemctl restart network

以上配置的含义:

当有arp广播问谁是192.168.2.150(VIP)时,本机忽略该ARP广播,不做任何回应,且本机不要向外宣告自己的lo回环地址是192.168.2.150.

二、LVS负载均衡调度器配置

1.两台调度器安装Ipvsadm与Keepalived软件

Keepalived运行原理:

  • Keepalived检测每个服务器节点状态。
  • 服务器节点异常或工作出现故障,Keepalived将故障节点从集群系统中剔除。
  • 故障节点恢复后,Keepalived再将其加入到集群系统中。
  • 所有工作自动完成,无需人工干预。
[root@test3 ~]# yum -y install ipvsadm
[root@test3 ~]# ipvsadm -C
[root@test3 ~]# yum -y install keepalived
[root@test3 ~]# systemctl enable keepalived

[root@VOS3000 ~]# yum -y install ipvsadm
[root@VOS3000 ~]# ipvsadm -C
[root@VOS3000 ~]# yum -y install keepalived
[root@VOS3000 ~]# systemctl enable keepalived

2.修改两台LVS调度器的Keepalived配置

----LVS1调度器-----
[root@test3 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak     //备份原keepalived配置文件
[root@test3 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc         //设置报警收件人邮箱,可以定义多个
   }
   notification_email_from Alexandre.Cassen@firewall.loc    //设置发件人
   smtp_server 127.0.0.1         //定义邮件服务器
   smtp_connect_timeout 30       //连接超时时间
   router_id LVS1          //设置路由ID号(需修改)
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {       //每一个vrrp_instance就定义一个虚拟路由器
    state MASTER         //由初始状态状态转换为master状态(需修改)
    interface ens33      //定义网络接口(根据自己的网卡名称设置,主备可以不同)
    virtual_router_id 51  //虚拟路由的id号,一般不能大于255(主辅VRID号必须一致)(需修改)
    priority 100         //服务器优先级(需修改)
    advert_int 1         //初始化通告
    authentication {      //认证机制
        auth_type PASS
        auth_pass 1111      //密码(主辅服务器密码必须一致)
    }
    virtual_ipaddress {       //虚拟地址VIP(需修改)
        192.168.2.150
    }
}

virtual_server 192.168.2.150 80 {     //设置ipvsadm的VIP规则(需修改)
    delay_loop 6
    lb_algo wrr       //设置LVS调度算法为WRR(需修改)
    lb_kind DR        //设置LVS的模式为DR(需修改)
    #persistence_timeout 50   //注释掉的作用是保持连接,开启后,客户端在一定时间内始终访问相同服务器(超时时间)
    protocol TCP

    real_server 192.168.2.128 80 {    //设置后端web服务器真实IP(需修改)
        weight 1          //设置权重为1(需修改)
        TCP_CHECK {          //对后台real_server做健康检查
            connect_timeout 3   //等待超时时间(访问时等待3秒)
            nb_get_retry 3    //失败后尝试次数(访问失败后再尝试3次访问)
            delay_before_retry 3   //每隔多久执行一次(每隔3秒执行一次)
        }
    }
    real_server 192.168.2.129 80 {     //设置后端web服务器真实IP(需修改)
        weight 2        //设置权重为2(需修改)
        TCP_CHECK {      //对后台real_server做健康检查
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
(以下配置删掉)

[root@test3 ~]# systemctl start keepalived     //启动keepalived服务

[root@test3 ~]# ipvsadm -Ln         //查看自动配置的LVS规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.2.150:80 wrr
  -> 192.168.2.128:80             Route   1      0          0
  -> 192.168.2.129:80             Route   2      0          0

[root@test3 ~]# ip a s ens33     //查看主MASTER服务器的VIP地址
  //因为我的主MASTER服务器的网卡名称是ens33,不是eth0,在keepalived中网卡处配置即可,主备keepalived网卡配置名称可以不同。
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:53:71:a2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.130/24 brd 192.168.2.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.2.150/32 scope global ens33        //VIP地址
       valid_lft forever preferred_lft forever
    inet6 fe80::2c27:a02c:731a:2219/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
--》可以看到主MASTER服务器上的VIP地址

[root@test3 ~]# iptables -F    //因为启动keepalived后会自动配置一条iptables规则,现在清除规则
-------------------------------------------------------

----LVS2调度器-----
[root@VOS3000 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@VOS3000 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS2        //路由ID(与LVS1调度器不同)
}

vrrp_instance VI_1 {
    state BACKUP      //从服务器为BACKUP(与LVS1调度器不同)
    interface eth0
    virtual_router_id 51   //主辅VRID号必须一致
    priority 50      //优先级(与LVS1调度器不同)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111     //主辅服务器密码必须一致
    }
    virtual_ipaddress {
        192.168.2.150      //设置VIP
    }
}

virtual_server 192.168.2.150 80 {     //设置ipvsadm的VIP规则(需修改)
    delay_loop 6
    lb_algo wrr       //设置LVS调度算法为WRR(需修改)
    lb_kind DR        //设置LVS的模式为DR(需修改)
    #persistence_timeout 50   //注释掉的作用是保持连接,开启后,客户端在一定时间内始终访问相同服务器(超时时间)
    protocol TCP

    real_server 192.168.2.128 80 {    //设置后端web服务器真实IP(需修改)
        weight 1          //设置权重为1(需修改)
        TCP_CHECK {          //对后台real_server做健康检查
            connect_timeout 3   //等待超时时间(访问时等待3秒)
            nb_get_retry 3    //失败后尝试次数(访问失败后再尝试3次访问)
            delay_before_retry 3   //每隔多久执行一次(每隔3秒执行一次)
        }
    }
    real_server 192.168.2.129 80 {     //设置后端web服务器真实IP(需修改)
        weight 2        //设置权重为2(需修改)
        TCP_CHECK {      //对后台real_server做健康检查
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

[root@VOS3000 ~]# systemctl start keepalived

[root@VOS3000 ~]# ipvsadm -Ln                     //查看LVS规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.2.150:80 wrr
  -> 192.168.2.128:80             Route   1      0          0
  -> 192.168.2.129:80             Route   2      0          0
                         
[root@VOS3000 ~]# ip a s eth0      //查看VIP配置
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:89:4a:52 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.132/24 brd 192.168.2.255 scope global eth0
    inet6 fe80::20c:29ff:fe89:4a52/64 scope link
       valid_lft forever preferred_lft forever
--》可以看到备用BACKUP服务器上现在没有VIP地址
      
[root@VOS3000 ~]# iptables -F

三、客户端测试

[root@test5 ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.135  netmask 255.255.255.0  broadcast 192.168.2.255
        inet6 fe80::846e:50e9:7d73:abe7  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:58:df:c9  txqueuelen 1000  (Ethernet)
        RX packets 890  bytes 82166 (80.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 343  bytes 30282 (29.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128

 可以看到每当我们执行一次curl命令(相当于刷新一次网页),调度器都会根据权重值轮询到不同的后端真实服务器。

四、故障模拟

keepalived高可用故障转移的原理:

 Keepalived 高可用服务之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。

 在 Keepalived 服务正常工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备 Backup 节点自己还活看,当主 Master 节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master 节点的心跳了,于是调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

1.模拟主LVS负载均衡调度器故障(宕掉)

[root@test3 ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:53:71:a2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.130/24 brd 192.168.2.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.2.150/32 scope global ens33     //VIP地址
       valid_lft forever preferred_lft forever
    inet6 fe80::2c27:a02c:731a:2219/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

[root@test3 ~]# systemctl stop keepalived   

[root@test3 ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:53:71:a2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.130/24 brd 192.168.2.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::2c27:a02c:731a:2219/64 scope link noprefixroute
       valid_lft forever preferred_lft forever 

--主LVS调度器故障,VIP漂移至备用LVS调度器       

2.客户端测试

[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129

可以看到在主LVS调度器宕掉之后,VIP地址漂移至备用LVS调度器上,服务器正常工作。

3.查看备LVS调度器上VIP漂移情况

[root@VOS3000 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:89:4a:52 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.132/24 brd 192.168.2.255 scope global eth0
    inet 192.168.2.150/32 scope global eth0     //VIP地址成功漂移
    inet6 fe80::20c:29ff:fe89:4a52/64 scope link
       valid_lft forever preferred_lft forever

主 Master 节点发生故障,无法发送心跳消息,备节点无法继续检测到来自主 Master 节点的心跳,于是调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。

4.模拟后端真实Web服务器128故障

[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop

5.查看备LVS调度器上集群状态

[root@VOS3000 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.2.150:80 wrr
  -> 192.168.2.129:80             Route   2      0          0

可以看到服务器节点异常或工作出现故障,Keepalived将故障节点从集群系统中剔除。

6.客户端访问

[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129

在后端真实服务器128宕机后,调度器就只会轮询到后端服务器129上,服务器正常工作。

7.主负载均衡LVS调度器恢复工作

[root@test3 ~]# systemctl start keepalived

[root@test3 ~]# ipvsadm -Ln       //查看集群状态
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.2.150:80 wrr
  -> 192.168.2.129:80             Route   2      0          0

[root@test3 ~]# ip a s ens33      //查看VIP
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:53:71:a2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.130/24 brd 192.168.2.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.2.150/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::2c27:a02c:731a:2219/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

可以看到在主LVS调度器恢复工作后,备 Backup 节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

8.备LVS调度器上VIP地址释放

[root@VOS3000 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:89:4a:52 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.132/24 brd 192.168.2.255 scope global eth0
    inet6 fe80::20c:29ff:fe89:4a52/64 scope link
       valid_lft forever preferred_lft forever

9.后端服务器128恢复工作

[root@localhost ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

[root@localhost ~]# ss -antulp | grep :80
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=3016,fd=6),("nginx",pid=3015,fd=6))

10.查看集群状态,客户端测试访问

[root@test3 ~]# ipvsadm -Ln     //查看集群状态
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.2.150:80 wrr
  -> 192.168.2.128:80             Route   1      0          0
  -> 192.168.2.129:80             Route   2      0          0

-客户端测试
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129

可以看到在故障节点(后端服务器128)恢复后,Keepalived自动将其加入到集群系统中,全程无需人工干预。

↓↓↓↓↓↓

最近刚申请了个微信公众号,上面也会分享一些运维知识,大家点点发财手关注一波,感谢大家。 【原创公众号】:非著名运维 【福利】:公众号回复 “资料” 送运维自学资料大礼包哦!
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章