`
yue_ch
  • 浏览: 6571 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
文章分类
社区版块
存档分类
最新评论

LVS+Keepalived+Nginx的奇怪问题

 
阅读更多

最近因为项目中服务器架构要升级,考虑到高可用性,决定采用keepalived做LVS Server的双机互备,然后LVS作为DB和前端Nginx的load balancer。

我的环境:
VIP 10.8.12.200 
PostgreSql RealServer1 10.8.12.208 
PostgreSql RealServer2 10.8.12.209
Tomcat 1 10.8.12.203
Tomcat 2 10.8.12.204
LVS Server1 & Nginx RealServer1 10.8.12.201
LVS Server2 & Nginx RealServer2 10.8.12.202

gateway 10.8.12.254

上述服务器都只配一块网卡,Ubuntu 11.04 Server

这些都是用vmware创建的虚拟机,考虑到生产环境的服务器数量有限,所以LVS Server和Nginx RealServer是安装在同一台机器上的。ipvsadm、keepalived安装在10.8.12.201(LVS Server1 & Nginx RealServer1)和10.8.12.202(LVS Server2 & Nginx RealServer2)机器上。


我准备了两套方案如下:
方案一:
前端采用Nginx作反向代理服务器并同时作动静分离,load balances到后端的tomcat集群和web服务器。后端用LVS作为PostgreSql Server的load balancer。keepalived做双机互备。

keepalived master上的配置文件内容如下:

global_defs { 
    router_id Nginx_Id_1 
} 

vrrp_script Monitor_Nginx { 
    script "/usr/local/keepalived/etc/keepalived/scripts/monitor_nginx.sh" 
    interval 2 
    weight 2 
} 

vrrp_instance VI_1 { 
    state MASTER 
    interface eth0 
    virtual_router_id 33 
    priority 101 
    advert_int 1 

    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 

    #VIP 
    virtual_ipaddress { 
        10.8.12.200 
    } 

    track_script { 
        Monitor_Nginx 
    } 
} 

virtual_server 10.8.12.200 5432 { 
    delay_loop 6 
    lb_algo rr 
    lb_kind DR 
    persistence_timeout 0 
    protocol TCP 

    real_server 10.8.12.208 5432 { 
        weight 1 
        TCP_CHECK { 
            connect_port 5432 
            connect_timeout 10 
        } 
    } 

    real_server 10.8.12.209 5432 { 
        weight 1 
        TCP_CHECK { 
            connect_port 5432 
            connect_timeout 10 
        } 
    } 
} 

 

keepalived backup配置文件此处省略...

LVS Server的路由信息:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
->RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.8.12.200:5432 rr
->10.8.12.208:5432 Route 1 0 0
->10.8.12.209:5432 Route 1 0 0


PostgreSql RealServer的lvs脚本如下:

/bin/bash 
#Description : RealServer Start! 

VIP=10.8.12.210 
LVS_TYPE=DR 

. /lib/lsb/init-functions 


case "$1" in 
    start) 
        echo "start LVS of REALServer" 
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up 
        /sbin/route add -host $VIP dev lo:0 
        echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore 
        echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce 
        echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore 
        echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce 
        ;; 
    stop) 
        route del -host $VIP dev lo:0 
        /sbin/ifconfig lo:0 down 
        echo "close LVS Directorserver" 
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore 
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce 
        echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore 
        echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce 
       ;; 
    *) 
        echo "Usage $0 {start|stop}" 
        exit 1 
       ;; 
esac 

exit 0 

 


DB RealServer上的route:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.8.12.200 * 255.255.255.255 UH 0 0 0 lo
10.8.12.0 * 255.255.255.0 U 0 0 0 eth0
default 10.8.12.254 0.0.0.0 UG 100 0 0 eth0


这套方案经测试没有问题。



方案二:
前端采用LVS作为Nginx的load balancer,Nginx再作反向代理服务器并同时作动静分离,load balances到后端的tomcat集群和web服务器,keepalived做LVS双机互备。后端用LVS作为PostgreSql Server的load balancer。PostgreSql的LVS Server和Nginx的LVS Server是同一个,只是端口不同。LVS Server和Nginx RealServer共享同一台机器,PostgreSql RealServer是另外两台机器。
相比方案一,方案二只是在前端Nginx上又加了一层LVS的load balancer,Nginx的角色本身没有变化。

keepalived master配置文件内容如下:

global_defs { 
     router_id Nginx_Id_1 
} 

vrrp_script Monitor_Nginx { 
    script "/usr/local/keepalived/etc/keepalived/scripts/monitor_nginx.sh" 
    interval 2 
    weight 2 
} 

vrrp_instance VI_1 { 
    state BACKUP 
    interface eth0 
    virtual_router_id 33 
    priority 100 
    advert_int 1 

    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 

    #VIP 
    virtual_ipaddress { 
        10.8.12.200 
    } 

    track_script { 
        Monitor_Nginx 
    } 
} 

virtual_server 10.8.12.200 80 { 
    delay_loop 6 
    lb_algo rr 
    lb_kind DR 
    persistence_timeout 60 
    protocol TCP 

    real_server 10.8.12.201 80 { 
        weight 1 
        TCP_CHECK { 
            connect_port 80 
            connect_timeout 10 
        } 
    } 

    real_server 10.8.12.202 80 { 
        weight 1 
        TCP_CHECK { 
            connect_port 80 
            connect_timeout 10 
        } 
    } 
} 

virtual_server 10.8.12.200 5432 { 
    delay_loop 6 
    lb_algo rr 
    lb_kind DR 
    persistence_timeout 0 
    protocol TCP 

    real_server 10.8.12.208 5432 { 
        weight 1 
        TCP_CHECK { 
            connect_port 5432 
            connect_timeout 10 
        } 
    } 


    real_server 10.8.12.209 5432 { 
        weight 1 
        TCP_CHECK { 
            connect_port 5432 
            connect_timeout 10 
        } 
    } 
} 

 可以看出来,相比方案一,只是多了10.8.12.200 80端口的LVS配置。


此时的LVS Server路由信息如下:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.8.12.200:80 rr persistent 60
->10.8.12.201:80 Route 1 0 0
-> 10.8.12.202:80 Route 1 0 0
TCP 10.8.12.200:5432 rr
-> 10.8.12.208:5432 Route 1 0 0
-> 10.8.12.209:5432 Route 1 0 0


由于LVS Server同时又是Nginx RealServer节点,所以在10.8.12.201(LVS Server1 & Nginx RealServer1)和10.8.12.202(LVS Server2 & Nginx RealServer2)机器上还创建了lvs脚本如下:

/bin/bash 
#Description : RealServer Start! 

VIP=10.8.12.210 
LVS_TYPE=DR 

. /lib/lsb/init-functions 


case "$1" in 
    start) 
        echo "start LVS of REALServer" 
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up 
        /sbin/route add -host $VIP dev lo:0 
        echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore 
        echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce 
        echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore 
        echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce 
        ;; 
    stop) 
        route del -host $VIP dev lo:0 
        /sbin/ifconfig lo:0 down 
        echo "close LVS Directorserver" 
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore 
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce 
        echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore 
        echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce 
       ;; 
    *) 
        echo "Usage $0 {start|stop" 
        exit 1 
       ;; 
esac 

exit 0 

 
Nginx RealServer上的route:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.8.12.200 * 255.255.255.255 UH 0 0 0 lo
10.8.12.0 * 255.255.255.0 U 0 0 0 eth0
default 10.8.12.254 0.0.0.0 UG 100 0 0 eth0


DB RealServer节点的配置与方案一相同,此处省略。


问题现象如下:
LVS服务器刚启动时,访问10.8.12.200一切正常。
在服务器运行一段时间后(其实也就几分钟,这期间没有做页面访问),再次访问10.8.12.200访问失败,返回502,多次刷新问题依旧。检查LVS Server的路由信息没有变化,route也是正常的。然后我尝试直接访问10.8.12.201上的nginx,访问正常;再尝试直接访问10.8.12.203:8080(后端tomcat),访问也正常。这就是说LVS Server load balance DB RealServer此时是正常的,只是load balance Nginx RealServer不正常。停掉keepalived主机后,备机可以正常接管,接管后再访问10.8.12.200正常。再把keepalived主机启起来后,主机又接管了VIP,但10.8.12.200依然不能访问。在ipvsadm -C之后,访问又正常了(偶然的发现,实在想不明白为什么这样)。


思考:
网上的教程说LVS Server和RealServer节点完全可以共享同一台机器,但在这里只是共享的Nginx RealServer无法访问,DB RealServer是正常的,实在不知道问题出在哪里。

 

 

问题解决了,是keepalived的配置问题,80端口由于是由nginx负责做load balance,所以针对80端口的lvs配置就是多余的了,删掉就可以了。

 

分享到:
评论

相关推荐

    lvs+Keepalived+nginx高可用负载均衡搭建部署方案

    lvs+Keepalived+nginx高可用负载均衡搭建部署方案

    LVS+KeepAlived+Nginx高可用实现方案.pdf

    "LVS+KeepAlived+Nginx高可用实现方案" LVS(Linux Virtual Server)是一种虚拟服务器集群系统,旨在提供高性能、高可用的服务器解决方案。其主要特点包括可伸缩性、可靠性和可管理性。LVS通过IP负载均衡技术实现...

    LVS+Keepalived高可用负载均衡集群

    随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司...我们利用LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。

    第三十三章:Lvs+Keepalived+Nginx+Tomcat高可用集群1

    LVS+Keepalived+Nginx+Tomcat 高可用集群项目 本文主要讲述了如何构建一个高可用集群项目,使用 LVS、Keepalived、Nginx 和 Tomcat 实现高可用性和负载均衡。该项目的架构中,Keepalived 负责对 LVS 架构中的调度器...

    lvs+KeepAlived搭建实战.pdf

    Lvs抗负载能力强,因为 lvs 工作方式的逻辑是非常之简单,而且工作在网络 4 层仅做请求分发之用,没有流量,所以在效率上基本不...文档简单演示了lvs+keepalived的搭建过程和负载测试,顺便记录下来。每天进步一点。

    生产环境之负债均衡LVS+keepalived方案(1)-方案对比(vs nginx+keepalived).pdf

    本文将探讨LVS+keepalived与nginx+keepalived这两种方案的对比,以帮助决策者理解它们各自的特点和适用场景。 LVS(Linux Virtual Server)是专为实现负载均衡设计的开源项目,由章文嵩博士领导开发,并在Linux内核...

    4 lvs+keepalived+nginx+tomcat实现高性能负载均衡集群.docx

    这里提到的“4 lvs+keepalived+nginx+tomcat”架构,就是一种常用的解决方案,用于处理高流量的Web服务。下面将详细解释每个组件的作用和配置方法。 1. LVS(Linux Virtual Server): LVS是Linux内核中的一个负载...

    lvs+keepalived+nginx+tomcat+memcached实现服务负载均衡及session共享

    本文将详细探讨如何使用lvs(Linux Virtual Server)、keepalived、nginx、tomcat以及memcached来实现这一目标。 首先,lvs是Linux内核中的一个模块,它提供了四层负载均衡功能,能够将进来的网络请求分发到后端多...

    nginx+lvs+keepalived安装文档

    ### Nginx + LVS + Keepalived 安装与配置详解 #### 一、概述 本文档将详细介绍如何在 Linux 系统上部署 nginx、LVS 以及 Keepalived,构建一个高可用且负载均衡的服务集群。通过这种方式,不仅可以提高服务的稳定...

    lvs+keepalived+nginx+tomcat实现高性能负载均衡集群.rar

    这个文档"lvs+keepalived+nginx+tomcat实现高性能负载均衡集群.docx"将详细解释每个组件的配置细节、集群的架构图以及可能出现的问题及解决方案,帮助你更好地理解和实施这个高性能的负载均衡集群。

    在lvs+keepalived+MHA+MySQL下构建ecshop

    项目要达到搭建一个每日PV200W的电子商务网站,系统采用lvs+keepalived+mha+mysql 高可用架构, 本项目各个服务器操作系统均采用Centos7.5,数据库均为MYSQL5.7.23

    lvs+keepalived+nginx+tomcat 集群联系1

    在搭建基于`lvs+keepalived+nginx+tomcat`的集群时,我们需要理解这些组件各自的作用以及它们如何协同工作以实现高可用性和负载均衡。以下是详细的知识点解释: 1. **LVS (Linux Virtual Server)**: LVS 是一种在 ...

    LVS+Keepalived+Squid+Nginx

    在构建高性能、高可用性的Web服务架构中,`LVS(负载均衡服务器)`、`Keepalived`、`Squid`(代理缓存服务器)和`Nginx`(反向代理服务器)是四个非常关键的组件。下面将详细介绍这四个技术及其相互配合的工作原理。 1. *...

    高性能业务架构解决方案(LVS+Keepalived)

    ### 高性能业务架构解决方案(LVS+Keepalived) #### 概况 **1.1 应用场景** 在互联网行业中,随着业务量的增长和技术的发展,如何构建一个既能够应对高并发请求又具备高可用性的系统变得尤为重要。在众多的负载...

    lvs+keepalives部署.txt

    简介 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从...高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选 可不选)

    Keepalived+LVS+Nginx

    软件环境包括Linux内核版本2.6.9-89.31.1,以及LNMP(Linux+Nginx+MySQL+PHP)栈,确保了系统的稳定性和兼容性。 #### 五、结论 通过构建Keepalived+LVS+Nginx的高可用性负载均衡架构,可以显著提高服务的稳定性和...

    通过LVS+Keepalived搭建高可用的负载均衡集群系统

    通过LVS+Keepalived搭建高可用的负载均衡集群系统

    LVS+Nginx+Lamp+NFS架构

    LVS+Nginx+Lamp+NFS架构 本文将详细介绍 LVS+Nginx+Lamp+NFS 架构的知识点,并对每个组件进行详细的解释。 LVS LVS(Linux Virtual Server)是一种开源的负载均衡器,可以实现服务器集群的负载均衡。它可以将...

    LVS+keeplived+nginx+apache

    在介绍如何搭建高可用、高性能PHP集群的过程中,涉及的技术点和知识点主要围绕LVS、Keepalived、Nginx和Apache这几个组件展开。下文将详细阐述这些组件的作用以及如何将它们组合起来实现目标。 首先,LVS(Linux ...

Global site tag (gtag.js) - Google Analytics