Keepalived+Nginx实现Web高可用

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、角色罗列一下,这样理解起来应该会容易一些。

master192.168.63.34
backup192.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高可用部署完毕。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值