云计算学习之路——Keepalived实现高可用

一、Keepalived简介

1、Keepalived是什么?

keepalived是集群管理中保证集群高可用(HA)的一个服务软件,其功能类似于heartbeat,用于防止单点故障

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

2、Keepalived工作原理

keepalived是以虚拟路由冗余协议VRRP为基础来实现高可用功能的,当backup收不到vrrp包时就认为master宕掉了,这时就需要 根据VRRP的优先级来选举一个backup当master,这样我们就能保证集群的高可用。

VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议,可以认为是实现路由器高可用的协议。就是将N台提供相同功能的路由器组成一个路由组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的VIP,master会发送组广播,当backup收不到VRRP包就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,从而保证路由器的高可用。

如何判断谁是master:看vip在哪台服务器,谁就是master

keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的

什么是脑裂?
脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,backup抢资源,master不认为自己会死,他俩抢着为客户端服务,结果会导致系统混乱,数据损坏。

二、实战:Keepalived+Nginx(实现Nginx负载均衡的高可用)

1、实验环境与架构

1)实验环境:

共需要五台虚拟机:
虚拟机1,虚拟机2:安装nginx.。
使用nginx的web服务器功能,作为真正的web服务器提供服务。

虚拟机3,虚拟机4:安装nginx和keepalived。
作用有两个:1、使用nginx的负载均衡功能,作为负载均衡服务器转发用户请求到真实服务器中。2、安装keepalived实现负载均衡的高可用,虚拟机3作为master,虚拟机4作为backup。

虚拟机5:作为客户端,用于集群的测试,无需任何配置。

2)实验架构
在这里插入图片描述

2、web服务器搭建

为了省时间,直接在nginx默认发布目录/usr/share/nginx/html/index.htm中写入测试内容,没有重新编写配置文件。

虚拟机1进行如下操作:

安装并开启nginx,并在nginx默认发布目录中写入测试内容

[root@web-1 ~]# yum -y install nginx
[root@web-1 ~]# systemctl start nginx
[root@web-1 ~]# echo web-1 > /usr/share/nginx/html/index.html

虚拟机2进行如下操作:

同虚拟机1 的操作一样

[root@web-2 ~]# yum -y install nginx
[root@web-2 ~]# systemctl start nginx
[root@web-2 ~]# echo web-2 > /usr/share/nginx/html/index.html

虚拟机5进行如下操作

验证两台web服务器是否搭建好
在这里插入图片描述

3、负载均衡服务器的搭建

虚拟机3实现负载均衡进行如下操作:

[root@nginx-master ~]# vim /etc/nginx/nginx.conf
在这里插入图片描述
[root@nginx-master ~]# vim /etc/nginx/conf.d/default.conf
在这里插入图片描述
[root@nginx-master ~]# nginx -s reload#重建加载配置文件

虚拟机4实现负载均衡进行如下操作:

与虚拟机3的配置一样,只需改变地址池的名称即可

[root@nginx-backup ~]# vim /etc/nginx/nginx.conf
在这里插入图片描述
[root@nginx-backup ~]# vim /etc/nginx/conf.d/default.conf
在这里插入图片描述
[root@nginx-backup ~]# nginx -s reload#重建加载配置文件

虚拟机5进行如下操作:

验证负载均衡

在这里插入图片描述访问负载均衡服务器,可以实现轮流访问真实服务器,负载均衡配置成功

4、Keepalived实现负载均衡高可用的搭建

虚拟机3,虚拟机4进行如下操作:

1)安装keepalived

[root@nginx-master ~]# yum -y install keepalived

2)备份keepalived的配置文件

[root@nginx-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

3)修改配置文件

[root@nginx-master ~]# vim /etc/keepalived/keepalived.conf

将文件内容全部清空,添加如下配置

! Configuration File for keepalived

global_defs {
    
                   #全局配置
   router_id director1      #用于识别master与backup,在backup服务器中,此项改为director2
}

vrrp_instance VI_1 {
    
             #vrrp协议配置,用于实现高可用
    state MASTER             #定义此台服务器的角色
    interface ens33          #指定VIP地址绑定的接口,设置为网卡名称
    virtual_router_id 80
    priority 100             #设置优先级,master设置为100,backup设置为50
    advert_int 1
    authentication {
    
    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    
    
        192.168.58.140/24    #设置虚拟IP,即VIP,需要与服务器ip在同一网段
    }
}

在这里插入图片描述

4)虚拟机4与虚拟机3进行相同操作,只有配置文件的内容不同

在这里插入图片描述
5)开启Keepalived(主备两台均开启)

[root@nginx-master ~]# systemctl enable keepalived#设置开机自启
[root@nginx-master ~]# systemctl start keepalived#启动keepalived

[root@nginx-backup ~]# systemctl enable keepalived#设置开机自启
[root@nginx-backup ~]# systemctl start keepalived#启动keepalived

6)ip a查看vip
在这里插入图片描述

7)虚拟机5访问vip
在这里插入图片描述

5、Keepalived高可用的验证

1)模拟keepalived集群出现故障,master宕机,验证高可用是否生效

master服务器关闭keepalived
[root@nginx-master ~]# systemctl stop keepalived

虚拟机5访问vip
在这里插入图片描述

backup服务器查看vip
在这里插入图片描述
在这里插入图片描述

2)当master恢复正常,查看高可用集群的vip

在这里插入图片描述
由于master的优先级为100,backup的优先级为50,当master服务器恢复正常后,vip会迅速的重新回到master中,master服务器重新成为Keepalived集群中的master

6、健康检测功能

在本实验中keepalived高可用可以解决负载均衡的单点故障,但是不能解决Nginx的web服务器故障。

为了解决这个问题,启用Keepalived的健康检测功能,让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived

1)编写健康检测脚本(两台keepalived服务器都做如下操作)

[root@nginx-master ~]# vim /etc/keepalived/check_nginx_status.sh
在这里插入图片描述

脚本内容如下:

#!/bin/bash
/usr/bin/curl -I http://localhost &> /dev/null
if [ $? -ne 0 ];then
       systemctl start nginx
       if [$? -ne 0 ];then
               systemctl stop keepalived
       fi
fi

2)在keepalived中引入健康监测模块并调用

[root@nginx-master ~]# vim /etc/keepalived/keepalived.conf
在这里插入图片描述

脚本升级

1)使用进程的方式来判断nginx是否可以用,如下:
ps -C nginx --no-heading | wc -l
在nginx正常运转时,使用此命令,回显2;当nginx不运转时,此命令回显0,故可以采用此命令来判断nginx是否宕机。
在这里插入图片描述

2)编写脚本
在这里插入图片描述

脚本内容如下:

counter=`ps -C nginx --no-heading | wc -l`
if [ ${
    
    counter} -eq 0 ];then
        systemctl start nginx
        counter=`ps -C nginx --no-heading | wc -l`
        if [ ${
    
    counter} -eq 0 ];then
                systemctl stop keepalived
        fi
fi

有人提出在此脚本中基础上实现当nginx能够正常开启的时候自动开启keepalived的功能,其实没有这个必要。此脚本的逻辑是:
 ①当nginx服务宕机后,首先先尝试重新开启nginx服务,若能够重新开启,就不会进入到stop keepalived的判断语句中。
 ②若重启nginx不成功,就会停止keepalived,实现VIP漂移,重新选举master。
 ③需要明白的是:有人说在nginx宕机后,经过排错后nginx可以正常使用的情况下,应该在脚本里边加上此种情况下重新启动keepalived的功能。但是我们应该明白,当nginx宕机后,又不能重新启动的情况下,脚本就会停止keepalived,这时keepalived就不会检测脚本了,就算后来将nginx修复好,此时keepalived也已经停止,也不能实现检测脚本功能。目前我们还不能做到nginx的自动排错,需要人工排错,当我们为nginx排完错,手动开启nginx和keepalived就好。

3)验证

1、关闭nginx,模拟nginx宕机,但是vip没有漂移,说明脚本生效又重新开启了nginx
在这里插入图片描述

2、故意向nginx.conf配置文件添加错误,使nginx不能重新启动

[root@nginx-master ~]# vim /etc/nginx/nginx.conf
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44178770/article/details/124521985
今日推荐