当前位置: 代码网 > 服务器>服务器>Nginx > 解决方案之关于Nginx高可用方案

解决方案之关于Nginx高可用方案

2024年05月26日 Nginx 我要评论
解决方案:nginx高可用方案关键词 keepalived(主服务器 和 备份服务器 故障时 ip 瞬间无缝交接)vrrp协议(路由器组,提供虚拟ip,一个master和多个backup,组播消息,选

解决方案:nginx高可用方案

关键词

  • keepalived(主服务器 和 备份服务器 故障时 ip 瞬间无缝交接)
  • vrrp协议(路由器组,提供虚拟ip,一个master和多个backup,组播消息,选举backup当master)
  • nginx+keepalived 双机主主模式(俩公网虚拟ip,负载);双机主从模式(热备服务器)

需求:

由于业务扩展,网站的访问量不断加大,负载越来越高。现需要在web前端放置nginx负载均衡。

在生产环境下,nginx作为流量的入口,如果nginx不能正常工作或服务器宕机,将导致整个微服务架构的不可用。

所以结合keepalived对前端nginx实现ha高可用

一、nginx & keepalived

nginx 进程基于master+slave(worker)多进程模型,自身具有非常稳定的子进程管理功能。在master进程分配模式下,master进程永远不进行业务处理,只是进行任务分发,从而达到master进程的存活高可靠性,slave(worker)进程所有的业务信号都 由主进程发出,slave(worker)进程所有的超时任务都会被master中止,属于非阻塞式任务模型。

keepalived是linux下面实现vrrp备份路由的高可靠性运行件。基于keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时ip瞬间无缝交接。二者结合,可以构架出比较稳定的软件lb(load balance)方案。

keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

keepalived是一个基于vrrp协议来实现的服务高可用方案,可以利用其来避免ip单点故障,类似的工具还有heartbeat 、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

二、vrrp协议

vrrp全称 virtual router redundancy protocol,即”虚拟路由冗余协议“。可以认为它是实现路由器高可用的容错协议,即将n台提供相同功能的路由器组成一个路由器组(router group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟ip(vip - virtual ip,也就是路由器所在局域网内其他机器的默认路由),占有这个ip的master实际负责arp相应和转发ip数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据vrrp的优先级来选举一个backup当master,保证路由器的高可用。

在vrrp协议实现里,虚拟路由器使用 00-00-5e-00-01-xx 作为虚拟mac地址,xx就是唯一的 vrid (virtual router identifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播ip地址 224.0.0.18 来定时发送通告消息。每个router都有一个 1-255之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低master的优先权可以让处于backup状态的路由器抢占(pro-empt)主路由器的状态,两个backup优先级相同的ip地址较大者为master,接管虚拟ip。

三、双机高可用解决方案

(1)nginx+keepalived 双机主从模式:

即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟ip,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟ip,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。

(2)nginx+keepalived 双机主主模式:

即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟ip,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟ip(这时由非故障机器一台负担所有的请求)。

四、基础环境准备

两台服务器:192.168.253.11(主), 192.168.253.12(从),每台服务器上分别安装nginx 、keepalived。

cd /usr/local/openresty/nginx/sbin

./nginx -s stop

(1)安装nginx:

# 添加源
sudo rpm -uvh http://nginx.org/packages/centos/7/noarch/rpms/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 安装nginx
sudo yum install -y nginx

# 启动nginx
sudo systemctl start nginx.service

# 浏览器访问测试
http://192.168.253.11/
http://192.168.253.12/

(2)安装keepalived可使用yum直接安装:

yum -y install keepalived

查看keepalived配置文件:

cat /etc/keepalived/keepalived.conf

接下来就是要对该配置文件进行修改,该配置文件在/etc/keepalived/路径下。在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,它是为lvs准备的。 

(3)关闭防火墙(默认关闭) 

(4)关闭selinux(如果不关闭,keepalived不生效)

临时关闭:

[root@localhost ~]# getenforce enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce

permissive

永久关闭:

[root@localhost ~]# vim /etc/sysconfig/selinux

selinux=enforcing 改为 selinux=disabled

重启服务reboot

五、配置主备模式

(1)修改主配置文件:

! configuration file for keepalived

global_defs {
     notification_email {
          acassen@firewall.loc
          failover@firewall.loc
          sysadmin@firewall.loc
     }
     
     notification_email_from alexandre.cassen@firewall.loc
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id master11
}

# nginx挂了,实现vip自动漂移,使用如下脚本控制     
vrrp_script check_nginx {
      script "/usr/local/nginx/nginx_check.sh"
      interval 2  # 机器宕机执行的次数
      weight 2
}

# 当前实例配置
vrrp_instance vi_1 {
     state master   # 主机
     interface ens33  # 绑定的网卡
     virtual_router_id 51   # 组id,需要一致
     priority 100  # 优先级
     advert_int 1  # 检查间隔,默认1s
     
     # 调用nginx挂了之后进行vip漂移的函数  
     track_script {
       	check_nginx
     }
     
     authentication {
       	auth_type pass
       	auth_pass 1111
     }
     
     # 配置vip
     virtual_ipaddress {
        192.168.253.50/24 dev ens33 label ens33:1 scope global
 	 }
}

在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,我们这用不到,它是为lvs准备的。 

(2)/usr/local/nginx/nginx_check.sh :

# 在/usr/local下新建目录nginx
mkdir nginx
# 新建文件
touch nginx_check.sh
# 编辑内容
#!/bin/bash
a=`ps -c nginx --no-header |wc -l`   #查看nginx进程是否存在  
#if [ $a -eq 0 ];then              
  /usr/sbin/nginx         #重启nginx
  if [ $a -eq 0 ];then   #nginx重启失败
    exit 1 # keepalived执行脚本,返回非0结果,ip漂移
  else
    exit 0 # keepalived执行脚本,返回0,ip不漂移
  fi
#else
#  exit 0
#fi

需要给nginx_check.sh文件加可执行权限:

chmod +x nginx_check.sh

(3)修改从机keepalived.conf配置文件:

! configuration file for keepalived
global_defs {
     notification_email {
          acassen@firewall.loc
          failover@firewall.loc
          sysadmin@firewall.loc
     }
    
     notification_email_from alexandre.cassen@firewall.loc
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id backup
}

vrrp_script check_nginx {
     script "/usr/local/nginx/nginx_check.sh"
     interval 2
     weight 2
}

vrrp_instance vi_1 {
     state backup  # 从机
     interface ens33
     virtual_router_id 51  # 组id,需要一致
     priority 99   # 优先级
     advert_int 1
        
     # 调用nginx挂了之后进行vip漂移的函数    
     track_script {
       	check_nginx
     }
     
     authentication {
       	auth_type pass
       	auth_pass 1111
     }
    
     # 配置vip
     virtual_ipaddress {
        192.168.253.50/24 dev eth0 label ens33:1 scope global
     }
}

同样需要在/usr/local/nginx/路径下放上nginx_check.sh脚本文件。 

(4) 启动nginx、keepalived

#主从启动
sudo systemctl restart nginx.service

#主从启动
systemctl start keepalived

(5)访问测试

为效果明显,可以修改nginx首页,将主从ip地址放置首页以便区分。

访问http://192.168.253.50 or curl 192.168.253.50

查看nginx日志:

cd  /var/log/nginx/
cat  access.log

查看主服务器keepalived日志:

keepalived默认所有的日志都是写入到/var/log/message ,

你可以使用命令 tail -f /var/log/messages|grep keepalived 进行查看

查看ens33网卡信息:

ip addr | grep ens33
2: ens33: <broadcast,multicast,up,lower_up> mtu 1500 qdisc
pfifo_fast state unknown group default qlen 1000
 inet 192.168.253.11/24 brd 192.168.253.255 scope
global noprefixroute ens33 
 inet 192.168.253.50/24 scope global secondary ens33:1
#vip已漂移到主机,vip只能选择一个机器进行绑定

(6)停掉主服务器的nginx

通过浏览器访问:http://192.168.253.50

查看主机keepalived日志:

tail -f /var/log/messages|grep keepalived
# 强制停止
pkill -9 nginx

# 查看nginx进程
ps -ef | grep nginx

# 等待几秒后再次查看nginx进程,发现已经通过检查脚本自启
# 因为在keepalived脚本中,进行了nginx重启操作

则会执行脚本nginx_check.sh进行nginx启动!

  • 如果master上的nginx服务挂了,则nginx会自动重启,重启失败后会自动关闭keepalived,这样vip资源也会转移到slave上。
  • master和slave两边都开启nginx服务,无论master还是slave,当其中的一个keepalived服务停止后,vip都会漂移到keepalived服务还在的节点上;
  • 如果要想使nginx服务挂了,vip也漂移到另一个节点,则必须用脚本或者在配置文件里面用shell命令来控制。(nginx服务宕停后会自动启动,启动失败后会会致使vip资源漂移到另一台机器上)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com