原文链接:http://unun.in/linux/156.html

方案:

采用两台Nginx服务器作为前端,提供静态web内容,分发web请求,一主一从,Keepalived实现状态监测,保证 Nginx正常对外提供服务,即主Nginx服务进程死掉之后,keepalived能够通过脚本或者程序检测机制,将网站的访问切换到从Nginx上 来。后端的web应用服务器的监控由Nginx负责,keepalived只监控Nginx的健康状况。

性能:大约是硬件负载均衡器的10%

优势:虽然性能远弱于LVS+Keepalived方案,但Nginx本身就是web服务器,可处理静态文件,页面缓存,rewrite等WEB容器功能,在web前端的负载均衡应用优先选用此方案。

应用情景:作为web应用服务器集群前端的负载均衡器。

环境:

操作系统:centos6.5

Keepalived版本: keepalived-1.2.13.tar.gz

nginx版本:nginx-1.6.2.tar.gz

主机IP

Node0:192.168.99.138

Node1:192.168.99.155

虚拟IP: 192.168.99.168

后端WEB服务器IP:

ng2:192.168.99.152

ng3:192.168.99.135

----------------------------------------------------

这里我们选用的是lnmp环境,LNMP环境的可以自己编译安装,这里也有一个简单的配置教程:centos + nginx + php-fpm +mysql的简单配置,生产环境中最好自己编译安装。

----------------------------------------------------

keepalived安装配置步骤:

1.1 下载keepalived,官网下载地址:http://www.keepalived.org/download.html

cd /usr/local/src/
wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz

不得不说的是keepalived的下载速度慢成翔,最终也是没有wget下载下来,我传到oschina上了

下载地址:http://git.oschina.net/xiaoshusheng/Slow-download-speed/tree/master/keepalived

1.2 解压、并编译安装keepalived

tar -zxvf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13
./configure --prefix=/usr/local/keepalived
make && make install

2.1 设置环境变量和init.d,配置conf文件

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived
vi /etc/keepalived/keepalived.conf

Node1 这部分按照以下修改,其它的默认就行

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.99.168
    }
}

Node0 这部分按照以下修改,其它的默认就行

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

这里是让node1当的主,node0做的从,其他的部分,可以酌情根据自己的实际情况来做出相应的修改!

其实除了global_defs{}和vrrp_instance VI_1{}两个括着的留下来,其它的配置部分可以删掉

启动keepalived

/etc/init.d/keepalived start

使用ip addr 查看虚拟ip是否已绑定,

Node1的结果:

Node0的结果:

可以看到Node1在接管着虚拟ip(VIP)。

----------------------------------------------------

2.1 nginx的安装,请参见:centos + nginx + php-fpm +mysql的简单配置的nginx配置部分,或者:本帖的部分内容:http://unun.in/linux/153.html

----------------------------------------------------

3.1 nginx的反向代理和负载均衡请参考:使用nginx做反向代理及负载均衡

----------------------------------------------------

让keepalived监视nginx状态

4.1 安装nmap

yum install -y nmap

这里直接yum安装了,如果你编译安装也可以,这里不做过多说明了

4.2 编写shell脚本,检查端口是否open,如果不是,重启一下,仍然不是,那就废掉

vi /opt/chk_nginx.sh

加入如下内容:

#!/bin/bash
# check nginx server status
NGINX=/usr/local/nginx/sbin/nginx
PORT=80
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

编写完脚本,别忘了给予它可执行的权限,否则无效

cd /opt/
chmod +x chk_nginx.sh

----------------------------------------2015.08.03更-------------------------------

再次修改keepalived.conf

vi /etc/keepalived/keepalived.conf

在配置里面增加这两部分内容

vrrp_script chk_http_port {
    script "/opt/chk_nginx.sh"
    interval 2
    weight 2
}

然后在vrrp_instance VI_1中增加如下配置

track_script {
  chk_http_port
}

配置的最终结构样子该是这样的,注意前面说的主从配置的区别,这里是个主的最终配置:

global_defs {
   router_id LVS_DEVEL
}
vrrp_script chk_http_port {
    script "/opt/chk_nginx.sh"
    interval 2
    weight 2
}
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.99.168
    }
    track_script {
        chk_http_port
    }
}

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

vi /etc/init.d/keepalived

将start()部分修改为如下样子

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
}

------------------------------------------------------------------------------

检测是否成功

关闭nginx,重启keepalived,查看虚拟IP是否被接管

/etc/init.d/keepalived restart

在Node1(主)上使用

ip addr

可以看到,虚拟IP已被Node1(主)接管

然后用虚拟ip:192.168.99.168访问,访问正常

使用netstat -ltunp命令查看是否nginx存在:结果存在

然后干掉主服务的nginx进程

再使用netstat -ltunp命令查看nginx是否重启:结果已经重启

然后再干掉主服务的nginx进程

再使用netstat -ltunp命令查看nginx是否重启:结果已经重启

使用service keepalived status查看keepalived状态:结果显示:keepalived (pid  2439) is running...

修改Node1上的nginx配置,故意制造错误,然后杀掉nginx进程

使用netstat -ltunp命令查看nginx状态:已经起不来了

然后使用service keepalived status查看keepalived状态:结果显示:keepalived is stopped

然后访问虚拟ip:192.168.99.168,依然能够正常访问

在Node0(从)上使用ip addr查看,发现虚拟IP已被Node0(从)接管

使用netstat -ltunp命令查看是否nginx存在:结果存在

然后干掉主服务的nginx进程

再使用netstat -ltunp命令查看nginx是否重启:结果已经重启

在切换到Node1(主)上,将nginx的配置修改正确,然后启动keepalived

/etc/init.d/keepalived start

在使用ip addr命令查看,发现虚拟IP已被Node1(主)重新接管

使用netstat -ltunp命令查看nginx状态:已被启动

通过上面测试可以发现,可用性大大提高,克服了负载均衡器的单点问题,但是从负载均衡器很多时间处于闲置状态,还是有一定的浪费的!

Keepalived+Nginx提供前端负载均衡+主从双机热备+自动切换的更多相关文章

  1. Nginx+keepalived 脚本安装主从双机热备自动切换解决方案

    Nginx+keepalived 脚本安装主从双机热备自动切换解决方案 2013-07-02 19:24:13 标签:filesnginx keepalived 原创作品,允许转载,转载时请务必以超链 ...

  2. nginx+tomcat实现负载均衡以及双机热备

    还记得那些年吗? 还记得更新代码之后,服务器起不来被领导训斥吗?还记得更新代码,需要停机过多的时间被渠道部们埋怨吗?还记得更新代码,代码出错时自己吓个半死吗?于是我们聪明勤快的程序员,看着电影待到夜深 ...

  3. Nginx+Keepalived主从双机热备+自动切换

    1 安装配置nginx 参考: http://www.cnblogs.com/jager/p/4388202.html 2 安装配置keepalived tar xvf keepalived-1.2. ...

  4. nginx+keepalive主从双机热备+自动切换解决方案

    环境采集cenots 6.3 64位迷你安装,因为安装前,你需要做一些工作 yum install -y make wget 如果你愿意可以更新下系统,更换下yum源. 1.安装keepalive 官 ...

  5. lvs+keepalived+nginx实现高性能负载均衡集群【转】

    转自 lvs+keepalived+nginx实现高性能负载均衡集群 - 青衫lys - 博客园http://www.cnblogs.com/liuyisai/p/5990645.html 一.为什么 ...

  6. Docker:docker部署PXC-5.7.21(mysql5.7.21)集群搭建负载均衡实现双机热部署方案

    单节点数据库弊端 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 推荐Mysql集群部署方案 PXC (Percon ...

  7. 前端通信:ajax设计方案(七)--- 增加请求错误监控、前端负载均衡以、请求宕机切换以及迭代问题修复

    距离上个迭代过了很长时间,中间经历了很多事情,也在每个空余时间构思了这个迭代的东西以及下个迭代要做的东西.时间周期稍微长了,望见谅. 而且,至今这个开源库的start也已经到了165个了,会支持关注和 ...

  8. Centos7 Mysql主从双机热备的实战记录

    操作系统:centos7 服务器:主:172.19.242.69   从:172.19.242.70 1. 服务器 由于Mysql不同版本之间的(二进制日志)binlog格式可能会不太一样,因此最好的 ...

  9. 【Nginx】(主从热备)LVS+Keepalived+Nginx实现高性能负载均衡集群

    一.LVS 1.1 概述 1.2 Nginx与LVS区别什么 二.Keepalived 2.1 概述 2.2 keepalived和其工作原理 三.LVS+Keepalived+Nginx 搭建双机主 ...

随机推荐

  1. 用JavaScript 来将数字转换成字符。

    背景: 一切嵌入式设备上面的信息,比如设备名称,设备时区是可以写入到设备上面的寄存器中的(一个寄存器两个字节,2*8 bit),比如 -1 ,写入到寄存器中为 2d31,然后可以通过一些进程将寄存器中 ...

  2. 关于Application.Lock…Application.Unlock有什么作用?

    因为Application变量里一般存储的是供所有连接到服务器的用户共享的信息(就像程序中所说的 "全局变量 "), 由于是全局变量,所以就容易出现两个或者多个用户同时对这一变量进 ...

  3. CDOJ UESTC 1220 The Battle of Guandu

    The 2015 China Collegiate Programming Contest 2015第一届中国大学生程序设计竞赛 F题 本质就是求单源最短路!注意会爆int 对于每一个村庄i,其实就是 ...

  4. P3P解决cookie存取的跨域问题

    最近在做一个流量统计的东西的时候,偶然发现IE在对iframe里面的页面写Cookie的时候有一些安全限制,导致读取Cookie不成功,找了好长时间的解决办法,重要找到如下的办法: 1.页面里的COO ...

  5. php登录

    if ($name && $passowrd){ $sql = "SELECT * FROM liuyanban WHERE name = '$name' and passw ...

  6. php单元测试到底是什么东西呢?

    前言: 真正写php代码也有3年时间了,勉强算是一个php程序员, 但是,心底却一直没有底气. 都说测试驱动开发,可我连程序开发中什么是单元测试?这种基本的程序员的素养都 还不是很清楚,痛定思痛,决定 ...

  7. spell checking

    Spell checker Description You, as a member of a development team for a new spell checking program, a ...

  8. Codeforces#363 Div2

    A题: 题意:给定一些数,给定一些往左走和往右走的操作,问是否能够相遇,如果相遇请求出相遇时间 分析:对于相邻两个数,如果大的往左,小的往右就能够相遇,否则不能相遇,在求出所有相遇当中的第一次相遇即可 ...

  9. app间互相启动及传参数

    http://blog.sina.com.cn/s/blog_13bc6705b0102wmc5.html http://blog.csdn.net/iefreer/article/details/8 ...

  10. Android L(5.0)源码之图形与图像处理之简单图片——Bitmap

    最近在研究android 5.0的gallery模块,学习了相关的知识点,准备写点博客总结一下,有时间了会补充完整