文档章节

使用Keepalived+Nginx实现Nginx高可用的负载均衡

闪电
 闪电
发布于 2016/07/24 11:47
字数 1143
阅读 132
收藏 11

接上一文章<<CentOS 6.5高可用集群LVS+Keepalived>>

本文主要是配置Nginx、Keeplive,至于Nginx的配置就省略了

1、服务器规划

    服务器IP      服务

192.168.80.77     VIP

192.168.80.188     Keepalived(Master)、Nginx(Backup)

192.168.80.189     Keepalived(Slave)、Nginx(Backup)

2、目标

所有的请求都通过1.77虚拟服务转发给1.188服务器,而189作为188的备份,当188服务挂掉了,自动切换到189

3、Nginx配置

    安装省略......,Nginx 安装目录:/usr/local/nginx

    1) 188、189配置index.html来区分是哪台nginx工作:

在188上配置:

echo "192.168.80.188" > /usr/local/nginx/html/index.html

在189上配置

echo "192.168.80.189" > /usr/local/nginx/html/index.html

验证方法:

    1)、首先用IP访问各自的nginx,看index.html页面内容是否为当前服务器的IP地址

2、 配置keepalived

按照上面的安装方法,keepalived的配置文件在/etc/keepalived/keepalived.conf。主、从服务器的配置相关联但有所不同。如下:

Master:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_MASTER
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.80.77
    }
}

virtual_server 192.168.80.77 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.80.188 80 {
        weight 1
		TCP_CHECK {
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
	}

	real_server 192.168.80.189 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

Backup:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_BACKUP
}

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

virtual_server 192.168.80.77 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.80.188 80 {
        weight 1
		TCP_CHECK {
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
	}

	real_server 192.168.80.189 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

验证:

  • 先后在主、从服务器上启动keepalived: /etc/init.d/keepalived start
  • 在主服务器上查看是否已经绑定了虚拟IP: ip addr
  • 停止主服务器上的keepalived: /etc/init.d/keepalived stop 然后在从服务器上查看是否已经绑定了虚拟IP:
  • 启动主服务器上的keepalived,看看主服务器能否重新接管虚拟IP

让keepalived监控NginX的状态

经过前面的配置,如果主服务器的keepalived停止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP。 但这并不是我们需要的,我们需要的是当NginX停止服务的时候能够自动切换。

keepalived支持配置监控脚本,我们可以通过脚本监控NginX的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复NginX则杀掉keepalived,使得从服务器能够接管服务。

  • 如何监控NginX的状态

最简单的做法是监控NginX进程,更靠谱的做法是检查NginX端口,最靠谱的做法是检查多个url能否获取到页面。

  • 如何尝试恢复服务

如果发现NginX不正常,重启之。等待3秒再次校验,仍然失败则不再尝试。

根据上述策略很容易写出监控脚本。这里使用nmap检查nginx端口来判断nginx的状态,记得要首先安装nmap。监控脚本如下:

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

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

不要忘了设置脚本的执行权限,否则不起作用。

假设上述脚本放在/usr/local/nginx/chk_nginx.sh,则keepalived.conf中增加如下配置:

vrrp_script chk_http_port {
    script "/usr/local/nginx/chk_nginx.sh"
    interval 2
    weight 2
}

track_script {
    chk_http_port
}

增加完成后的配置如下:

Master:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_MASTER
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.80.77
    }
    track_script {
        chk_http_port
    }
}

vrrp_script chk_http_port {
    script "/usr/local/nginx/chk_nginx.sh"
    interval 2
    weight 2
}

virtual_server 192.168.80.77 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.80.188 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.80.189 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

Backup:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_BACKUP
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.80.77
    }
    track_script {
        chk_http_port
    }
}

vrrp_script chk_http_port {
    script "/usr/local/nginx/chk_nginx.sh"
    interval 2
    weight 2
}

virtual_server 192.168.80.77 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.80.188 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.80.189 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

更进一步,为了避免启动keepalived之前没有启动nginx , 可以在/etc/init.d/keepalived的start中首先启动nginx:

start() {
    /usr/local/nginx/sbin/nginx
    sleep 3
    echo -n $"Starting $prog: "
    daemon keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}

 

参考:http://www.cnblogs.com/holbrook/archive/2012/10/25/2738475.html#sec-5

© 著作权归作者所有

共有 人打赏支持
闪电
粉丝 74
博文 392
码字总数 6789
作品 0
海淀
技术主管
私信 提问
keepalived+nginx+tomcat的简单部署

keepalived+nginx Keepalived是一个基于VRRP协议来实现的服务高可用方案,也是一种高性能的服务器高可用或热备解决方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、p...

听雨x
2017/09/06
0
0
keepalived+nginx

高集成:keepalived 负载均衡:nginx 1、服务器IP Client: 172.25.254.25 Keepalived+Nginx1: 172.25.254.115 Vip: 172.25.254.100 Keepalived+Nginx2: 172.25.254.215 Vip: 172.25.254.100 ......

铁骑传说
2017/07/30
0
0
深入浅出Nginx

前言 Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。 架构图 上图基本上说明了当下流行的技术架构,其中Nginx有点入...

张丰哲
2017/09/10
0
0
FastDFS分布式文件系统集群安装与配置

FastDFS集群规划 跟踪服务器负载均衡节点1:192.168.1.206 dfs-nginx-proxy-1 跟踪服务器负载均衡节点2:192.168.1.207 dfs-nginx-proxy-2 跟踪服务器1:192.168.1.200 dfs-tracker-1 跟踪服...

xiaoxiongmao8
2017/02/08
0
0
JAVAEE——宜立方商城03:商品类目选择、Nginx端口或域名区分虚拟机、Nginx反向代理、负载均衡、keepalived实现高可用

1. 学习计划 第三天: 1、商品类目选择(EasyUI的tree实现) 2、图片上传 a) 图片服务器FastDFS(Nainx部分) 2. 商品类目选择 2.1. 原型 2.2. 功能分析 展示商品分类列表,使用EasyUI的tre...

kent鹏
2018/07/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
3
0
C++网络编程(一)gRPC的编译

Google是真滴烦,整个编译链全是自家产品,在编译之前先来安装一堆东西 安装环境依赖 chocolatey Windows下的包管理系统,没有他就慢慢去下载下面的一堆乱七八糟的东西吧。CMD下执行下面这句...

Pulsar-V
今天
3
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0
手机通过wifi遥控arduino

手机下载Blinker 从Blinker官网下载手机App,安装到手机。 手机连接WiFi。 点击我的设备右上角的"+"添加设备,选择Arduino -> wifi接入,复制密钥以备后续使用。 点击新建的设备,可以在新界...

davidwbnu
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部