基于Nginx搭建Web服务器HA架构(实现高可用web服务)

Posted 锦衣admin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Nginx搭建Web服务器HA架构(实现高可用web服务)相关的知识,希望对你有一定的参考价值。

双点服务器HA架构介绍(实现高可用)

需求

随着用户量增多,单台WEB服务器,压力越来越大。虽然单台WEB服务器,目前可以完成工作任务。但是如果一旦宕机,用户就完全失去服务了,用户体验特别不好。需要备用一台服务器进行使用,主服务器宕机之后,快速切换为备用服务器

模拟运维设计方案

第一步:在单台web服务的架构中,先将数据库服务器迁移

在这里插入图片描述

第二步:针对web服务器单点故障,升级为主备服务器架构

在这里插入图片描述

高可用服务搭建介绍

HA高可用

高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指通过设计,减少系统服务不可用的时间。假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为0.876个小时

描述通俗叫法可用性级别年度停机时间
基本可用性2个999%87.6小时
较高可用性3个999.9%8.8小时
具有故障自动恢复能力的可用性4个999.99%53分钟
极高可用性5个999.999%5分钟

实现高可用的核心点:

  • ①冗余(多台服务器)

  • ②自动切换

备份服务器:

  • 冷备 :服务器不启用(域名不解析),使用的时候再开启,需要手动切换

  • 热备 :服务器在等待状态(监控主服务器状态),一旦主宕机,备就接管,自动切换

实现热备,引入VIP的切换,通过VIP的方式,切换主备服务器:

  • ①默认VIP绑定在主服务器(master)

  • ②master不可用,就切换VIP到备份服务器(backup)

  • ③用户可以使用到连续性更好的服务,通过VIP访问服务器

在这里插入图片描述

常用来单独实现高可用的软件:

  • ①keepalived

  • ②heartbeat 较早 属于redhat HA工程的一部分

keepalived 软件介绍

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

keepalived组成和原理

Keepalived软件主要是通过VRRP协议实现高可用功能的。

VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
在这里插入图片描述

Keepalived的功能体系结构,大致分两层:用户空间(user space)和内核空间(kernel space)。

内核空间:Kernel Space

  • 主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)和NETLINK(提供高级路由及其他相关的网络功能)两个部份。

用户空间:User Space

  • WatchDog:负载监控checkers和VRRP进程的状况,如果他两以外挂掉会重启他们

  • VRRP Stack:负载均衡器之间的失败切换FailOver,如果只用一个负载均衡器,则VRRP不是必须的。

  • Checkers:负责真实服务器的健康检查healthchecking,是keepalived最主要的功能。换言之,可以没有VRRP Stack,但健康检查healthchecking是一定要有的。

  • IPVS wrapper:用户发送设定的规则到内核ipvs代码

  • Netlink Reflector:用来设定vrrp的vip地址等。
    在这里插入图片描述

keepalived主要使用三个模块,分别是core、check和vrrp:

  • core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。

  • check负责健康检查,包括常见的各种检查方式。

  • vrrp模块是来实现VRRP协议的。

安装配置启动keepalived

master和backup都需要进行安装,也就是server_01和server_02机器
keepalived需要使用的目录和文件:

文件或者目录作用
/etc/keepalived/keepalived.conf生效的配置文件
/etc/init.d/keepalived服务器管理脚本
/var/log/messages日志信息

keepalived 配置文件说明:

! 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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}


#
vrrp_instance VI_1 {				=>	vrrp协议的配置
    state MASTER					=>	工作模式,分为master和backup 两种模式
    interface eth0					=>	监听的网卡,主要是VIP在哪张网卡上
    virtual_router_id 51			=>	虚拟路由id 需要和备服务器一致,id数字一样就行
    priority 100					=>	权重 优先级,1-255,数字越大权重越高,即如果有两台备,当主宕机,权重大的备成为新的master
    advert_int 1					=>	vrrp包的发送周期  1s,主需要向备发送包,确认主是存活的,备就不会启用
    #
    authentication {					=>	权限验证,一般不用动
        auth_type PASS
        auth_pass 1111
    }
    #
    virtual_ipaddress {					=>	需要绑定切换的VIP,这个VIP用于用户访问,VIP在哪个Web 服务器上就是那个服务器提供服务
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

实现Web 服务高可用前置部署

两台Web 服务安装的配置参数需要一致,迁移的数据库可以是不同版本,但需要根据具体需求决定

LNMP环境搭建

配置要求:

服务器主机IP角色
server_01.com (Web)10.1.1.101MASTER
server_02.com (Web)10.1.1.102SLAVE
mysql_01.com10.1.1.201MySQL

第一步:将主 Web服务器的数据库文件备份,导入数据库服务

MySQL数据库学习导航

主Web 服务器:
#l [root@server_01 ~]# mysqldump --databases tp5shop > /root/tp5shop.sql -p			=>	备份
#l [root@server_01 ~]# scp /root/tp5shop.sql mysql01:/root/							=>	将数据发送到数据库服务器
#l [root@server_01 ~]# rm -rf /usr/local/mysql							=>	可以删除MySQL


MySQL 服务器:
# mysql> source /root/tp5shop.sql;					=>	导入数据

创建用于Web 服务器远程连接用户
# mysql> create user 'tp5shop'@'10.1.1.%' identified by 'Abc123$';			=>	创建用户
# mysql> grant all on tp5shop.* to 'tp5shop'@'10.1.1.%';					=>	配置权限

第二步:两台Web 服务器修改一下项目配置文件数据库接口文件

主备都要修改:

# vim /usr/local/nginx/html/tp5shop/application/database.php
return [
    // 数据库类型
    'type'            => 'mysql',
    // 服务器地址
    'hostname'        => '10.1.1.201',		=>	数据库服务器 IP
    // 数据库名
    'database'        => 'tp5shop',			=>	要连接的数据库名称
    // 用户名
    'username'        => 'tp5shop',			=>	上面创建的用户名称
    // 密码
    'password'        => 'Abc123$',			=>	密码
    // 端口
    'hostport'        => '3306',

第三步:keepalived 软件的安装及配置

主Web 服务器:

安装及备份:
#l [root@server_01 ~]# yum -y install keepalived		=> 安装
#l [root@server_01 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
														=>	备份一下配置文件

修改配置文件:
#l [root@server_01 ~]# vim /etc/keepalived/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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33			=>	网卡更改为自己的网卡
    virtual_router_id 51
    priority 100
    advert_int 3
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
      10.1.1.210			=>	设定VIP 
    }
}

备Web 服务器:

安装及备份:
#l [root@server_02 ~]# yum -y install keepalived		=> 安装
#l [root@server_02 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
														=>	备份一下配置文件


修改配置文件:
#l [root@server_02 ~]# vim /etc/keepalived/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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP			=>	修改为backup
    interface ens33			=>	网卡更改为自己的网卡
    virtual_router_id 51
    priority 100
    advert_int 3
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       10.1.1.210			=>	设定VIP,主备设定的VIP 要一致
    }
}

第四步:启动keepalived

分别按照顺序启动主服务器和备服务器的keepalived:
#l [root@server_01 ~]# systemctl start keepalived
#l [root@server_02 ~]# systemctl start keepalived


# ip a 命令可以查看VIP 在哪,

客户端解析vip10.1.1.210 www.shop.com,访问就可以访问到,当主宕机,vip就会切换到备上去

第五步:编写Nginx 服务监测脚本

通过keepalived可以直接实现主服务器整机不可用,实现VIP的切换。保证用户可以通过VIP进行访问服务。但是实际情况下,往往并不是服务器整机不可用,只是对应的服务或者软件不可用。

比如说:nginx提供的web服务,nginx进程意外关闭,就需要检测到当nginx不可用时,能够切换VIP

实现过程分析:

  • VIP实际是由keepalived进行绑定的,所以当nginx服务不可用时,就关闭当前机器的keepalived即可,释放VIP。进而绑定到其他备用服务器。

    1. 编写服务检测脚本,实现检测nginx是否可用,不可用则关闭当前所在主机的keepalived

    2. 在keepalived配置中调用检测服务脚本

主备都要编写:

在keepalived下编写:
# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
nginx_status=`ps -C nginx --no-header | wc -l`
if [ $nginx_status -eq 0 ];then
   systemctl stop keepalived
fi

说明:当监测到nginx 进行没有,即等于0的时候,就关闭keepalived


# chmod +x /etc/keepalived/check_nginx.sh

第六步:在keepalived 配置文件中配置定时触发Nginx检测脚本

主备都要:

  • 就可以实现每3秒检查Nginx 服务是否可用,不可以就关闭keepalived,vip就会转移
# vim /etc/keepalived/keepalived.conf
vrrp_script check_nginx {							=>	定义一个执行,在vrrp_instance外上面定义
   script  /etc/keepalived/check_nginx.sh			=>	调用脚本地址
   interval 3										=>	检测间隔时间
}
#
track_script {						=>	在vrrp_instance里调用    
    check_nginx						=>	上面定义的名称
}

到此完成

keepalived的配置补充

脑裂(裂脑)

  • vip出现在了多台机器上。网络不通畅,禁用了数据包,主备服务器没法通讯,造成备服务器认为主服务器不可用,绑定VIP,主服务器VIP不会释放。
  • 因为实际生产情况下防火墙是禁用组播的,不接受组播的数据包,所以主发送的vrrp包被禁掉了导致备接受不到而启用vip 导致脑裂发生

解决方案:

  • ①双备或者多备模式 BACKUP 通过priority权重来区分谁的优先级更高

  • ②单播(定向广播)的方式 (一些特定环境禁用了组播方式)

  • ③时间不同步 服务器时间校时

非抢占模式和权重的补充

抢占模式: 即备拿到了vip,但是主又重新开启,那么主就会抢占vip。keepalived 默认是抢占模式,这样容易形成脑裂(实操过程中有可能没有发生抢占)

非抢占模式: 在主备服务器的配置文件,vrrp_instance段中,加上nopreempt。这样他们就不会抢占了。

主备都要加上:
# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
	...
	nopreempt						=>	在这段中加上
	...
}

多备设置:

  • 即没有主,全是备,通过优先级priority来确定先启用哪台Web,数字越大优先级越高
  • 两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。
主备都要加上:
# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
	state BACKUP			=>	都设置成BACKUP
	nopreempt
	priority 100			=>	根据情况设置不同的数字,数字越大优先级越高

单播模式

一些特定环境下不允许发送组播,造成备服务器无法收到vrrp包,可能会造成脑裂现象。可以通过单播的方式解决

单播示例配置:注意此语法在keepalived1.2.11版本以上支持

  • 在vrrp_instace段中加入
unicast_src_ip 10.1.1.101		=>	(本地IP地址)

unicast_peer {
		10.1.1.102			=>	(对端IP地址),即发送vrrp包给其他备机器,有多台就添加上去就行
}

server01配置:

# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
	unicast_src_ip 10.1.1.101				=>	server01自己的ip
	unicast_peer {
		10.1.1.102							=>	server02备的ip,向它发送单播vrrp包
		}
}	

server02配置:

# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
	unicast_src_ip 10.1.1.102				=>	server02自己的ip
	unicast_peer {
		10.1.1.101							=>	server01备的ip,向它发送单播vrrp包
		}
}	

vrrp包组播:
在这里插入图片描述
配置后vrrp单播:
在这里插入图片描述

以上是关于基于Nginx搭建Web服务器HA架构(实现高可用web服务)的主要内容,如果未能解决你的问题,请参考以下文章

基于Nginx搭建Web服务器HA架构(实现高可用web服务)

高可用架构二基于HAProxy+Keepalived高可用负载均衡web服务的搭建

分布式架构高可用架构篇_04_Keepalived+Nginx实现高可用Web负载均衡

Nginx+Keepalived实现web服务器高可用

Centos 7部署docker+nginx+keepalived实现高可用web集群

高可用集群HA架构搭建