Nginx 配置高可用的集群
本文最后更新于:2 年前
本文部分内容参考了架构文摘的博客【 传送门】
关于高可用
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。
解决的问题
在生产环境上很多时候是以 Nginx 做反向代理对外提供服务,但是一天 Nginx 难免遇见故障,如:服务器宕机。当 Nginx 宕机那么所有对外提供的接口都将导致无法访问。
虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,今天我们使用 keepalived 来实现 Nginx 的高可用。
双机热备方案
这种方案是国内企业中最为普遍的一种高可用方案,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。
- 需要两台 nginx 服务器
- 需要 keepalived
- 需要虚拟 ip
keepalived是什么?
Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此, Keepalived 除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
故障转移机制
Keepalived 高可用服务之间的故障切换转移,是通过 VRRP 来实现的。在 Keepalived 服务正常工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备 Backup 节点自己还活着,当主 Master 节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master 节点的心跳了,于是调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的备用角色。
具体配置
准备工作
需要两台服务器 192.168.17.129 和 192.168.17.131
在两台服务器安装 nginx
在两台服务器安装 keepalived
1
yum install keepalived –y
安装之后,在 etc 里面会生成目录 keepalived,有配置文件 keepalived.conf。
具体配置
对两台服务器做如下配置。
修改 /etc/keepalived/keepalivec.conf 配置文件:
1
vim /etc/keepalived/keepalivec.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL # 主机名字
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔,单位:秒)
weight 2 # 权重
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}在 /usr/local/src 目录中添加检测脚本 nginx_check.sh
1
2
3
4
5
6
7
8
9#!/bin/bash
A=`ps -C nginx 每no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
最终测试
把两台服务器上 nginx 和 keepalived 启动最终测试
1
2/usr/local/nginx/sbin/nginx
systemctl start keepalived.service在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50 访问
把主服务器(192.168.17.129)nginx 和 keepalived 停止,再输入 192.168.17.50
此时依然可以访问到 Nginx 服务器首页,说明我们的高可用配置成功。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!