目前最后一篇关于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.10
和192.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服务的高可用?