Keepalived+Nginx实现Web高可用

xiaoquanzeilaniu 2024-10-06 16:33:02 阅读 92

Keepalived 工作原理

     在讲述keepalived工作原理之前,大家先来了解一个协议VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)。它是实现路由高可用的一种通信协议,在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master(主)角色和N(N>=1)个backup(备用)角色。工作时 master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master。

      而keepalived就是采用这种VRRP协议实现的高可用。keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析; check模块负责健康检查;vrrp模块用来实现VRRP协议。

节点规划

     VRRP协议有1个master角色和至少1个backup角色,所以做本实验需要准备至少两台Linux机器。

     生产环境中,诸多企业把Nginx作为负载均衡器来用,它的重要性很高,一旦宕机会导致整个站点不能访问,所以有必要再准备一台备用Nginx,keepalived用在这种场景下非常合适。在配置  之前,先把两台机器的IP、角色罗列一下,这样理解起来应该会容易一些。

master 192.168.63.34
backup 192.168.63.35

 VIP:192.168.63.100

    VIP的英文名字是“Virtual IP”,即“虚拟IP”,也有人把它叫作“浮动IP”。因为这个IP是由keepalived给服务器配置上的,服务器靠这个VIP对外提供服务,当master机器宕机,VIP被分配到backup上。

案例实施

一、基础配置

将两台机机器分别改名为master、backup,并关闭两个节点的防火墙。

[root@localhost ~]# hostnamectl set-hostname master

[root@localhost ~]# bash

[root@master ~]# setenforce 0

[root@master ~]# systemctl stop firewalld

[root@localhost ~]# hostnamectl set-hostname backup

[root@localhost ~]# bash

[root@backup ~]# setenforce 0

[root@backup ~]# systemctl stop firewalld

两个节点都安装keepalived,Nginx服务。我这边是使用yum直接安装的.

yum install -y keepalived

yum insatll -y nginx

二、配置文件

编辑master的keepalived配置文件

[root@master ~]# vi /etc/keepalived/keepalived.conf 

global_defs {         #全局配置标识,表明这个区域{}是全局配置

   notification_email {

        acassen@firewall.loc

        failover@firewall.loc

        sysadmin@firewall.loc   #表示发送通知邮件时邮件源地址是谁

   }

   notification_email_from Alexandre.Cassen@firewall.loc    #表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个

   smtp_server 192.168.200.1     #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现

   smtp_connect_timeout 30    #连接smtp连接超时时间

   router_id LVS_DEVEL      #机器标识

}

vrrp_script chk_nginx {

    script "/usr/local/sbin/check_ng.sh"    #检查服务是否正常,通过写脚本实现,脚本检查服务健康状态

    interval 3    #检查时间间断是3秒

    }

vrrp_instance VI_1 {        #VRRP配置标识 VI_1是实例名称

    state MASTER        #定义master相关

    interface ens33    #通过vrrp协议去通信、去发广播。此为网卡名

    virtual_router_id 51   #定义路由器ID ,配置的时候和从机器一致

    priority 100   #权重,主角色和从角色的权重是不同的,一般主比从大

    advert_int 1  #设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒

    authentication {        #认证相关信息

        auth_type PASS      #认证类型

        auth_pass 1111     #密码的形式是一个字符串

    }

    virtual_ipaddress {     #设置虚拟IP地址 (VIP),又叫做漂移IP地址

        192.168.63.100

    }

    track_script {       #加载脚本

        chk_nginx

    }

}

keepalived要实现高可用,监控Nginx服务是必不可少的,它本身没有这个功能,所以我们要添加一个脚本来监控Nginx,注意脚本的位置需要与keepalived配置文件中保持一致。

[root@master ~]# vi /usr/local/sbin/check_ng.sh

#!/bin/bash

  #时间变量,用于记录日志

d=`date --date today +%Y%m%d_%H:%M:%S`

#计算nginx进程数量

  n=`ps -C nginx --no-heading|wc -l`

#如果进程为0,则启动nginx,并且再次检测nginx进程数量

  if [ $n -eq "0" ]; then

          systemctl satrt nginx

          n2=`ps -C nginx --no-heading|wc -l`

#如果还为0,说明nginx无法启动,此时需要关闭keepalived

          if [ $n2 -eq "0"  ]; then

                  echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log

                  systemctl stop keepalived

          fi

 fi

编辑完成监控Nginx的脚本,需要给他x权限,否则无法被keepalived调用。

[root@master ~]# chmod a+x /usr/local/sbin/check_ng.sh 

完成以上操作,就可以启动master上的keepalived了

[root@master ~]# systemctl start keepalived

[root@master ~]# ip add

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 00:0c:29:85:b1:68 brd ff:ff:ff:ff:ff:ff

    inet 192.168.63.34/24 brd 192.168.63.255 scope global noprefixroute ens33

       valid_lft forever preferred_lft forever

    inet 192.168.63.100/32 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::d305:99ac:5a8a:599/64 scope link noprefixroute 

       valid_lft forever preferred_lft forever

可以看到master上已经自动配置了192.168.63.100这个ip。如果没有启动Nginx服务,它会帮我们自动拉起来,查看一下:

[root@master ~]#  ps aux |grep nginx

root       9572  0.0  0.0  46340   972 ?        Ss   13:46   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

nginx      9573  0.0  0.1  46748  1936 ?        S    13:46   0:00 nginx: worker process

root       9652  0.0  0.0 112724   988 pts/0    S+   13:46   0:00 grep --color=auto nginx

master上配置完成接下来配置backup,和master一样首先配置文件。

[root@backup ~]# vi /etc/keepalived/keepalived.conf  

global_defs {

   notification_email {

        acassen@firewall.loc

        failover@firewall.loc

        sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_script chk_nginx {

    script "/usr/local/sbin/check_ng.sh"

    interval 3

    }

vrrp_instance VI_1 {

    state BACKUP

    interface ens33

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111>g

    }

    virtual_ipaddress {

        192.168.63.100

    }

    track_script {

        chk_nginx

    }

}

编辑监控脚本。

[root@backup ~]# vi /usr/local/sbin/check_ng.sh 

d=`date --date today +%Y%m%d_%H:%M:%S`

n=`ps -C nginx --no-heading|wc -l`

if [ $n -eq "0" ]; then

        systemctl start nginx

        n2=`ps -C nginx --no-heading|wc -l`

        if [ $n2 -eq "0"  ]; then

                echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log

                systemctl stop keepalived

        fi

fi

同样给他x权限:

[root@backup ~]# chmod a+x /usr/local/sbin/check_ng.sh 

启动keepalived服务:

[root@backup ~]# systemctl start keepalived

验证

首先修改两个节点的index.html文件以便区分

[root@master ~]# vi /usr/share/nginx/html/index.html

打开浏览器搜索vip

看到显示的是master节点,我们吧master节点Nginx关掉,假装服务宕机,但是需要注意把脚本改一下,只需在启动nginx那段代码前边加一个注释号就可以,不然脚本会自动启动nginx。

在启动master节点nginx服务,keepalived服务。

此时VIP又回到了master上,至此 Keepalived+Nginx实现Web高可用部署完毕。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。