nginx+keepalived实现高可用双机热备、负载均衡

之前的文章《Elasticsearch介绍及安装》、《Elasticsearch集群搭建Nginx反向代理》中已经详细介绍了怎么搭建Elasticsearch集群,并在前端通过nginx实现反向代理、负载均衡,这里再详细介绍下怎么通过keepalived实现nginx高可用双机热备。

准备环境

有四台Ubuntu 14.04.5 64位的服务器,现有资源:

  • 192.168.10.100:my-es-cluster,ES node-100,nginx

  • 192.168.10.101:my-es-cluster,ES node-101

  • 192.168.10.102:my-es-cluster,ES node-102

  • 192.168.10.103:nginx

如上,100、101、102三台机器已经搭建了Elasticsearch集群,100、103已经搭建了nginx,并且nginx可以成功代理到三台Elasticsearch服务器,现在准备在100、103机器上安装keepalived。

安装步骤

Step 1:在100、103两台机器上分别安装keepalived准备资源

sudo apt-get install libssl-dev
sudo apt-get install openssl
sudo apt-get install libpopt-dev
sudo apt-get install nmap

Step 2:在100、103两台机器上分别安装keepalived(也可以通过编译源码的形式安装)

sudo apt-get install keepalived

Step 3:在100、103两台机器的/opt/目录下分别创建check_nginx.sh脚本:sudo vim /opt/check_nginx.sh,脚本内容如下:

#!/bin/sh
#check nginx server status
NGINX=/usr/sbin/nginx
PORT=29200

nmap localhost -p $PORT | grep "$PORT/tcp open"
#echo $?
if [ $? -ne 0 ];then
    $NGINX -s stop
    $NGINX
    sleep 3
    nmap localhost -p $PORT | grep "$PORT/tcp open"
    [ $? -ne 0 ] && /etc/init.d/keepalived stop
fi

给check_nginx.sh添加可执行权限:

sudo chmod +x /opt/check_nginx.sh

Step 4:配置100服务器的keepalived作为master:sudo vim /etc/keepalived/keepalived.conf,配置内容如下:

! Configuration File for keepalived

vrrp_script check_nginx_port {
    script "/opt/check_nginx.sh"
    interval 1
    weight 2
}

global_defs {
    router_id Node-100
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.10
    }
    track_script {
        check_nginx_port
    }
}

Step 5:配置103服务器的keepalived作为slave:sudo vim /etc/keepalived/keepalived.conf,配置内容如下:

! Configuration File for keepalived

vrrp_script check_nginx_port {
    script "/opt/check_nginx.sh"
    interval 1
    weight 2
}

global_defs {
    router_id Node-103
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.10
    }
    track_script {
        check_nginx_port
    }
}

Step 6:分别启动100服务器、103服务器的keepalived:

启动:sudo /etc/init.d/keepalived start

重启:sudo /etc/init.d/keepalived restart

停止:sudo /etc/init.d/keepalived stop

Step 7:访问192.168.10.10:curl -XGET '1922.168.10.10:29200',如果出现类似下图的结果,则说明启动正常:

测试启动

再分别先后关掉100、103上的nginx,或者直接关闭服务器,接着访问测试是否正常连通,多次测试,如果可以,则说明keepallived+nginx双机热备配置成功。

注意点

(1)这里的双机并不是两个同时对应用提供服务,只是同一个时刻只有一个nginx对外开放,另一个作为slave接受从master同步过来的数据,当master挂掉以后,通过keepalived的VIP转移,使slave变成master,从而形成高可用的环境。

(2)配置成nopreempt表示非抢占,即master由挂掉的状态恢复后,并不抢占VIP,将继续由slave提供服务。

(3)由于nopreempt只有BACKUP支持,所以上面的master和slave都设置成了BACKUP。

(4)VIP转移一般是在keepalived挂掉(宕机等)的时候出现,但是nginx本身挂掉并不能导致keepalived挂掉,所以需要检测nginx服务。

(5)上面只是通过nmap简单的检测了nginx的端口来判断nginx服务是否正常,可以通过其他更严谨的方法来检测。

(6)有时候即使keepalived进程不在了,但是VIP(虚拟IP)还存在,通过ipconfig可能看不到VIP,但是可以通过:ip -o -f inet addr show 来查看:

100机器如下:

100机器VIP

103机器如下:

103机器VIP

从上面两张图可以看出,目前VIP是在100机器上,可是尝试着将100机器的keepalived进程停止掉,看看VIP是否会自动转移到103机器上。

如果keepalived进程不在了,但是VIP还在,可以通过下面的命令来删除VIP:ip addr del 192.168.10.10 dev eth0

(7)keepalived高可用配置方式有很多种,比如双主高可用实现两台机器同时提供服务,可以按照需要来配置。

本文标题:nginx+keepalived实现高可用双机热备、负载均衡

本文链接:http://yedward.net/post/418.html

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

本博客不提供评论功能,有任何问题请发送邮件至:yedward92@qq.com

相关文章