nginx+keepalived 主从搭建

前言

本文用来记录nginx加keepalived实现高可用,避免出现单点故障。

准备

  • Linux CentOS7 系统
  • nginx 1.12.2
  • keepalived 1.3.5

规划图

虚拟IP 真实IP hostname nginx端口 主从
10.200.1.200 10.200.1.5 nginx_master 80 Master
10.200.1.200 10.200.1.6 nginx_backup 80 Backup

注意点

把搭建过程中的坑写的前边,避免下次再遇到

  1. 机器的hostname一定要修改,不能出现相同的,相同会导致VIP不漂移
  2. 防火墙开放80端口
  3. selinux对keepalived的影响,我遇到的是在执行监控脚本无法调用系统服务命令(systemctl stop keepalived),解决办法有3
    • 不调用系统服务命令来启动或关闭应用,只用kill杀死进程
    • 关闭selinux
    • 找到selinux具体是什么权限导致在监控脚本无法调用系统服务命令(我没找到)

安装

  1. 在VirtualBox下安装CentOS7操作系统,配置IP地址和hostname

  2. 通过yum命令来安装epel-release、nginx、keepalived

    1
    2
    3
    # yum install epel-release -y
    # yum install nginx -y
    # yum install keepalived -y
  3. 复制第一步安装好的系统,配置IP地址和hostname

配置

Master配置
  1. keepalived 配置

    1
    # vi etc/keepalived/keepalived.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    ! Configuration File for keepalived
    #全局配置
    global_defs {
    #运行keepalived的机器的一个标识
    router_id LVS_DEVEL_MASTER
    }

    #VRRPD配置
    vrrp_script check_nginx {
    #脚本监测
    script "/opt/check_nginx.sh"
    #脚本执行间隔,每2s检测一次
    interval 2
    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -20
    weight -20
    }

    #定义vrrp实例
    vrrp_instance VI_1 {
    #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    state MASTER
    #指定HA监测网络的接口。与本机 IP 地址所在的网络接口相同
    interface enp0s3
    #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    virtual_router_id 51
    #定义优先级,数字越大,优先级越高
    priority 100
    #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    advert_int 1
    #设置验证类型和密码。主从必须一样
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
    virtual_ipaddress {
    10.200.1.200
    }
    #执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
    track_script {
    check_nginx
    }
    }
  2. 监测脚本编写

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash
    #检查nginx进程是否存在
    counter=$(ps -C nginx --no-heading|wc -l)
    pids=$(pidof keepalived)
    if [ "${counter}" = "0" ]; then
    #尝试启动一次nginx,停止5秒后再次检测
    #/usr/bin/systemctl start nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" -a "${pids}" != "" ]; then
    #如果启动没成功,就杀掉keepalive触发主备切换
    #/usr/bin/systemctl stop keepalived
    #如果关闭了selinux可以只用上边的命令,如果没有直接用kill
    #kill -9 $pids
    fi
    fi
  3. 监测脚本授权

    1
    # chmod +x /opt/check_nginx.sh
Backup配置
  1. keepalived 配置

    1
    # vi /etc/keepalived/keepalived.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ! Configuration File for keepalived

    global_defs {
    #和Master不同的地方
    router_id LVS_DEVEL_BACKUP
    }

    vrrp_script check_nginx {
    script "sh /opt/check_nginx.sh"
    interval 2
    weight -20
    }

    vrrp_instance VI_1 {
    #和Master不同的地方
    state BACKUP
    interface enp0s3
    virtual_router_id 51
    #和Master不同的地方
    priority 90
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    10.200.1.200
    }
    track_script {
    check_nginx
    }
    }
  2. 直接把Master的脚本拷贝过来

测试

  1. 关闭master的nginx服务,测试nginx是否会被重启

    检查页面是否正常

  2. 测试VIP是否会漂移

    • 注释检测脚本启动nginx服务的命令
    • 查看页面
    • 执行systemctl stop nginx命令,查看页面

结语

本记录只记录了核心的部分,如果是生成环境用,还有在熟悉其他的配置,比如发邮件配置等

参考资料

  1. nginx笔记
  2. Keepalived原理与实战精讲–VRRP协议