keepalived+nginx 双机热备搭建

Posted 六种味

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keepalived+nginx 双机热备搭建相关的知识,希望对你有一定的参考价值。

keepalived+nginx 双机热备搭建

一、准备工作

1.1 准备两台centos7.9

1.2 nginx 与 keepalived软件 双机安装

1.3 ip分配

机器1机器2vip
192.168.19.200192.168.19.201192.168.19.203

1.4 修改主机名

# 第一台
hostnamectl set-hostname nginx01
# 第二台
hostnamectl set-hostname nginx02

1.5 关闭selinux(双机执行)

#关闭selinux
#永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
#临时关闭
setenforce 0
#查看
getenforce

1.6 修改hosts(双机执行)

cat >> /etc/hosts << EOF
192.168.19.130 nginx01
192.168.19.131 nginx02
EOF

二、安装keepalived

2.1 执行一下命令安装keepalived(双机执行)

2.1.1 yum安装

yum -y install keepalived

2.1.2 编译安装

获取安装包https://www.keepalived.org/download.html
找到自己需要的版本安装,本次安装2.1.5,双机下载,也可以wget

2.1.2.1 安装依赖

yum install curl gcc openssl-devel libnl3-devel net-snmp-devel libnfnetlink-devel -y

2.1.2.2 解压

# 解压源码包
tar fx keepalived-2.1.5.tar.gz
# 进入解压后的目录
cd keepalived-2.1.5
# 配置选项
./configure --prefix=/usr/local/keepalived --sysconf=/etc --with-run-dir=/usr/local/keepalived/run
# 编译安装
make && make install
# 检查安装情况 如果等于0则代表成功编译安装
echo $?
# 创建存放pid的目录
mkdir /usr/local/keepalived/run
# 拷贝启动文件到/usr/sbin/
cp -rf /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

2.2 编辑keepalived配置文件

2.2.1 清空原有的配置文件(双机执行)

>/etc/keepalived/keepalived.conf

2.2.2 执行以下命令,编辑keepalived.conf文件。(双机分别执行)

vim /etc/keepalived/keepalived.conf

2.2.3 内容粘在配置文件中,设置不抢占(第一台主节点执行)

! Configuration File for keepalived

global_defs 
    # 唯一表示id 规格为keep_ip最优一段
    router_id keep_200

vrrp_script check_nginx 
   # 执行的检测脚本
   script "/etc/keepalived/check_nginx.sh"
   # 间隔检测的时间2s
   interval 2
   # 检测失败降低权重,需要与主实例权重相减后小于备份实例
   weight -20

vrrp_instance VI_1 
    # 指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    state BACKUP
    # 设置不抢占
    nopreempt
    # 网卡设置 此处记得修改,ip a s显示需要绑定vip的网卡
    interface ens33
    # 虚拟路由标识,是一个数字,不用更改
    virtual_router_id 51
    # 定义优先级,数字越大,优先级越高
    priority 100
    # 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔
    advert_int 1
    # 设置验证类型和密码,两个节点必须一致
    authentication 
        auth_type PASS
        auth_pass 1111
    
    # 脚本监控状态
    track_script 
        check_nginx
    
    virtual_ipaddress 
        192.168.19.133
    

2.2.4 内容粘在配置文件中(第二台从节点执行)

! Configuration File for keepalived

global_defs 
    # 唯一表示id 规格为keep_ip最优一段
    router_id keep_201

vrrp_script check_nginx 
   # 执行的检测脚本
   script "/etc/keepalived/check_nginx.sh"
   # 间隔检测的时间2s
   interval 2
   # 检测失败降低权重,需要与主实例权重相减后小于备份实例
   weight -20

vrrp_instance VI_1 
    # 指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    state BACKUP
    # 设置不抢占
    nopreempt
    # 网卡设置 此处记得修改,ip a s显示需要绑定vip的网卡
    interface ens33
    # 虚拟路由标识,是一个数字,不用更改
    virtual_router_id 51
    # 定义优先级,数字越大,优先级越高
    priority 99
    # 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔
    advert_int 1
    # 设置验证类型和密码,两个节点必须一致
    authentication 
        auth_type PASS
        auth_pass 1111
    
    # 脚本监控状态
    track_script 
        check_nginx
    
    virtual_ipaddress 
        192.168.19.133
    

2.2.5 编写check_nginx.sh脚本(双机执行)

vim /etc/keepalived/check_nginx.sh

#!/bin/bash
    A=`ps -C nginx --no-header |wc -l`
    if [ $A -eq 0 ];then
        systemctl start nginx
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            systemctl stop keepalived
        else
            exit 0
        fi
    else
        exit 0
    fi

2.3 设置开机自启动

systemctl enable keepalived

三、安装nginx(双机安装)

# 下载依赖
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
# 创建相关目录src为下载nginx安装包目录,soft为nginx安装目录
mkdir -p /data/src,soft
# 进入下载目录
cd /data/src/
# 下载nginx安装包
yum -y install wget
wget http://nginx.org/download/nginx-1.21.0.tar.gz
# 解压
tar fx nginx-1.21.0.tar.gz
cd nginx-1.18.0/
# 配置nginx编译环境
./configure --prefix=/data/soft/nginx --with-http_stub_status_module
# 编译安装
make && make install
# 检查安装是否有问题
echo $?

四、配置下systemctl管理自安装nginx

4.1 创建nginx.service文件

vim /lib/systemd/system/nginx.service

将下面文字直接粘贴进去修改

[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/data/soft/nginx/sbin/nginx -c /data/soft/nginx/conf/nginx.conf
ExecReload=/data/soft/nginx/sbin/nginx -s reload
ExecStop=/data/soft/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

ExecStart:nginx的启动命令
ExecReload:nginx的重载命令
ExecStop:nginx的停止命令

4.2 重载systemctl

systemctl daemon-reload

4.3 设置开机自启动

systemctl enable nginx

五、开启keepalived,并测试下

5.1 首先区分下 nginx 的index.html页面

第一台

"hello world 1" > /data/soft/nginx/html/index.html

第二台

"hello world 2" > /data/soft/nginx/html/index.html

5.2 开启keepalived

# 开启keepalived
systemctl start keepalived
# 检查keepalived状态
systemctl status keepalived


5.3 检验 keepalived的可用性

首先查看vip在那台机器上,应该在第一台上,因为给的权重高

ip a s


浏览器访问下,访问vip

关闭第一台机器的nginx,这时候我们将check_nginx.sh的启动nginx命令先注释下,要不会自动启动


完成后停止第一台nginx

# 停止nginx
systemctl stop nginx
# 查看nginx状态
systemctl status nginx
# 查看keepalived 状态
systemctl status keepalived
# 查看vip在哪台机器上(两台执行)
ip a s

nginx 停止了

keepalived也停止了

查看vip 再第二台机器上,说明没问题

访问下浏览器http://192.168.19.203/

因为用的是不抢占模式,所以我们恢复下,看看vip会不会漂移回来(不漂移回来是对的)
首先修改刚刚修改的第一台check_nginx.sh脚本,将注释取消掉

直接启动第一台的keepalived,脚本会启动nginx的

# 启动第一台keepalived
systemctl start keepalived
# 查看状态
systemctl status keepalived
# 查看nginx启动状态
systemctl status nginx
# 都启动后查看vip再那台机器上(双机执行)
ip a s

还是再第二台上,说明没问题

搭建Nginx高可用集群(keepalived+双机热备)

一、Nginx高可用

首先了解一下什么是高可用,高可用是分布式系统架构中必须考虑的因素。

我们都知道,使用nginx的反向代理和负载均衡可以解决tomcat等web容器的单点故障以及高并发等问题

反向代理是指以代理服务器来接收浏览器的请求,然后再将请求转发到内网的服务器,然后再将从服务器上得到的结果返回给客户端。负载均衡就是要解决一个web服务器压力过大的问题,此时可以通过多个web服务器根据不同的算法将并发过来的请求分配到多个服务器上,从而减轻单个服务器压力过大的问题。

这样的话,当一台web服务器挂掉了,还有其他的服务器可以处理客户端的请求,也解决了单点故障问题,这是对web服务器的高可用。

但是,上述架构仍然存在单点故障问题吗,如果这台Nginx挂了,那么所有对外提供的接口都将导致无法访问,所以我们也需要给Nginx配置高可用机制。

可以使用keepalived来实现Nginx的高可用。

二、Nginx双机热备

双机热备方案是目前使用最为普遍的一种高可用方案,双机热备就是指一台服务器整在提供服务,另外一台作为备用状态,当一台服务器挂掉之后另外一台就会代替他继续提供服务。

双机热备主要解决的是Nginx的单点故障问题。

三、LVS负载均衡

再来了解一下LVS,LVS(Linux Vritual Server)即Linux虚拟服务器,他是一个开源的软件,可以实现传输层四层负载均衡,通过 LVS 达到的负载均衡技术可以实现一个高性能高可用的 Linux 服务器集群。

大概流程就是:当客户端发出请求时,会先连接到互联网的DNS服务器,然后解析到LVS负载均衡调度器上,LVS可以帮我们虚拟出来一个IP地址(外网IP),此时客户端用户就会去连接这个虚拟出来的IP,当用户连接到虚拟IP之后LVS会根据指定的调度算法确定具体要连接到哪一台Nginx服务器上。客户端连接到虚拟IP的过程对用户是透明的,而LVS具体连接到哪一台Nginx服务器对用户来说是不知道的。

LVS负载均衡调度器仅仅只是一个调度器,并不是真正的服务。

四、keepalived健康监测

来了解了解为什么要引入keepalived

LVS可以实现负载均衡,但是不能够进行健康检查。意思就是,假如一台Nginx服务器挂掉了,LVS仍然会把客户端的请求发送到这个挂掉了Nginx上(因为LVS并不知道此Nginx挂了),这样就会导致请求无效无法处理客户端的请求。

keepalive 软件可以进行健康检查,所以我们需要使用他来进行监测,而且可以实现Nginx的高可用性,解决Nginx的单点故障问题及LVS不能进行健康检查的问题。

keepalived的工作原理

keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。VRRP协议保证当主机的下一路由器出现故障时,由另外一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。

VRRP虚拟出来的是路由。

五、开始搭建Nginx高可用集群

1、首先准备两台Nginx服务器,一个作为主服务器MASTER,一个作为备服务器BACKUP,再利用LVS虚拟出来一个IP地址。

#搭建keepalived环境
yum install -y  keepalived

#keepalived的启动与停止
service keepalived start
service keepalived stop

2、修改主Nginx服务器keepalived文件:vim  /etc/keepalived/keepalived.conf

设置自己的主Nginx服务器的IP地址等信息,我这里是192.168.66.100,虚拟IP设置为192.168.66.99

! Configuration File for keepalived
vrrp_script chk_nginx 
    script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20

# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 
    state MASTER #来决定主从
    interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
    virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.66.100 #填写本机ip
    priority 100 # 节点优先级,主要比从节点优先级高
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication 
        auth_type PASS
        auth_pass 1111
    
    # 将track_script块加入instance 配置块
    track_script 
        chk_nginx #执行Nginx监控的服务
    

    virtual_ipaddress 
        192.168.66.99 #虚拟ip
    

3、修改从Nginx服务器keepalived文件, vim /etc/keepalived/keepalived.conf

设置自己的从Nginx服务器的IP地址等信息,我这里是192.168.66.101,虚拟IP也设置为192.168.66.99

! Configuration File for keepalived
vrrp_script chk_nginx 
    script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20

# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 
    state BACKUP #来决定主从
    interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
    virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.66.101 #填写本机ip
    priority 100 # 节点优先级,主要比从节点优先级高
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication 
        auth_type PASS
        auth_pass 1111
    
    # 将 track_script 块加入 instance 配置块
    track_script 
        chk_nginx #执行 Nginx 监控的服务
    

    virtual_ipaddress 
        192.168.66.99 # 虚拟ip
    

4、Nginx+keepalived实现高可用写入脚本:vim /etc/keepalived/nginx_check.sh

(两台机器都需要写)
#!/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

对该脚本文件授权

chmod 777 /etc/keepalived/nginx_check.sh

此时已经配置完成。

在浏览器访问虚拟IP192.168.66.99时即可访问到主Nginx服务器中的服务,即使主Nginx服务器挂了,也会自动连接到从Nginx服务器上,从而保证了Nginx的高可用,当主Nginx恢复正常时,会再次自动连接到主Nginx服务器上继续服务

END......

以上是关于keepalived+nginx 双机热备搭建的主要内容,如果未能解决你的问题,请参考以下文章

nginx+keepalived实现双机热备高可用性

你需要了解的高可用方案之使用keepalived搭建双机热备一览

群集架构篇

用haproxy搭建web群集并由keepalived 实现双机热备

Nginx+keepalived双机热备

keepalived双机热备nginx