Nginx+Keepalived实现服务的高可用
- 2019 年 10 月 7 日
- 笔记
1.Keepalived高可用软件
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。
keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。
2.Keepalived高可用故障切换转移原理
Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。
一般情况下,如果我们做小型项目,前端用一个nginx做反向代理即可,大概是这样的

但是,作为互联网项目,纯2C的话必然需要做高可用,不仅后端的Server有N个,Nginx同样需要有N个,一主N备,当有一个服务器挂掉的时候,服务能瞬间切换到其他服务器,大概是这样的

下面就以上图为例,说明一下如何实现server的高可用。
1、准备
虚拟机两台,同样安装nginx,keepalived,最简单的安装方法
yum -y install nginx,
yum -y install keepalived。
如果找不到安装到哪儿了,可以使用whereis nginx查看,这里不再赘述。
网络划分如下
名称 IP 虚拟IP 操作系统
虚拟机1(VM1) 172.17.1.150 172.17.1.160 centos7.5
虚拟机2(VM2) 172.17.1.151 172.17.1.160 centos7.5
2、两台机器都要操作:关闭防火墙,修改nginx首页,启动nginx
* 关闭防火墙
systemctl stop firewalld.service #临时关闭,重启失效
systemctl disable firewalld.service #禁止开机启动
安装nginx
[root@localhost ~]# yum install nginx
修改nginx首页(两台机器分别操作)
[root@localhost ~]# echo "yunweimao" > /usr/share/nginx/html/index.html
[root@localhost ~]# echo "maoxiaopu" > /usr/share/nginx/html/index.html
启动nginx
[root@localhost ~]# service nginx restart
报错:
nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
nginx: configuration file /etc/nginx/nginx.conf test failed
修改:
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf

* 简单起见,我们认为每个nginx都是代理一个服务,只用nginx默认带的静态页作为测试,分别修改页面内容为"yunweimao"和“maoxiaopu”
* 启动nginx
systemctl start nginx
3、修改keepalived的配置文件
主配置如下(默认配置文件:/etc/keepalived/keepalived.conf):
! Configuration File for keepalived
global_defs {
# notification_email {
# }
# notification_email_from [email protected]
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
router_id LVS_DEVEL
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER # 标识为主服务
interface eth0 #绑定虚拟机的IP
virtual_router_id 51 # 虚拟路由id,和从机保持一致
#mcast_src_ip 172.17.1.150 #本机ip
priority 100 #权重,需要高于从机
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ## 执行 Nginx 监控的服务
}
virtual_ipaddress {
172.17.1.160 #/32 brd 255.255.255.0 dev ens33 label ens33:vip #虚拟IP地址
}
}
从机配置(默认配置文件:/etc/keepalived/keepalived.conf)
! Configuration File for keepalived
global_defs {
# notification_email {
# }
# notification_email_from [email protected]
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
router_id dreamer1
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立,权重-20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
mcast_src_ip 172.17.1.151 ## 本机 IP 地址
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ## 执行 Nginx 监控的服务
}
virtual_ipaddress {
172.17.1.160
}
}
3、编写监测心跳脚本
上面配置中可以看到有一个脚本文件:/etc/keepalived/nginx_check.sh
查看nginx是否启动,如果没启动则启动,如果启动不起来,停掉keepalived服务,此时心跳断掉,服务转向另一个nginx。
#!/bin/bash
counter=$(ps -C nginx –no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/sbin/nginx
sleep 2
counter=$(ps -C nginx –no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
4、测试
* 启动172.17.1.150上的nginx和keepalive
* 启动172.17.1.151上的nginx和keepalive
* 访问虚拟IP:http://172.17.1.160

* 停掉172.17.1.150上的keepalive
[root@localhost ~]# service keepalived stop

* 重新启动172.17.1.150上的keepalive,又会回到yunweimao
[root@localhost ~]# service keepalived start
