分布式专题-高性能的Web容器之Nginx03-Nginx高可用方案

前言

前面我们讲了Nginx的两节内容,主要是基本的使用,这一节,主要讲一下keepalived轻量级的高可用解决方案!

Nginx进程模型简介

Nginx采用的是多进程+多路复用的模型

首先正常启动Nginx,我们发现操作系统有如下进程:
在这里插入图片描述
实际上Nginx启动,会产生两种进程:

  • master进程(管理worker子进程)
  • worker进程(基于master进程fork出来的,可以有多个worker进程)
  1. 当Nginx收到请求后,会向发送一个信号,通过worker进程处理
    在这里插入图片描述
  2. 如果有多个worker进程, 则多个worker进程之间存在竞争,因此在整个模型里,我们认为是worker之间的关系是互斥的。每个进程之间存在增强,去获取处理进程的权力。
  3. 当worker获取权限成功后,此worker来处理当前请求,而处理请求的方式就是多路复用

nginx.conf
在这里插入图片描述
在上一节,我们主要测试了http的相关属性,现在我们看http字段上部的配置文件都是做什么用的?

# 指定用户
#user  nobody;
# 工作进程数,一般将数量设置为当前机器的cpu 总核心数
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    # io 模型(linux)
    use epoll ;	
    # 理论上 并发连接数为 :processes* connections
    worker_connections  1024;
}

Nginx高可用方案

Nginx 作为反向代理服务器,所有的流量都会经过 Nginx,所以 Nginx 本身的可靠性是我们首先要考虑的问题

服务器架构演进过程

裸奔架构

  • 工作流程:客户端访问某某域名,如 www.baidu.com , 则会被 DNS 解析成实际的服务地址并告诉客户端,之后客户端带着服务地址去请求单点的服务器。
  • 架构缺陷:如果 Tomcat 挂掉,DNS 并不知情。
    在这里插入图片描述

集群模式

  • 工作流程:将服务器设置成集群模式,防止单点故障。同时 DNS 采取轮询策略告诉客户端都有哪些机器是你当前域名可以访问的。
  • 架构缺陷:多个客户端访问多个机器可能造成访问不均,导致服务崩溃。
    在这里插入图片描述

Nginx的引入

  • 工作流程:使用Nginx做负载均衡,不论是哪种策略,都可以有效的避免 QPS 问题。
  • 架构缺陷:单点 Nginx 布置,一旦 Nginx 挂掉,则失去负载均衡服务器的意义。
    在这里插入图片描述

Nginx的集群模式

  • 工作流程:通过 Keepalived 实现 Nginx 的高可用(此过程下面会有详细介绍)。
  • 架构缺陷:如果Nginx的吞吐量达到瓶颈怎么办?
    在这里插入图片描述

高性能负载

  • 工作流程:硬负载可以采用 F5 服务器,软负载可以采用 LVS负载均衡
  • 架构缺陷:资金成本预算~实际上成熟的互联网架构多采用这样的方式。
    在这里插入图片描述

Keepalived

Keepalived 是 Linux 下一个轻量级别的高可用解决方案,Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,Keepalived 除了能够管理 LVS 软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL 等)的高可用解决方案软件

Keepalived 软件主要是通过 VRRP 协议实现高可用功能的。VRRP 是 Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行;(简单来说,vrrp 就是把两台或多态路由器设备虚拟成一个设备,实现主备高可用)

所以,Keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能

LVS 是 Linux Virtual Server 的缩写,也就是 Linux 虚拟服务器,在 linux2.4 内核以后,已经完全内置了 LVS 的各个功能模块。

它是工作在四层的负载均衡,类似于 Haproxy, 主要用于实现对服务器集群的负载均衡。

关于四层负载,我们知道 osi 网络层次模型的 7 层模模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层);四层负载就是基于传输层,也就是ip+端口的负载;而七层负载就是需要基于 URL 等应用层的信息来做负载,同时还有二层负载(基于 MAC)、三层负载(IP);
常见的四层负载有:LVS、F5; 七层负载有:Nginx、HAproxy; 在软件层面, Nginx/LVS/HAProxy 是使用得比较广泛的三种负载均衡软件

对于中小型的 Web 应用,可以使用 Nginx、大型网站或者重要的服务并且服务比较多的时候,可以考虑使用 LVS

轻量级的高可用解决方案

通过以上的介绍,现在我们通过keepalived搭建一个轻量级的高可用的负载均衡架构
在这里插入图片描述

粉色框框代表高可用

在实验之前,先了解一些名词

  • LVS 四层负载均衡软件(Linux virtual server):监控 lvs 集群系统中的各个服务节点的状态

  • VRRP 协议(虚拟路由冗余协议)

linux2.4 以后,是内置在 linux 内核中的

lvs负载
4层HAproxy
4层Nginx

在这里插入图片描述

Keepalived离线安装

yum install -y keepalived 在线安装,这里跳过不说,哈哈。主要说一下Keepalived离线安装~

环境准备
linux2: 192.168.200.112(Tomcat、Nginx、Keepalived-master)
linux3: 192.168.200.113(Tomcat、Nginx、Keepalived-backup)
keepalived:keepalived-2.0.20.tar.gz

  1. 下载 keepalived 的安装包
    keepalived下载地址
    开源项目,国内网络无须加速,直接下载即可
    在这里插入图片描述

  2. 在/data/program/目录下创建一个 keepalived 的文件,同时解压keepalived
    在这里插入图片描述

  3. cd 到 keepalived-2.0.20 目录下,执行 ./configure – prefix=/data/program/keepalived --sysconf=/etc
    在这里插入图片描述

  4. 如果缺少依赖库,则 yum install gcc; yum install -y openssl-devel ; yum install -y libnl libnl-devel;yum install -y libnfnetlink-devel
    在这里插入图片描述
    yum安装软件
    在这里插入图片描述
    因为我这里本地之前安装成功过Nginx,所以gcc等依赖是不用安装的,读者可自行根据提示安装不足的软件即可。

    重新执行安装
    重新执行步骤4的安装命令 ./configure – prefix=/data/program/keepalived --sysconf=/etc
    在这里插入图片描述

  5. 安装结束不能报错(下面截图为安装末尾的输出日志):在这里插入图片描述
    否则需要根据缺少的依赖自行安装

  6. 编译安装 make && make install
    在这里插入图片描述
    可能会出现警告,告诉你当前不再安装目录下,但是不要紧,看我们新建的keepalived下是否有文件输出
    在这里插入图片描述

  7. 进入安装后的路径 cd /data/program/keepalived, 创建软连接: ln -s sbin/keepalived /sbin
    在这里插入图片描述

cp /data/program/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d

在这里插入图片描述
分别输入命令:

chkconfig --add keepalived

chkconfig keepalived on

service keepalived start

在这里插入图片描述

图上的报错直接将运行文件放到/usr/sbin下

cp /data/program/keepalived-2.0.20/bin/keepalived /usr/sbin

  1. service keepalived status
    查看keepalived的状态,正在运行表示安装成功!
    在这里插入图片描述
keepalived的配置

keepalived 的默认配置文件地址:/etc/keepalived/keepalived.conf

master

在192.168.200.112这台机器上的keepalived作为master,修改配置文件为:

!Configuration File for keepalived 
global_defs {
     #运行keepalived 服务器的标识,在一个网络内应该是唯一的
     router_id LVS_DEVEL
}
#vrrp 实例定义部分
vrrp_instance VI_1 {	
	#设置 lvs 的状态,MASTER 和 BACKUP 两种,必须大写
    state MASTER	
	#设置对外服务的接口
	interface eth0
    #设置虚拟路由标示,这个标示是一个数字,同一个 vr rp 实例使用唯一标示
    virtual_router_id 51 
    #定义优先级,数字越大优先级越高,在一个 vrrp——instance 下, master 的优先级必须大于 backup
    priority 100 
	#设定 master 与 backup 负载均衡器之间同步检查的时间间隔,单位是秒
	advert_int 1 
    #设置验证类型和密码
	authentication {	
		auth_type PASS
	    #验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP密码必须相同
	    auth_pass 1111
    }
	virtual_ipaddress { 
   		#设置虚拟 ip 地址,可以设置多个,每行一个
        192.168.11.100
    }
}
#设置虚拟服务器,需要指定虚拟 ip 和服务端口
virtual_server 192.168.11.100 80 { 
   #健康检查时间间隔 
   delay_loop 6
   #负载均衡调度算法 
   lb_algo rr 
   #负载均衡转发规则
   lb_kind NAT 
   #设置会话保持时间 
   persistence_timeout 50
   #指定转发协议类型,有 TCP 和 UDP 两种
   protocol TCP 
   #配置服务器节点 1,需要指定 real serve r 的真实 IP 地址和端口
   real_server 192.168.200.112 80 {
   #设置权重,数字越大权重越高
   weight 1	
   		#realserver 的状态监测设置部分单位秒
   		TCP_CHECK { 
        	#超时时间 
            connect_timeout 3
            #重试间隔
            delay_before_retry 3
            #监测端口
            #connect_port 80
        }
    }
}

其中的interface的网卡配置,就看你本地机器的网卡名称即可:
在这里插入图片描述

backup

在192.168.200.113这台机器上的keepalived设置为backup,配置文件内容为:

!Configuration File for keepalived 
global_defs {
     router_id LVS_DEVEL
}
vrrp_instance VI_1 {	
    state BACKUP	
	interface eth0	
    virtual_router_id 51 
    priority 100 
	advert_int 1 
	authentication {	
		auth_type PASS
	    auth_pass 1111
    }
	virtual_ipaddress { 
        192.168.11.100
    }
}
virtual_server 192.168.11.100 80 { 
   delay_loop 6
   lb_algo rr 
   lb_kind NAT 
   persistence_timeout 50
   protocol TCP 
   real_server 192.168.200.113 80 {
   weight 1	
   		TCP_CHECK { 
            connect_timeout 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

设置Nginx跳转Tomcat,即
linux2的nginx->linux2的Tomcat
linux3的nginx->linux3的Tomcat
在这里插入图片描述
linux2的nginx配置同理,不截图了

启动linux2与linux3的Tomcat与Nginx
启动Tomcat:
在这里插入图片描述
启动Nginx:
在这里插入图片描述
分别启动完linux2与linux3的tomcat与nginx后,我们分别测试一下:
在这里插入图片描述
这是很经典的Nginx做跳转,指向8080端口的tomcat(linux2机器这里不截图了)
启动Keepalived

service keepalived start

在这里插入图片描述
最终效果,如本节前面的流程图所示,通过keepalived配置的虚拟ip,转到nginx,再转到tomcat:
在这里插入图片描述

keepalived 日志文件配置
  1. 首先看一下/etc/sysconfig/keepalived 文件

vi /etc/sysconfig/keepalived KEEPALIVED_OPTIONS="-D -d -S 0"
“-D” 就是输出日志的选项,这里的“-S 0”表示 local0.* 具体的还需要看一下/etc/syslog.conf 文件

  1. 在/etc/rsyslog.conf 里添加:local0.* /var/log/keepalived.log

  2. 重新启动 keepalived 和 rsyslog 服务:

service rsyslog restart
service keepalived restart

通过脚本实现动态切换

当Nginx挂掉怎么办?keepalived也应该随时停止服务,否则可能会一直转发,我们说,keepalived是为解决Nginx的高可用而生,那么Nginx一旦挂掉,keepalived也就没有必要继续提供服务了。
这里我们就通过脚本来动态控制Keepalived和Nginx的服务状态!(即当Nginx挂掉后,触发脚本,以停止keepalived,脚本可以通过keepalived的配置设定)

  1. 在 master 和 slave 节点的 /data/program/nginx/sbin/nginx-ha-check.sh 目录下增加一个脚本
#! /bin/sh #是指此脚本使用/bin/sh 来执行

# –no-headers :不打印头文件 
# Wc –l :统计行数
A=`ps -C nginx --no-header |wc -l`

if [ $A -eq 0 ]

then
# nginx挂掉,则停止keepalived服务
echo 'nginx server is died'
service keepalived stop

fi
  1. 修改 /etc/keepalived/keepalived.conf 文件,增加如下配置
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
   # 安全策略
   enable_script_security
}
# 设置vrrp_script,名称为:chk_nginx_service 
vrrp_script chk_nginx_service {
  # 指定脚本路径
   script "/data/program/keepalived/nginx-ha-check.sh"
   # 检查频次
   interval 3
   # 主备的优先级顺序,必须指定
   weight -10
   # 设置用户执行权限
   user root
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.11.100
    }
    # track_script: 执行监控的服务
    track_script {
     # chk_nginxs_ervice 引用 VRRP 脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
      chk_nginx_service
    }
}

转载:keepalived 关于vrrp_script中的weight这个值的使用

  1. 测试

赋予脚本权限:

在这里插入图片描述
重启keepalived
在这里插入图片描述
执行脚本:
在这里插入图片描述
如果nginx挂掉,脚本会自动停止keepalived,如果nginx没有挂掉,则脚本不会生效。证明配置成功~

后记

更多架构知识,欢迎关注本套Java系列文章Java架构师成长之路

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值