搞懂Nginx+keepalived实现双机热备,Nginx服务的高可用
目录
何为Nginx服务高可用
keepalived实现Nginx服务的高可用,双机热备
Keepalived故障转移原理
双机主备缺点
环境搭建
环境准备
修改yum镜像源
搭建主节点
安装nginx-master
安装keepalived-master
修改keepalived.conf配置(默认抢占式)
启动keepalived
安装从节点
效果验证
模拟Master节点宕机
何为Nginx服务高可用
在使用 Nginx 做反向代理或者负载均衡的时候,都是以 Nginx 为入口,如果 Nginx 宕机了,那么所有的服务都无法正常提供,影响非常严重。所有我们需要保证 nginx 高可用,就是配置备份机,前一个挂了,还有后一个。
为了避免负载均衡服务器宕机造成严重影响,就需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。
高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是我们不能保证一个系统能永远不出问题,所以我们只能通过设计来尽可能的去减少由于系统的故障所造成的影响。
keepalived实现Nginx服务的高可用,双机热备
我们可以通过 keepalived 来实现 Nginx 的高可用,keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。Keepalived的作用是检测 web 服务器的状态,如果有一台 web 服务器死机或工作出现故障,Keepalived 将能检测到,并将有故障的 web 服务器从系统中剔除,当web服务器工作正常后 Keepalived 会自动将该 web 服务器加入到服务器群中。这些工作全部都会自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。keepalived 可以理解为一个健康检查的软件。
高可用至少需要 2 台服务器,主备都得装上keepalived,当请求访问主服务器时,备份服务器会一直检查主服务器的状态。
keepalived 需要绑定一个虚拟地址 vip ( Virtual IP Address ) ,这个虚拟 ip 地址绑定在哪台服务器上请求就会发送到哪台服务器,一开始会绑定在主服务器上。
Keepalived故障转移原理
Keepalived之间的通过VRRP进行心跳检测
Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。
Keepalived高可用服务对之间的故障切换转移,是通过VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)来实现的。
在Keepalived服务正常工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
双机主备缺点
双机主备最大的缺点就是 浪费,因为需要一台备用机与主机配置一样,一般好一点的主机就很贵,如果主机一直不宕机,那么备机将一直空闲等待,这就造成了一个长期的浪费。
环境搭建
环境准备
- 两台2核心2G的虚拟机
- Master 主节点虚拟机
- Backup 备用节点虚拟机
- ip
- Master 192.168.96.112
- Backup 192.168.96.119
- vip 192.168.96.252 // 虚拟ip,用于访问nginx时使用
- 软件环境
- nginx-1.22.0-1.el7.ngx.x86_64
- keepalived-1.3.5-19.el7.x86_64
修改yum镜像源
一般刚刚安装的虚拟机是没有nginx的yum源
所以需要手动修改yum源镜像
vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
更新,后面一路Y
yum update
搭建主节点
安装nginx-master
install
yum install nginx -y
启动
systemctl start nginx
访问
安装keepalived-master
install
yum -y install keepalived
修改keepalived.conf配置(默认抢占式)
- 先查询网卡名称
ip addr
-
修改配置文件
vi /etc/keepalived/keepalived.conf
-
注释配置文件的这两行数据(这两行数据一个是不跳过检查;一个是周期性脚本)
-
添加nginx 状态检查脚本
vrrp_script chk_http_ port { script "/usr/local/src/nginx_check.sh" # 检测脚本,这个脚本在下面第二步进行创建 interval 1 # (检测脚本执行的间隔)1s weight -21 # 权重,如果这个脚本检测为真,服务器权重+2 }
-
修改 varrp_instance_VI_1的内容,为下面内容
vrrp_instance VI_1 { state MASTER # 主节点MASTER interface ens33 # ip addr 查询到的网卡信息 virtual_router_id 51 priority 100 # 权重信息默认 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.96.250 # 设置虚拟ip }
-
监听nginx 脚本
# 监听nginx 脚本 track_script { chk_http_ port }
-
-
检查nginx状态配置
-
这个时候还不是一个执行脚本,需要更改脚本的执行权限
chmod +x nginx_check.sh
-
复制如下内容到 nginx_check.sh 里面
A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then # 当nginx 关闭,就立刻关闭 keepalived,用于转移虚拟ip到备用机上。 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then systemctl stop keepalived fi fi
-
cd /usr/local/src //切换到/usr/local/sr目录下,执行下面vi创建脚本
vi nginx_check.sh
-
启动keepalived
systemctl start keepalived
安装从节点
从节点配置和主节点的一致,需要更改的地方为下方标记处
效果验证
访问虚拟ip
模拟Master节点宕机
关闭master
systemctl stop nginx
发现自动切换到备用机上去了
重新启动nginx和keepalived
systemctl start nginx
systemctl start keepalived
发现master节点又起来了
发生故障时的邮件通知处理方法可以看另一篇博客实现Nginx挂掉,keepAlived发现故障,切换VIP节点时发送邮件