keepalived+lvs +httpd做双机负载出现502 proxy error

mroject_freeswitch 2017-08-29 03:46:41
各位大神好:
在一个项目中使用Keepalived+lvs做主备负载,架构是 Keepalived+lvs +httpd,逻辑是httpd两台做软的loadbalancer,Keepalived+lvs做主备负载。
出现的问题是:通过VIP访问中服务会出现502 proxy error,直接访问httpd中两个地址不会出现502 proxy error。
Lvs每天keepalived,httpd主机都部署了。
下面是Keepalived配置文件
global_defs {
router_id LVS_DEVEL
}

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

virtual_server 10.37.224.42 8889 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP

real_server 10.37.224.5 8889 {
weight 15
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8889
}
}

real_server 10.37.224.6 8889 {
weight 15
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8889
}
}

real_server 10.37.224.7 8889 {
weight 15
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8889
}
}
}

麻烦大神帮忙看看。
...全文
371 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码誊写工 2017-09-05
  • 打赏
  • 举报
回复
给你一个我的配置,包括一个配置文件和一个脚本(记得设置为可执行)有注释,如果帮到你,请结贴 另外,如果不是关于配置的问题,请google。 我挺担心别人问: 为什么我的网络不通 为什么我开不了机 为什么我的机器上ifconfig用不了 为什么我的机器上没有systemctl命令 为什么我的贴了你的文档,注释全是乱码 为什么我改了IP还是报错 为什么我在/etc目录下找不到你说的hostname文件 为什么我用[ "$a"=="b" ]总是返回0,即使$a并不等于"b"。是不是因为玄之又玄的计算机总是针对我出幺蛾子 为什么我完全按你给的内核参数修改啦,但网络还是很慢 我也想问问,为什么不自己搜搜
#########keepalived配置文件 /etc/keepalived/keepalived.conf##############
global_defs {
    notification_email {
        xxx@abc.com
        yyy@abc.com
    }
    notification_email_from root
    smtp_server smtp.abc.com
    smtp_connect_timeout 30
    router_id app1_node1                                ## 本节点的标识字符串,可以为hostname,只要每个节点不同就可以(相同也不影响运行,但邮件通知里节点同名就让管理员傻逼了)
}
vrrp_instance app1_cluster { 
    state BACKUP                                        ## 节点状态预设值(MASTER|BACKUP),不过当keepalived启动时会将先启动的(设置了nopreempt)或priority比较大的节点选举为MASTER,都设为BACKUP吧
    interface eth0                                      ## 绑定VIP的接口
    virtual_router_id 51                                ## 区分多个instance的VRRP组播,取值0-255之间,不同节点相同vrrp_instance该值必须相同!
    priority 200                                        ## 节点的优先级的初始值(受健康检查影响而变化),该值越大,表示优先级越高,默认最大优先级的为master,即VIP的拥有者,但设置了nopreempt时例外。
    nopreempt                                           ## 即使master恢复也不接管backup,减少切换带来的丢包等问题
    #preempt_delay 60                                   ## master启动多久之后进行接管资源(VIP/Route信息等),与nopreempt互斥。
    advert_int 1                                        ## 发VRRP包的时间间隔,即多久进行一次master选举
    authentication {
        auth_type PASS                                  ## 设置验证类型,主要有PASS和AH两种
        auth_pass 1111                                  ## 验证密码,同一instance的节点要一致
    }
    virtual_ipaddress {
        192.168.200.86/32                               ## VIP地址和掩码,不一定非要32,但为了和RealServer的统一(DR方式下RealServer也要有和vip相同的ip绑在lo接口),最好就设为255.255.255.255。
    }
    notify_master "/etc/keepalived/notify_script master"## 切到master后执行的脚本(很重要,否则无法实现DR)
    notify_backup "/etc/keepalived/notify_script backup"## 切到backup后执行的脚本(很重要,否则无法实现DR)
    notify_fault "/etc/keepalived/notify_script fault"  ## 故障状态后执行的脚本,这部分我随便写的,没有测试过,不需要可以注释掉
}
virtual_server 192.168.200.86 8000 {                    ## VIP的地址和端口,别忘了修改
                                                        ## 以下设置实际是在调用ipvs,所以我把ipvsadm参数也放在注释里面
    delay_loop 6                                        ## 设置健康检查时间,单位是秒
    lb_algo sh                                          ## 设置LVS调度算法,采用sh(-s sh),就是只要是这个源地址就会一直分配一个RS,算法有:rr、wrr、lc、wlc、lblc、lblcr、dh、sh、sed、nq,你原来是rr,就是请求一次换台服务器
    lb_kind DR                                          ## 设置LVS实现LB机制,有DR(-g)、NAT(-m)和TUN(-i)三种,NAT方式我很少用,TUN压根儿没有用过
    persistence_timeout 600                             ## 这个就是持久连接的秒数,会话保持时间,单位为秒(-p),设大些,默认300
    protocol TCP                                        ## 指定转发协议,有TCP(-t)和UDP(-u)两种
    real_server 192.168.200.81 8000 {                   ## 设置real_server的ip(-r 192.168.200.81:8000),无端口映射可以不加端口号,DR不允许端口映射,别忘了修改
        weight 1                                        ## 配置节点权限,默认为1,0为失效,数字越大权限越高(-w 1),也就被访问个没完,都设为1就好了
        HTTP_GET {                                      ## 使用HTTP_GET方式检查,SSL_GET的参数与其类似
            url {
                path /                                  ## 就是http://192.168.200.81:8000后的url,可能是/index.html,/index.jsp啥的,请根据实际情况
                #status_code 200
                digest 23a90ac5e681408b59dc9b8e62a9ce49 ## 由genhash访问url生成。值相同则表示健康,这个比status_code靠谱,如果是通过http访问了db,还可以判断db是否正常。这个是我应用的值,你要自己改
            }
            connect_timeout 10                          ## 尝试连接访问url的最大时间
            nb_get_retry 3                              ## 尝试的次数
            delay_before_retry 3                        ## 每次尝试的时间间隔
        }
    }
    real_server 192.168.200.82 8000 {                   ## 别忘了修改
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.200.83 8000 {                   ## 别忘了修改,只有两台就删掉
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
脚本,很重要!!!
##########用来设置DR方式的脚本,我放在/etc/keepalived/notify_script,没有这个脚本lvs就不会工作在DR状态
#!/bin/bash
VIP=192.168.200.86                                          ##别忘了修改
case "$1" in
    backup)
        ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
        /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
        echo "RealServer Start OK"
        ;;
    master)
        route del $VIP >/dev/null 2>&1
        ifconfig lo:0 down
        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 "RealServer Stoped"
        ;;
    fault)
        ## stop keepalived
        systemctl stop keepalived
        while [[ -n $(pidof /usr/sbin/keepalived) ]]; do   ## 如果没有pidof就安装一下,在sysvinit-tools包里
            kill -9 $(pidof /usr/sbin/keepalived)
            sleep 3
        done

        # stop http server
        if [[ $(curl -I -m 10 -w %{http_code} -o /dev/null  -s http://127.0.0.1:8000/) -ne 200 ]];then
            while [[ -n $(pgrep -f </path/to/app1>) ]]; do ##如果没有pgrep就安装一下,在procps-ng包里
                kill -9 $(pgrep -f </path/to/app1>)        ## 这个app1是你程序的名字,请根据需要修改。例如tomcat
                sleep 3
            done
        fi

        # reset kernel argument and network
        ifconfig lo:0 down >/dev/null 2>&1
        ifconfig eth0:0 down >/dev/null 2>&1
        route del $VIP >/dev/null 2>&1
        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
        

        </path/to/app1>                                    ## 启动你的应用
        systemctl start keepalived                         ## 启动keepalived
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac
exit 0
mroject_freeswitch 2017-09-01
  • 打赏
  • 举报
回复
关于连接不持久怎么解决?VIP写错了,因为是内部网络不能拿出来导致.
代码誊写工 2017-08-30
  • 打赏
  • 举报
回复
你这配置对不上你说的场景,192.100.1.196是你工作的vip吗?10.37.224.*又是啥? keepalived在这里管好vip就行了,如果没有其它服务要做ha,virtual_server部分注释掉 ipvsadm在所有的节点都配置好,它工作的依据就是vip到哪儿,哪儿就干活,没有就闲着,和主备没有啥关系,也最好别加关系。 另外应该进行持久连接超时的设置,时间60s以上(例如-p 100)。企业内应用http一般都没有啥负载,所以算法选sh(-s sh)就可以,否则需要http server做session share. 那个502错误多半和连接不持续有关。

19,614

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧