haproxy+keepalived高可用搭建 实现vip漂移

本文档详细介绍了如何在42.90.6.84和42.90.6.85两台机器上搭建Haproxy的高可用环境,通过Keepalived进行VIP漂移。配置包括haproxy的负载均衡设置、Keepalived的主从配置,以及VIP地址42.90.6.252的设定。通过这种方式,确保了即使一台haproxy服务宕机,VIP也能自动漂移到另一台服务器,保持服务不间断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Haproxy高可用搭建

准备工作

机器ip

VIP					   42.90.6.252
HA主  					42.90.6.84
HA从  					42.90.6.85
Keepalived主  	42.90.6.84
Keepalived从  	42.90.6.85

查看挂载情况

df -Th

如果内网环境,先挂载yum源

mkdir -p /mnt/cdrom
mount CentOS-7-x86_64-Everything-1708.iso /mnt/cdrom/

配置本地yum源

cd /etc/yum.repos.d/

vim /etc/yum.repos.d/cdrom.repo

[CDROM]
name=CentOS7.2 cdrom
baseurl=file:///mnt/cdrom/
enable=1
gpgcheck=0

安装haproxy+keepalived

yum clean all
yum makecache

yum -y install haproxy
yum -y install keepalived

配置haproxy

Ha主从配置相同即可(42.90.6.84,42.90.6.85)

vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     40000
    user        haproxy
    group       haproxy
    ulimit-n    65535
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  dontlognull
    option                  redispatch
    option                  forwardfor
    retries                 3
    timeout http-request    10s
    timeout queue           30s
    timeout connect         10s
    timeout client          30s
    timeout server          30s
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 40000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------



frontend mycat_api
  bind *:8066
  mode tcp
  option tcplog
  default_backend mycat_api_server

backend mycat_api_server
  mode tcp
  balance roundrobin
  option tcplog
  server s1 42.90.6.79:8066 check
  server s2 42.90.6.30:8066 check
  server s3 42.90.6.78:8066 check

listen  stats
  mode  http
  bind *:8199
  stats  enable
  stats hide-version
  stats uri /haproxy-status
  stats realm Haproxy\Statistics
  stats auth admin:admin
  stats admin if TRUE

配置keepalived

本文ha高可用是通过vip漂移实现(nginx同理)

主(42.90.6.84)

vim /etc/keepalived/keepalived.conf
! Copnfiguration File for keepalived
global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id inode2
}

vrrp_script chk_http_port {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight 2
}

vrrp_instance http1 {
    state MASTER
    interface bond0
    virtual_router_id 69
    priority 100
    advert_int 1
    nopreempt   
    authentication {
    auth_type PASS
    auth_pass 111111
    }
    virtual_ipaddress {
    		#配置vip
        42.90.6.252
    }
}

check_haproxy.sh

#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then    ###判断haproxy是否已经启动
    systemctl start haproxy                                ###如果没有启动,则启动haproxy程序
fi
sleep 2                                                    ###睡眠两秒钟,等待haproxy完全启动
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then    ###判断haproxy是否已经启动
    systemctl stop keepalived                              ###如果haproxy没有启动起来,则将keepalived停掉,则VIP自动漂移到另外一台haproxy机器,实现了对haproxy的高可用
fi

从(42.90.6.85)

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id inode2
}

vrrp_script chk_http_port {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight 2
}


vrrp_instance http1 {
    state BACKUP
    interface bond0
    virtual_router_id 69
    priority 70
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 111111
    }
    virtual_ipaddress {
        42.90.6.252
    }
}

check_haproxy.sh

#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then    ###判断haproxy是否已经启动
    systemctl start haproxy                                ###如果没有启动,则启动haproxy程序
fi
sleep 2                                                    ###睡眠两秒钟,等待haproxy完全启动
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then    ###判断haproxy是否已经启动
    systemctl stop keepalived                              ###如果haproxy没有启动起来,则将keepalived停掉,则VIP自动漂移到另外一台haproxy机器,实现了对haproxy的高可用
fi
<think>好的,用户现在想了解在keepalivedhaproxy实现高可用环境中,如何编写检测haproxy的脚本。之前他们询问过kill和killall命令的区别,现在转向了高可用架构的配置,可能是在实际部署中遇到了问题,或者正在学习相关技术。 首先,我需要确认用户的需求。他们可能已经搭建了基于keepalivedhaproxy高可用集群,现在需要确保keepalived能够监控haproxy的状态,并在其故障时进行主备切换。检测脚本的作用就是让keepalived知道haproxy是否还在正常运行,从而决定是否要转移VIP。 接下来,我需要考虑用户可能的背景。他们可能有一定的Linux基础,但可能对keepalived的配置机制太熟悉。因此,解释脚本的同时,可能需要简要说明keepalived的工作原理,比如VRRP协议和vrrp_script的配置。 然后,用户需要的脚本应该是什么样的?通常,检测haproxy是否运行可以通过检查进程是否存在,或者检查端口是否监听。另外,可能还需要考虑haproxy的HTTP健康检查,比如发送请求到管理端口,确认服务是否真正可用,而仅仅是进程存在。这需要根据用户的具体使用场景来决定。 用户可能没有考虑到HAProxy虽然进程在,但实际服务可用的情况,所以需要建议综合检查方式。此外,脚本的退出状态码很重要,因为keepalived根据0或非0来判断成功或失败,进而触发状态切换。 另外,需要提醒用户将脚本正确配置到keepalived的配置文件中,比如在vrrp_script块中引用,并在track_script中调用。还要注意脚本的执行权限,以及测试方法,比如手动执行脚本看返回是否正确。 可能用户遇到的问题包括脚本权限足、路径错误、或者检测逻辑够全面,导致keepalived无法正确感知HAProxy的状态。因此,在回答时需要强调这些注意事项,帮助用户避免常见错误。 最后,用户可能需要具体的示例,所以提供一个基础脚本和一个增强脚本会很有帮助。同时,说明如何将这些脚本整合到keepalived.conf中,并验证配置的正确性。确保用户能够按照步骤一步步完成配置,并理解每个部分的作用。</think>在 **Keepalived + HAProxy** 的高可用架构中,Keepalived 负责通过 VIP(虚拟 IP)实现主备切换,而 HAProxy 负责负载均衡。为了确保 Keepalived 能实时检测 HAProxy 的健康状态,需要编写一个检测脚本,当 HAProxy 服务异常时,触发 Keepalived 切换 VIP。 --- ### **检测脚本的核心逻辑** 1. **检查 HAProxy 进程是否存在** 2. **检查 HAProxy 端口是否监听**(例如 HTTP/HTTPS 或管理端口) 3. **可选**:通过 HAProxy 的管理接口发送 HTTP 请求,验证服务是否真正可用。 --- ### **基础脚本示例** #### 1. 检查 HAProxy 进程和端口(简单版) ```bash #!/bin/bash # 检查 HAProxy 进程是否存在 if ! pgrep -x "haproxy" > /dev/null; then exit 1 # 进程存在,返回非0(触发 Keepalived 切换) fi # 检查 HAProxy 是否监听指定端口(例如 80) if ! netstat -tuln | grep -q ":80 "; then exit 1 # 端口未监听,返回非0 fi exit 0 # 一切正常,返回0 ``` #### 2. 增强版(通过 HAProxy 管理接口检测) ```bash #!/bin/bash # HAProxy 管理接口配置(需提前在 haproxy.cfg 中启用) HAPROXY_STATS_URL="http://localhost:8080/haproxy_stats" # 示例端口和路径 # 检查 HAProxy 进程和端口 if ! pgrep -x "haproxy" > /dev/null; then exit 1 fi # 检查管理接口是否响应(HTTP 200) if ! curl -s --max-time 3 $HAPROXY_STATS_URL | grep -q "HAProxy"; then exit 1 fi exit 0 ``` --- ### **配置 Keepalived 调用脚本** 在 Keepalived 的配置文件 `keepalived.conf` 中,定义 `vrrp_script` 并绑定到 VRRP 实例: ```conf vrrp_script chk_haproxy { script "/etc/keepalived/check_haproxy.sh" # 脚本路径 interval 2 # 检测间隔(秒) weight -20 # 检测失败时优先级降低20(触发主备切换) fall 2 # 连续2次检测失败才认为故障 rise 1 # 1次检测成功即恢复 } vrrp_instance VI_1 { state MASTER # 初始状态(备节点设为 BACKUP) interface eth0 # 监听的网卡 virtual_router_id 51 priority 100 # 初始优先级(备节点设为更低值,如90) advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100 # VIP(虚拟IP) } track_script { chk_haproxy # 绑定检测脚本 } } ``` --- ### **关键注意事项** 1. **脚本权限**:确保脚本可执行 ```bash chmod +x /etc/keepalived/check_haproxy.sh ``` 2. **HAProxy 管理接口**: - 需在 HAProxy 配置文件(`haproxy.cfg`)中启用统计页面: ```conf listen stats bind *:8080 stats enable stats uri /haproxy_stats stats refresh 10s ``` 3. **测试脚本**:手动执行脚本验证返回码 ```bash /etc/keepalived/check_haproxy.sh echo $? # 返回0表示正常,非0表示异常 ``` 4. **日志排查**: - Keepalived 日志:`journalctl -u keepalived` - HAProxy 日志:`tail -f /var/log/haproxy.log` --- ### **故障切换逻辑** - 当脚本返回非0时,Keepalived 降低当前节点优先级。 - 若备节点优先级更高,VIP漂移到备节点。 - 恢复后,优先级自动恢复,VIP 可能切回主节点(取决于 `nopreempt` 配置)。 通过这种方式,HAProxy高可用性将更加健壮!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值