文章目录

  • 一、名词解释
  • 1、高可用集群
  • 2、LVS
  • 3、Keepalived
  • 二、搭建流程
  • 1、安装Docker
  • 2、安装Nginx
  • 3、安装Keepalived
  • 4、编写nginx_check.sh脚本


一、名词解释

1、高可用集群

对于中小型互联网公司,产品所承受的请求量还是比较低的,所以一般使用单节点Nginx + 多服务集群,这种方式就能够满足需求。

但是有些公司产品请求量是非常大的,此时单台Nginx可能没办法满足需求(如果单节点宕机,整个系统崩溃),此时就会考虑搭建Nginx高可用集群,通过LVS提供统一的访问入口,将请求负载均衡到我们的Nginx集群。

当某个Nginx节点宕机,Keepalived会进行监控,备用节点也会继续向外提供服务,确保程序还是正常运行,这就是高可用集群的魅力

2、LVS

LVS(Linux Vritual Server),大白话翻译过来就是一种负载均衡调度器,可以虚拟出来一个IP地址(公网IP),这样可以为我们的Nginx集群生成一个唯一的访问IP地址,该IP一般称之为VIP(Vriutal IP,虚拟IP),用户访问虚拟IP就可以实现Nginx集群的负载均衡功能

keepalived nginx 脚本 nginx keepalive lvs_负载均衡

3、Keepalived

LVS只提供负载均衡功能,但是不能监控Nginx节点状态。如果某Nginx节点宕机,就没办法处理客户端发送过来的请求,造成服务不可用!

Keepalived 基于 VRRP 协议实现的保证集群高可用,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障

VRRP协议保证当主机的下一路由器出现故障时,由另外一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。

keepalived nginx 脚本 nginx keepalive lvs_keepalived_02

二、搭建流程

我使用的是两台阿里云ESC(2核2G服务器),IP地址分别为:
47.94.210.20:22(Master)
8.218.185.242:22(Backup)
大家可以在Windows本地安装虚拟机来代替。

1、安装Docker

两台ESC分别安装好Docker

2、安装Nginx

两台ESC安装好Nginx,

按照第5小节执行完毕后,两台服务器执行下方命令,此时Nginx容器启动成功:

# 进入 /usr/local/nginx/html 
cd /usr/local/nginx/html

# 创建nginx首页(两台服务器首页内容要区分,第二台服务内容可以为"Backup Nginx")
echo "Master Nginx" > index.html

# 启动容器
docker run \
--name nginx \
-p 443:443 -p 80:80 \
-v /usr/local/nginx/logs:/var/log/nginx \
-v /usr/local/nginx/html:/usr/share/nginx/html \
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx/conf.d:/etc/nginx/conf.d \
-v /usr/local/nginx/ssl:/etc/nginx/ssl/  \
--privileged=true -d --restart=always nginx
3、安装Keepalived

两台ESC分别安装Keepalived:

# 通过yum工具安装Keepalived
yum install -y keepalived
  1. 操作主节点keepalived配置文件
# 编辑配置文件
vim /etc/keepalived/keepalived.conf

配置内容如下:

! Configuration File for keepalived

# Keepalived 检测脚本
vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh" # nginx宕机以后,自动开启shell
        interval 2                              # 检测时间间隔
        weight -20                              # 如果条件成立,权重为-20
}

vrrp_instance VI_1 {
    state MASTER              # 主、备标识
    interface eth0            # 网卡
    virtual_router_id 51      # 主、备需要相同
    mcast_src_ip 47.94.210.20 # 本机IP
    priority 100              # 优先级(主节点大)
    advert_int 1              # 心跳检测间隔
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 将 chk_nginx 加入instance 配置块
    track_script {
        chk_nginx
    }

    # 虚拟IP
    virtual_ipaddress {
        192.168.200.16
    }
}
  1. 操作备节点keepalived配置文件
# 编辑配置文件
vim /etc/keepalived/keepalived.conf

配置内容如下:

! Configuration File for keepalived

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    mcast_src_ip 8.218.185.242
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_nginx
    }

    virtual_ipaddress {
        192.168.200.16
    }
}
4、编写nginx_check.sh脚本

两台ESC分别执行:

# 编辑脚本
vim /etc/keepalived/nginx_check.sh

内容如下:

counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    	docker restart nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        systemctl stop keepalived
    fi
fi
# 脚本文件授权
chmod 777 /etc/keepalived/nginx_check.sh