nginx基础学习(七):nginx+keepalived搭建主备nginx高可用服务

本文详细介绍了如何配置Keepalived实现Nginx的主备切换,包括安装、配置、脚本编写,并分析了其优缺点。着重讨论了Keepalived在实际生产中的替代方案,如负载均衡和多服务器集群,以及可能的应用扩展到其他服务如Tomcat。
摘要由CSDN通过智能技术生成

目前最后一篇关于nginx的文章,这篇文章是做一个知识的了解,在实际生产中基本不使用,因为这种方式有更好的替代方案,但是为什么要说一下呢。面试的时候问到nginx的内容肯定都会问关于nginx的宕机问题,然后如何去防治,提高nginx服务的高可用性。nginx+keepalived可以作为装X的内容。如果在回答上首先说了nginx+keepalived的原理,然后再说说不用的理由,使用的替代方案是什么,相信在面试官那也是可以加分的。

keepalived的安装和配置

keepalived目前最新的版本是2.0.10,可以从官方网站上下载(下载地址)。

安装过程
  • 解压安装包

    tar -xvf keepalived-2.0.10.tar.gz
    cd keepalived-2.0.10
    
  • 配置安装目录

    ./configure --prefix=/usr/loacal/keepalived --sysconf=/etc
    

    需要提前创建安装目录/usr/local/keepalived,这里需要指定系统配置文件的位置,因为在keepalived里面,默认是读取/etc/keepalived/keepalived.conf配置文件。

  • 编译安装

    make && make install
    

安装过程很简单,如果在安装过程有什么依赖包没有缺失,可以先安装好依赖,再接着安装。

配置

配置文件是存在/etc/keepalived/目录下,配置文件的名称keepalived.conf,配置文件的内容很多,但是真正需要配置的内容并不多。如下为修改后的配置文件:

! Configuration File for keepalived

global_defs {             #全局配置    
    router_id KL_MASTER       #表示运行Keepalived服务器的一个标识,唯一的
}

vrrp_instance VI_1 {        #vrrp 实例定义部分
    state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface eth0         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    virtual_router_id 66    # 虚拟路由编号,主从要一直
    priority 100            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.200            # 定义虚拟ip,可多设,每行一个
    }
}

这是master的配置,然后就是backup的配置,配置内容基本相同。具体的配置的含义,可以直接看注释。

**说明:**master和backup机器对应的ip地址分别是192.168.0.10192.168.0.20

master和backup都配置好以后直接启动就可以,需要注意的是,这个master和backup不是单独的两台机器来部署,而是部署在对应的nginx服务所在的机器。

启动keepalived
/usr/local/keepalived/sbin/keepalived

这个启动命令和启动nginx的基本相同,只是执行的文件不一样。

这个时候可以通过id addr命令来查看网卡的状态,两台机器都查看,会发现只有在master所在的机器上可以看到eth0网卡上有两个ip地址,其中一个是虚拟的ip(virtual ip),另一个是真实的ip。虚拟ip就是对应keepalived的ip地址。

inet 192.168.0.10
inet 192.168.0.200

如何校验当前走的是虚拟ip呢?其实很简单。平时我们都是通过ping域名来查看ip地址,这次也是一样。具体操作就不展示啦。

keepalived的ip路由

当前keepalived对应的master是在192.168.0.10这台机器上,所有请求都是通过这台机器的nginx,而backup这个时候并不起作用。当master内的keepalived出现问题后,作为backup的机器就会接手master的任务,虚拟ip地址就会路由到backup机器的eth0网卡上。由192.168.0.20来承担nginx的功能,实现无缝对接。

但是关于路由虚拟ip是有问题的,这里提及的是keepalived运行状态来确定虚拟ip路由到那一台机器,而实际上我们应该是通过nginx是否正常运行来确定虚拟ip的路由。

接着上面的问题理一下思路,既然需要关注点应该是nginx,而控制虚拟ip路由的又是keepalived的运行状态。很明显需要将keepalived和nginx的运行状态关联起来。

最后得出一个结论,用keepalived监控当前机器nginx的运行状态,如果nginx挂掉,就尝试去救活,救不活就只能自杀,让keepalived本身也挂掉,这个时候虚拟ip就会路由到另一台机器,也就是backup备用机器。

nginx主备切换

上一个标题已经讨论了基本的思路。其实实现并不难,写一个脚本,用来检测nginx的状态,这个脚本需要放在keepalived里面,随keepalived启动而运行。

心跳脚本:

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then                            
      /usr/local/nginx/sbin/nginx                #重启nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行虚拟ip转移
              killall keepalived    #杀掉,虚拟ip就会漫游到另一台机器                
      fi
fi

脚本已经完成了,但是怎么将脚本和keepalived关联呢?看下面的配置:

# 这一部分放在global_defs下面,两个是同一级别
vrrp_script chk_http_port {
    script "/usr/local/src/chk_nginx_pid.sh" #心跳执行的脚本,就是上面脚本的存储位置
    interval 2                          #(检测脚本执行的间隔,单位是秒)
    weight 2
}
# 这一部分放在vrrp_instance内
track_script {
	chk_http_port            # 调用检测脚本
}

上面的配置内容是放在keepalived.conf配置文件中,配置完成,将keepalived重新启动一下即可。

**验证的方法:**关闭nginx,你会发现nginx就会立即重新启动起来,这个时候就是脚本文件生效了,尝试重启nginx成功。可以通过修改nginx的配置文件(把配置文件改错),然后关闭nginx,重启肯定会失败,再去看看keepalived的运行状态,肯定也是不存在了。这个时候就要到backup机器,看虚拟ip是否已经路由到backup上。

到这里nginx+keepalived的内容就说完了,接下来说说keepalived的优缺点和其替代方案。

keepalived优缺点和替代方案

keepalived优点
  • keepalived是和nginx服务部署在同一台机器,不另外占用机器资源
  • 实现了nginx的高可用,通过简单的心跳检测脚本和nginx建立心跳机制,实时监控nginx的运行状态
  • keepalived通过虚拟ip路由的方式实现类似集群的功能,nginx主备的keepalived服务之间有心跳机制,能够完成虚拟ip的迅速转移,保证服务的高可用
keepalived缺点
  • 只能是两台机器形成主备模式,不能形成更多机器的集群
  • 同一时间只能有一台机器提供服务,在高峰期可能会导致雪崩现象(压力太大,单台机器挂掉,路由到备用机器,同样的压力又导致备用机器挂掉,最终导致整个服务挂掉)
替代方案

在实际应用中keepalived并不多用,更多用到的是将当前的域名绑定到多台机器上,当域名被访问的时候,会轮询的将请求分配到每一台机器上。这样刚好能解决keepalived的两个缺点,既能实现多台nginx的集群服务,又能让nginx集群中的每一台机器互相分担访问的压力。

思考
  • 如果将替代方案和keepalived+nginx的方案同时使用呢?
  • 既然keepalived可以和nginx建立心跳机制,是否可以应用到tomcat上,形成keepalived+tomcat来实现tomcat服务的高可用?
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿洞晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值