高可用集群——keepalived

发布于:2024-04-20 ⋅ 阅读:(24) ⋅ 点赞:(0)

目录

1 高可用的概念

2 心跳监测与漂移 IP 地址

3 Keepalived服务介绍

4 Keepalived故障切换转移原理介绍

5 Keepalived 实现 Nginx 的高可用集群

5.1 项目背景

5.2 项目环境

5.3 项目部署

5.3.1 web01\web02配置:

5.3.2nginx负载均衡配置

5.3.3 主调度服务器

5.3.4 从调度服务器

5.3.5 项目测试

6 Keepalived+LVS 实现 Nginx 集群

6.1 实验介绍

6.2 实验组网介绍

6.3 实验步骤

步骤1在LVS1和LVS2虚拟机上安装keepalived和ipvs

步骤2修改LVS1的配置文件

步骤 3 修改 LVS2 的配置文件

步骤 4 测试


1 高可用的概念

        高可用集群( High Availability Cluster, HA 集群),其中高可用的含义是最大限度地可以使用。从集群的名字上可以看出,此类集群实现的功能是保障用户的应用程序持久、不间断地提供服务。当应用程序出现故障或者系统硬件、网络出现故障时,应用可以自动、快速从一个节点切换到另一个节点,从而保证应用持续、不间断地对外提供服务,这就是高可用集群实现的功能

心跳监测与漂移 IP 地址

1 、心跳监测
        为了能实现负载均衡、提供高可用服务和执行错误恢复,集群系统提供了心跳监测技术。心跳监测是通过心跳线实现的,可以做心跳线的设备有 RS232 串口线,也可以用独立的一块网卡来跑心跳,还可以共享磁盘阵列等。心跳线的数量应该为集群节点数减 I 。需要注意的是,如果通过网卡来做心跳,每个节点需要两块网卡。其中,一块作为私有网络直接连接到对方机器相应的网卡,用来监测对方心跳。另外一块连接到公共网络对外提供服务,同时心跳网卡和服务网卡的 IP地址尽量不要在一个网段内。心跳监控的效率直接影响故障切换时间的长短,集群系统正是通过心跳技术保持节点间内部通信的有效性 。
2 、漂移 IP 地址
        在集群系统中,除了每个服务节点自身的真实 IP 地址外,还存在一个漂移 1P 地址。为什么说是漂移 IP地址呢?因为这个 IP 地址并不固定。例如,在两个节点的双机热备中,正常状态下,这个漂移 1P 地址位于主节点上,当主节点出现故障后,漂移 IP 地址自动切换到备用节点。因此,为了保证服务的不间断性,在集群系统中,对外提供的服务 IP 地址一定要是这个漂移 IP 地址。虽然节点本身的 IP 地址也能对外提供服务,但是当此节点失效后,服务切换到了另一个节点,连接服务的 IP 地址仍然是故障节点的 IP地址,此时,服务就随之中断。

3 Keepalived服务介绍

    Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入VRRP的功能,VRRPVirtual Router Redundancy protocol(虚拟路由器冗余协议)的缩写VRRP出现的目的就是为了解决静态路由器出现的单点故障问题,它能偶保证网络的不间断、稳定的运行。所有,keepalived一方面具有LVS cluster nodes healthchecks功能,另一方面也具有LVS directors faiover功能。

4 Keepalived故障切换转移原理介绍

        Keepalived dirctors之间的故障切换转移,是通过 VRRP 协议来实现的。在keepalived directors 正常工作时,主 Directors 节点会不断的向备节点广播心跳信息,用以告诉备节 点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的IP 资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时,备节点会释放主节点故障时自身接管的IP 资源及服务,恢复到原来的自身的备用角色。
        
        vrrp协议,英文名称: Virtual Router Redundancy Protocol ,中文名称:虚拟路由器冗余协议。 vrrp 出现就是为了解决静态路由的单点故障,vrrp 是通过一种竞选协议机制来将路由任务交给某台 vrrp 路由器。
MASTER BACKUP
        在一个VRRP 虚拟路由器中,有多台物理的 VRRP 路由器,但是这多台物理的机器并不同时工作,而是由一台称为MASTER 的负责路由工作,其他的都是 BACKUP MASTER 并非一成不变, VRRP 协议让每个VRRP 路由器参与竞选,最终获胜的就是 MASTER MASTER 有一些特权,比如拥有虚拟路由器的 IP 地址,我们的主机就是用这个IP 地址作为静态路由的。拥有特权的 MASTER 要负责转发发送给网关地址的包和响应ARP 请求。
        VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过 IP 多播( multicast )包(多播地址224.0.0.18 )形式发送的。虚拟路由器有 VRID (范围 0-255 )和一组 IP 地址组成,对外表现为一个周知的MAC 地址: 00-00-5E-00-01{VRID} 。所有,在一个虚拟路由器中,不管谁是 MASTER ,对外都是相同的MAC IP (称之为 VIP )。客户端主机并不需要因为 MASTER 的改变而修改自己的路由配置,对他们来说,这周主从的切换时透明的。
        在一个虚拟路由器中,只有作为MASTER VRRP 路由器会一直发送 VRRP 广告包( VRRP
Advertisement message ), BACKUP 不会抢占 MASTER ,除非它的优先级( priority )更高。当
MASTER 不可用时( BACKUP 收不到广告包),多台 BACKUP 中优先级最高的这台会被抢占为 MASTER
keepalived 主要特点如下所示。
        1) Keepalived LVS 的扩展项目,因此它们之间具备良好的兼容性。 这点应该是 Keepalived 部署比其他类似工具更简洁的原因,尤其是相对于Heartbeat 而言, Heartbeat 作为 HA 软件,其复杂的配置流程让许多人望而生畏。
        2)通过对服务器池对象的健康检查,实现对失效机器 / 服务的故障隔离。
        3)负载均衡器之间的失败切换,是通过 VRRPv2 Virtual Router Redundancy Protocol stack 实现的,VRRP 当初被设计出来就是为了解决静态路由器的单点故障问题。
        4)通过实际的线上项目,我们可以得知, iptables 的启用是不会影响 Keepalived 的运行的。 但为了更好 的性能,我们通常会将整套系统内所有主机的iptables 都停用。
        5) Keepalived 产生的 VIP 就是整个系统对外的 IP ,如果最外端的防火墙采用的是路由模式,那就映射此内网IP 为公网 IP

5 Keepalived 实现 Nginx 的高可用集群

5.1 项目背景

        keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。采用nginx+keepalived,它是一个高性能的服务器高可用或者热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现Web服务器端的高可用。使用keepalived可以保证nginx的高可用,他能监控nginx的健康状态,当nginx出现宕机时自动主备切换。

5.2 项目环境

服务器名称 IP 用途
Nginx_Master 192.168.186.100 提供负载均衡
Nginx_Backup 192.168.186.101 提供负载均衡
LVS-DR-VIP 192.168.186.102 网站的VIP地址
Web1服务器 192.168.186.103 提供Web服务
Web2服务器 192.168.186.104 提供Web服务

5.3 项目部署

5.3.1 web01\web02配置:

提供httpd服务
#yum install httpd -y //安装httpd服务
[root@web1 ~]# echo "this is first web" > /var/www/html/index.html
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd
[root@web2 ~]# echo "this is second web" > /var/www/html/index.html
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# systemctl enable httpd

5.3.2nginx负载均衡配置

两台nginx做同样配置

1、安装nginx
[root@Nginx_Backup ~]# yum install nginx -y
2、配置nginx反向代理
[root@Nginx_Master ~]# cd /etc/nginx/conf.d/
[root@Nginx_Master conf.d]# vim web.conf

upstream websrvs{
        server 192.168.186.103:80 weight=1;
        server 192.168.186.104:80 weight=1;
}

server{
        location / {
                proxy_pass http://websrvs;
                index index.html;
        }
} 

5.3.3 主调度服务器

1、安装keepalived
[root@Nginx_Master conf.d]# yum install keepalived -y

2、开发检测nginx存活的shell脚本
[root@Nginx_Master conf.d]# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
        systemctl start nginx
        sleep 3
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
        then
                systemctl stop keepalived
        fi
fi

3、配置keepalived

 

 

5.3.4 从调度服务器

1、安装keepalived
[root@Nginx_Backup ~]# yum install keepalived -y

2、开发检测nginx存活的shell脚本
[root@Nginx_Backup ~]# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
        systemctl start nginx
        sleep 3
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
        then
                systemctl stop keepalived
        fi
fi
3、配置keepalived
state BACKUP //从服务器
priority 150 //优先级

 

 5.3.5 项目测试

启动主从调度的 nginx keepalived
[root@Nginx_Master ~]# systemctl restart nginx keepalived
[root@Nginx_Backup ~]# systemctl restart nginx keepalived

Master,Backup都正常,只有Master对外提供服务
[root@Nginx_Master ~]# systemctl restart nginx keepalived
[root@Nginx_Master ~]# ip a | grep "192.168.186.102"
    inet 192.168.186.102/32 scope global ens33

Master宕机,Backup接替Master对外提供服务

#模拟Master的keepalived服务器停止
[root@Nginx_Master ~]# systemctl stop keepalived 
#此时VIP在Backup上
[root@Nginx_Backup ~]# ip a | grep "192.168.186.102"
    inet 192.168.186.102/32 scope global ens33

Master恢复正常,Master继续提供服务,Backup停止服务  

#模拟Master的keepalived服务恢复正常
[root@Nginx_Master ~]# systemctl restart keepalived 
#此时VIP在Master上
[root@Nginx_Master ~]# ip a | grep "192.168.186.102"
    inet 192.168.186.102/32 scope global ens33

 Master上的nginx服务停止,尝试重新启动nginx

[root@Nginx_Master ~]# systemctl stop nginx
[root@Nginx_Master ~]# systemctl status nginx
	nginx启动正常,keepalived不做切换

6 Keepalived+LVS 实现 Nginx 集群

6.1 实验介绍

        本实验将使用 Keepalived 为 LVS 提供高可用配置,同时 LVS 为后端的 Nginx1 和 Nginx2 提供负载均衡,最终通过 Keepalived+LVS 实现 Nginx 集群。

6.2 实验组网介绍

        LVS1 和 LVS2 通过 keepalived 组成高可用集群,同时向后端的 Nginx1 和 Nginx2 提供负载均衡。

服务器名称 IP
192.168.186.100 LVS1
192.168.186.101 Nginx1
192.168.186.102 Nginx2
192.168.186.103 LVS2
192.168.186.104 Client

6.3 实验步骤

步骤1在LVS1和LVS2虚拟机上安装keepalived和ipvs

使用以下命令在LVS1和LVS2虚拟机上安装keepalived和ipvs

[root@LVS2 ~]# yum install -y keepalived ipvsadm

步骤2修改LVS1的配置文件

将LVS1的配置keepalived配置文件修改为以下内容:

[root@LVS1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
      router_id LVS1	# 设置lvs的id,在一个网络应该是唯一的
}

vrrp_instance Nginx {
    state MASTER	# 指定keepalived的角色,MASTER为主,BACKUP为备
    interface ens33	# 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    mcast_src_ip 20.0.0.1
    virtual_router_id 51	# 虚拟路由编号,主从要一直
    priority 255	 # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1	# 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    	192.168.186.20/24	 # 定义虚拟ip(VIP),可多设,每行一个
    }
}

virtual_server 192.168.186.20 80 {
    delay_loop 6	 # 设置健康检查时间,单位为秒
    lb_algo rr	# 设置负载调度的算法为rr
    lb_kind DR	 # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式
    persistence_timeout 50	 # 同一IP 50秒内的请求都发到同个real server
    protocol TCP

    real_server 192.168.186.101 80 {	# 指定real server1的ip地址
	 weight 1	# 配置节点权值,数值越大权重越高
	 TCP_CHECK {
	 connect_timeout 3
	 retry 3
	 delay_before_retry 3
 	}
 }

    real_server 192.168.186.102 80 {
         weight 2
         TCP_CHECK {
         connect_timeout 3
         retry 3
         delay_before_retry 3
        }
 }
}

步骤 3 修改 LVS2 的配置文件

将 LVS2 的配置 keepalived 配置文件修改为以下内容:

[root@LVS2 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id LVS2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    mcasr_src_ip 20.0.0.2
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    	192.168.186.20/24
    }
}

virtual_server 192.168.186.20 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
   
   real_server 192.168.186.101 80 {
 	weight 1
 	TCP_CHECK {
	 connect_timeout 3
	 retry 3
	 delay_before_retry 3
 	}
 }

   real_server 192.168.186.102 80 {
        weight 2
        TCP_CHECK {
         connect_timeout 3
         retry 3
         delay_before_retry 3
        }
}

步骤 4 测试

配置完成两台 LVS 服务器后,,具体如下:

[root@LVS1 ~]# systemctl restart keepalived.service
[root@LVS2 ~]# systemctl status keepalived.service 
[root@LVS1 ~]# systemctl restart keepalived
[root@LVS1 ~]# 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.186.20:80 rr
  -> 192.168.186.101:80           Route   1      0          0         
  -> 192.168.186.102:80           Route   2      0          0