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

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

keepalived的安装和配置

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

安装过程
  • 解压安装包

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

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

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

  • 编译安装

    1
    make && make install

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

配置

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
! 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
1
/usr/local/keepalived/sbin/keepalived

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

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

1
2
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启动而运行。

心跳脚本:

1
2
3
4
5
6
7
8
#!/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关联呢?看下面的配置:

1
2
3
4
5
6
7
8
9
10
# 这一部分放在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服务的高可用?


本文作者:IT-CRUD
原文地址:http://blog.itcrud.com/blogs/2019/01/nginx-keepalived-original
版权归作者所有,转载请注明出处

推荐文章

支付宝 微信

如果文章对你有帮助,欢迎点击上方按钮打赏作者