高可用集群——keepalived

目录

[1 高可用的概念](#1 高可用的概念)

[2 心跳监测与漂移 IP 地址](#2 心跳监测与漂移 IP 地址)

[3 Keepalived服务介绍](#3 Keepalived服务介绍)

[4 Keepalived故障切换转移原理介绍](#4 Keepalived故障切换转移原理介绍)

[5 Keepalived 实现 Nginx 的高可用集群](#5 Keepalived 实现 Nginx 的高可用集群)

[5.1 项目背景](#5.1 项目背景)

[5.2 项目环境](#5.2 项目环境)

[5.3 项目部署](#5.3 项目部署)

[5.3.1 web01\web02配置:](#5.3.1 web01\web02配置:)

5.3.2nginx负载均衡配置

[5.3.3 主调度服务器](#5.3.3 主调度服务器)

[5.3.4 从调度服务器](#5.3.4 从调度服务器)

[5.3.5 项目测试](#5.3.5 项目测试)

[6 Keepalived+LVS 实现 Nginx 集群](#6 Keepalived+LVS 实现 Nginx 集群)

[6.1 实验介绍](#6.1 实验介绍)

[6.2 实验组网介绍](#6.2 实验组网介绍)

[6.3 实验步骤](#6.3 实验步骤)

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

步骤2修改LVS1的配置文件

[步骤 3 修改 LVS2 的配置文件](#步骤 3 修改 LVS2 的配置文件)

[步骤 4 测试](#步骤 4 测试)


1 高可用的概念

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

2 心跳监测与漂移IP地址

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

3 Keepalived****服务介绍

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入VRRP的功能,VRRP是Virtual 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配置文件修改为以下内容:

bash 复制代码
[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 配置文件修改为以下内容:

bash 复制代码
[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 服务器后,,具体如下:

bash 复制代码
[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    
相关推荐
单音GG20 分钟前
推荐一个基于协程的C++(lua)游戏服务器
服务器·c++·游戏·lua
Shepherd06191 小时前
【Jenkins实战】Windows安装服务启动失败
运维·jenkins
安步当歌1 小时前
【WebRTC】视频发送链路中类的简单分析(下)
网络·音视频·webrtc·视频编解码·video-codec
shitian08111 小时前
用轻量云服务器搭建一个开源的商城系统,含小程序和pc端
服务器·小程序·开源
Biomamba生信基地1 小时前
Linux也有百度云喔~
linux·运维·服务器·百度云
米饭是菜qy1 小时前
TCP 三次握手意义及为什么是三次握手
服务器·网络·tcp/ip
yaoxin5211231 小时前
第十九章 TCP 客户端 服务器通信 - 数据包模式
服务器·网络·tcp/ip
new_abc2 小时前
Ubuntu 22.04 ftp搭建
linux·运维·ubuntu
鹿鸣天涯2 小时前
‌华为交换机在Spine-Leaf架构中的使用场景
运维·服务器·网络
星海幻影2 小时前
网络基础-超文本协议与内外网划分(超长版)
服务器·网络·安全