Keepalived实现Nginx负载均衡器高可用

2018-05-11|Categories: Cluster, Linux|Tags: , |

网络拓扑

network topology of keepalived 1 master makes nginx load balancer high available

Client's IP

网卡 网卡模式 IP地址 地址获取方式
eth2 host only 172.16.125.61/24 static
eth2:1 192.168.11.61/24 manual

「static」表示网卡配置文件内已写入BOOTPROTO=staticBOOTPROTO=none,以及IPADDR。「manual」表示通过ipconfig eth2:1 192.168.11.61/24这种方式配置IP地址。更多内容详见《实现LVS-DR和Session绑定》,此处不再赘述。

Nginx LB #1's IP

网卡 网卡模式 IP地址 地址获取方式
ens34 host only 172.16.125.71/24 static

VIP通过Keepalived来配置。

Nginx LB #2's IP

网卡 网卡模式 IP地址 地址获取方式
ens34 host only 172.16.125.74/24 static

Upstream server #1's IP

网卡 网卡模式 IP地址 地址获取方式
ens34 host only 172.16.125.72/24 static

其它诸如安装配置httpd、单机测试的步骤同样也记录在前面链接的文章中,此处不再赘述。

Upstream server #2's IP

网卡 网卡模式 IP地址 地址获取方式
ens34 host only 172.16.125.73/24 static

配置Nginx

从EPEL源安装Nginx

yum install epel-release -y

yum install nginx -y

编辑配置文件

vim /etc/nginx/nginx.conf

http {}配置段内插入以下内容:

upstream backend {
    server 172.16.125.72;
    server 172.16.125.73 weight=4;
}

server {
    listen 192.168.11.200:80;
    location / {
        proxy_pass http://backend;
    }
}

启动Nginx

nginx

第二台Nginx负载均衡器也需要同样的配置。

配置Keepalived

备份配置文件

cp -v /etc/keepalived/keepalived.conf{,.bak}

编辑配置文件

# 清空原有内容
> /etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf

粘贴以下内容:

# Configuration File for keepalived     # 感叹号、井号开头的行都是注释

global_defs {                       # 全局配置
   notification_email {             # 接收Keepalived状态提醒邮件的地址
     root@localhost                 # 可以设置多个接收地址
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1            # 邮件发送服务器就是本机
   smtp_connect_timeout 30
   router_id vs_1                   # 物理路由器在VR组中的ID,不要和VRID混淆
   vrrp_mcast_group4 224.1.1.1      # 指定当前VR组通信的多播组,非常重要
}

vrrp_script chk_ngx {               # 定义一个检查Nginx LB健康状态的脚本
    script "killall -0 nginx && exit 0 || exit 1"  # 检查方式:给nginx发送0信号,有回应返回0,否则返回1
    interval 1                                     # 检查间隔:1秒
    fall 2                             # 检查两次都返回1,则判断nginx没有正常运行
    weight -30                         # 如果判断nginx没有正常运行,则权重值(优先级)减去30
    rise 2                             # 检查两次都返回0,则判断nginx已恢复正常,优先级恢复到预设值
}

vrrp_instance ngx_vip {             # 配置VR组
    #state BACKUP                   # 状态分为MASTER和BACKUP,可以不设置,根据优先级决定
    interface ens34                 # 用哪一块网卡绑定VIP
    virtual_router_id 16            # VRID,取值范围:0-255
    priority 100                    # 优先级,如果不设置这一行,将使用默认值:100
    advert_int 1                    # 向多播组发送通知的时间间隔,默认值:1(秒)
    virtual_ipaddress {             # 用于自动飘移的VIP
        192.168.11.200/24
    }
    track_script {                  # 调用前面定义的脚本
        chk_ngx
    }
}

和IPVS(LVS)属于内核模块不同,Nginx属于用户空间程序,Keepalived不能为Nginx生成调度规则,而只能通过检查Nginx进程的健康状态来实现负载均衡器的高可用。

第二台Nginx负载均衡器也需要同样的配置,只有两处需要修改:

  • 一是router_id,设置为router_id vs_2
  • 二是优先级,设置为和第一台的priority 100不同就可以了。

启动Keepalived

systemctl restart keepalived

查看Keepalived工作状态

Keepalived启动后,检查本机是否获取到VIP:

$ ip a | grep 192.168.11.200
    inet 192.168.11.200/24 scope global ens34

如果已经获取VIP,就停止Keepalived服务,检查VIP是否自动飘移到另一台VS。

整体测试

Nginx负载均衡器和上游(后端)服务器都就绪之后,在客户端上做整体测试,结果完全符合预期:

$ for i in {1..50}; do curl -s 192.168.11.200; done | sort | uniq -c
     10 Real server at 172.16.125.72
     40 Real server at 172.16.125.73

在Master VR上停止Keepalived服务,如果上面的测试仍然可以得到正确结果,就证明Keepalived实现了Nginx负载均衡器的高可用。

Leave A Comment