Keepalived简介

  • Keepalived是Linux下一个轻量级别的高可用解决方案。高可用:广义来讲,是指整个系统的高可用行;狭义的来讲就是主机的冗余和接管。
    它与HeartBeat实现类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供HA软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,与HeartBeat相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。

Keepalived是什么?

  • Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
  • 后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
  • 健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。

Keepalived的用途

  • Keepalive服务的两大用途:healthcheck和failover
  • ha failover功能:实现LB Master主机和Backup主机之间故障转移和自动切换
  • 这是针对有两个负载均衡器Direator同时工作而采取的故障转移措施,当主负载均衡器失效或者出现故障时,备份的负载均衡器(BACKUP)将自动接管主负载均衡器的所有工作(vip资源以及相关服务):一旦主负载均衡器故障恢复,MASTER又会接管回它原来的工作,二备份复杂均衡器(BACKUP)会释放master是小事它接管的工作,此时两者将恢复到最初各自的角色

LVS cluster nodes healthchecks功能

  • 在keeplive.conf配置记忆可以实现LVS的功能
    keeplive可以对LVS下面的集群节点进行健康检查
  • rs healthcheck功能:负载均衡定期检查RS的可用性决定是否给其分发请求当虚拟的服务器中的某一个甚至是几个真实的服务器同时出现故障无法提供服务时,负载均衡器会自动将失效的RS服务器从转发队列中清除出去,从而保证用户的访问不收影响;
  • 当故障的RS服务器被修复后,系统又自动的将他们加入转发队列,分发请求提供正常服务。

工作原理

haproxy keepalived 高可用 检测脚本 keepalived实现高可用_均衡器

keepalive故障切换转换原理

  • Keepalived高可用对之间是通过 VRRP进行通信的, VRRP是遑过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
  • 在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。

VRRP协议的简单介绍

  1. VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
  2. VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。
  3. VRRP用 IP多播的方式(默认多播地址(224.0_0.18))实现高可用对之间通信。
  4. 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。
  5. VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码

Keepalived概述

  • Keepalived实现高可用集群(HA)
  • Keepalived最初为LVS设计,专门监控各种服务器节点状态
  • Keepalived后来加入了VRRP功能,防止单点故障
  • 现在通常与其他负载均衡技术搭配使用
  • 虚拟冗余路由协议:VRRP
  • VRRP是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上VRRP路由器中的任意一台。控制虚拟路由器IP地址VRRP路由器成为主路由器。

vrrp路由协议的三种状态

  • initeialize 初始化的状态,系统启动之后进入的一种初始化状态,初始化状态下kp x虚拟vrrp不会对路由冗余
  • master 主路由
  • backup 备路由

keepalived核心模块有

  • core 内核模块 负责主进程的启动,维护和全局配置文件的加载;
  • vrrp 实现路由冗余模块这时keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能
  • check 健康检测模块 这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离

环境搭建

Keeplived两台 web服务两台 Vip 192.168.1.100
192.168.1.166 keepaliaved +nginx
192.168.1.170 keepaliaved +nginx
192.168.1.171 web1
192.168.1.172 web2

haproxy keepalived 高可用 检测脚本 keepalived实现高可用_服务器_02

192.168.1.166

yum -y install vim lrzsz ntpdate wget

第一种使用互联网时间同步

ntpdate ntp1.aliyun.com     时间同步

如果时间未进行同步执行

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

第二种方式
各个节点时间同步,启用时间同步服务systemctl start chronyd

Keepalived服务安装
环境准备:关闭防火墙、关闭SELinux、配置YUM源

systemctl stop firewalld

systemctl enable firewalld

setenforce 0

确保Keepalive使用的网卡开启了多播,如下图:

haproxy keepalived 高可用 检测脚本 keepalived实现高可用_云计算_03


如果没有开启,可以使用该命令打开ip link set multicast on dev ens33,ens33是网卡名称。

Keepalived软件包镜像自带,配置好yum源可直接安装
或者wget https://www.keepalived.org/software/keepalived-2.0.15.tar.gz

yum -y install keepalived

进入配置文件目录

cd /etc/keepalived/

备份配置文件

cp keepalived.conf{,.`date +%F`}

Keepalived配置文件解析

vim /etc/keepalived/keepalived.conf
#  vrrp_strict	//注释改行,否则keepalived会开启iptables防火墙
! Configuration File for keepalived
vrrp_script chk_nginx {     #脚本模块
    script  "/etc/keepalived/ch_nginx.sh"    #脚本路径
interval 2    #检测脚本时间2秒
#weight 10    #优先级
}
global_defs {                #全局变量
   notification_email {       # 邮件通知信息
     123@qq.com      # 定义收件人
   }
   Ceshi@qq.com    # 定义发件人
   smtp_server 192.168.1.46      # SMTP服务器地址(邮箱服务器地址)
   smtp_connect_timeout 30    #超时时间
   router_id LVS_DEVEL      # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
}
#一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
    state MASTER         # 定义初始状态,可以是MASTER或者BACKUP
    interface ens33        #当前使用的网卡名
    virtual_router_id 51     #虚拟路由id号
    priority 100            #当前服务器优先级,数字越大越优先
    advert_int 1           #检测心跳时间为1秒
    authentication {        #身份验证方式通信认证机制,这里是明文认证还有一种是加密认证
        auth_type PASS     #密码验证
        auth_pass 1111      #密码为1111
    }
track_script {            #添加监控条件
    chk_nginx          #脚本模块后边定义的名称
    } 
    virtual_ipaddress {
    192.168.1.100/24         #VIP地址
    }
}
-------------------以下根据需求配置()--------
virtual_server 192.168.1.100 80 {
    delay_loop 6#健康检查时间
    lb_algo rr#调度算法 轮询的意思
    lb_kind DR#keepalived使用的LVS工作模式 一般公司用的最多的是DR模式
    nat_mask 255.255.255.0
    persistence_timeout 50#会话保持的连接时间 就是session连接时间
protocol TCP#使用协议
##后端服务可以不用配置
real_server 9.227.127.166 80 {#后端服务地址
   weight 1
}
}

启动keepalived

Systemctl start keepalived

重启keepalived

systemctl restart keepalived

查看keepalived日志

tail -f /var/log/messages

Keepalived监控Nginx状态

  • 编写监控脚本(MASTER、BACKUP均编写此脚本)
vim /etc/keepalived/ch_nginx.sh
#bin/bash
counter=$(ps -C nginx |grep -v PID |wc -l)    //取命令结果赋值给变量
if [ $counter==0 ];then     //判断变量里的值如果等于0
        /usr/local/nginx/sbin/nginx    //启动nginx服务
        sleep 5     //由于启动服务需要时间,休眠5秒
        counter=$(ps -C nginx |grep -v PID |wc -l)
        if [ $counter==0 ];then    //在判断变量里的值如果还等于0
                systemctl stop keepalived    //停掉keepalived服务
        fi
fi

增加执行权限

chmod +x /etc/keepalived/ch_nginx.sh

验证VIP地址

ip a s

haproxy keepalived 高可用 检测脚本 keepalived实现高可用_服务器_04

源码部署Nginx

下载 wget http://nginx.org/download/nginx-1.14.0.tar.gz

安装nginx依赖包

yum -y install gcc pcre-devel openssl-devel

haproxy keepalived 高可用 检测脚本 keepalived实现高可用_服务器_05


解压到指定目录

tar -xf nginx-1.14.0.tar.gz -C /usr/local/
groupadd nginx
useradd -g nginx nginx

检测环境

./configure

编译并安装

make && make install
echo $?
0

启动nginx

/usr/local/nginx/sbin/nginx

访问测试 http:192.168.1.166

haproxy keepalived 高可用 检测脚本 keepalived实现高可用_nginx_06


Nginx负载均衡配置

upstream webserver{
                server 192.168.1.171;
                server 192.168.1.172;
        }
        location / {
                proxy_pass http://webserver;
            root   html;
index  index.html index.htm;
        }

192.168.1.170

Keepalived+nginx 和166一样配置,注意keepalived的状态一套改成backup

yum -y install vim lrzsz ntpdate wget
ntpdate ntp1.aliyun.com    时间同步

如果时间未进行同步执行

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Keepalived服务安装 环境准备:
关闭防火墙、关闭SELinux、配置YUM源

systemctl stop firewalld
systemctl enable firewalld
setenforce 0

Keepalived软件包镜像自带,配置好yum源可直接安装

yum -y install keepalived

进入配置文件目录

cd /etc/keepalived/

备份配置文件

cp keepalived.conf{,.`date +%F`}

Keepalived配置文件解析

vim /etc/keepalived/keepalived.conf
#  vrrp_strict	//注释改行,否则keepalived会开启iptables防火墙
! Configuration File for keepalived
vrrp_script chk_nginx {     #脚本模块
    script  "/etc/keepalived/ch_nginx.sh"    #脚本路径
interval 2    #检测脚本时间2秒
#weight 10    #优先级
}
global_defs {                #全局变量
   notification_email {       # 邮件通知信息
     123@qq.com      # 定义收件人
   }
   Ceshi@qq.com    # 定义发件人
   smtp_server 192.168.1.46      # SMTP服务器地址(邮箱服务器地址)
   smtp_connect_timeout 30    #超时时间
   router_id LVS_DEVEL      # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
}
#一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
    state BACKUP         # 定义初始状态,可以是MASTER或者BACKUP
    interface ens33        #当前使用的网卡名
    virtual_router_id 51     #虚拟路由id号
    priority 100            #当前服务器优先级,数字越大越优先
    advert_int 1           #检测心跳时间为1秒
    authentication {        #身份验证方式通信认证机制,这里是明文认证还有一种是加密认证
        auth_type PASS     #密码验证
        auth_pass 1111      #密码为1111
    }
track_script {            #添加监控条件
    chk_nginx          #脚本模块后边定义的名称
    } 
    virtual_ipaddress {
    192.168.1.100/24         #VIP地址
    }
}

启动keepalived

Systemctl start keepalived

重启keepalived

systemctl restart keepalived

Keepalived监控Nginx状态

编写监控脚本(MASTER、BACKUP均编写此脚本)

vim /etc/keepalived/ch_nginx.sh
#bin/bash
counter=$(ps -C nginx |grep -v PID |wc -l)//取命令结果赋值给变量
if [ $counter==0 ];then//判断变量里的值如果等于0
        /usr/local/nginx/sbin/nginx//启动nginx服务
        sleep 5//由于启动服务需要时间,休眠5秒
        counter=$(ps -C nginx |grep -v PID |wc -l)
        if [ $counter==0 ];then//在判断变量里的值如果还等于0
                systemctl stop keepalived//停掉keepalived服务
        fi
fi

增加执行权限

chmod +x /etc/keepalived/ch_nginx.sh

Nginx安装和上面一致

Nginx负载均衡配置

upstream webserver{
                server 192.168.1.171;
                server 192.168.1.172;
        }
        location / {
                proxy_pass http://webserver;
            root   html;
index  index.html index.htm;
        }

192.168.1.171
安装nginx安装和上面一样

echo web1 > index.html

访问http://192.168.1.171

haproxy keepalived 高可用 检测脚本 keepalived实现高可用_服务器_07


192.168.1.172

安装nginx安装和上面一样

echo web2 > index.html

访问http://192.168.1.172

haproxy keepalived 高可用 检测脚本 keepalived实现高可用_服务器_08

测试验证

访问vip地址192.168.1.100
通过vip 进行访问,可见配置是没有问题的

haproxy keepalived 高可用 检测脚本 keepalived实现高可用_nginx_09

然后停止192.168.1.166 keepalived服务 查看BACKUP端192.168.1.170,是否有VIP切换过来 ip a