高可用示例

两台nginx操作

关闭防火墙及selinux

systemctl stop firewalld 
setenforce 0

创建ARP冲突检测脚本

vi /etc/init.d/realserver
#!/bin/bash
# chkconfig: 2345 15 85
# description:Script to start LVS DR real server.
. /etc/rc.d/init.d/functions
VIP=192.168.32.100

#修改相应的VIP
case "$1" in
    start)
        #启动 LVS-DR 模式,real server on this machine. 关闭ARP冲突检测。
        echo "Start LVS of Real Server!"
        /usr/sbin/ifdown lo
        /usr/sbin/ifup lo
        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
        ip addr add ${VIP}/32 brd ${VIP} dev lo label lo:0
        ip route add ${VIP} dev lo:0
        sudo sysctl -p
    ;;

    stop)
        #停止LVS-DR real server loopback device(s).
        echo "Close LVS Director Server!"
        ip route del ${VIP} dev lo:0
        ip addr del ${VIP}/32 brd ${VIP} dev lo label lo:0
        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
        sudo sysctl -p
    ;;
    
    status)
        # Status of LVS-DR real server.
        islothere=`/sbin/ifconfig lo:0 | grep $VIP`
        isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
        if [ ! "$islothere" -o ! "isrothere" ];then
        # Either the route or the lo:0 device
        # not found.
            echo "LVS-DR real server Stopped!"
        else
            echo "LVS-DR real server Running..."
        fi
    ;;
    
    *)
        # Invalid entry.
        echo "$0: Usage: $0 {start|status|stop}"
        exit 1
    ;;

esac

关闭ARP冲突检测

chmod +x /etc/init.d/realserver 
chmod +x /etc/rc.d/init.d/functions
service realserver start

开机自启动

chkconfig realserver on

# 验证
ll /etc/rc3.d/S15realserver 
lrwxrwxrwx 1 root root 20 Mar 24 11:26 /etc/rc3.d/S15realserver -> ../init.d/realserver

如果没有上述软连接的话,设置失败。
可以排查一下是不是启动优先级被别的服务占用。

安装nginx

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install -y nginx

修改页面及启动

echo 'ip: 192.168.32.137' > /usr/share/nginx/html/index.html 
systemctl start nginx

两个keepalived主机

关闭防火墙及selinux

systemctl stop firewalld 
setenforce 0

下载安装包

yum install -y keepalived ipvsadm

修改keepalive master配置

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vi /etc/keepalived/keepalived.conf
global_defs {
   smtp_server 127.0.0.1
}

vrrp_instance VI_1 {
    state MASTER          #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface ens33       #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 100          #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1          #检查间隔,默认为1s
    authentication {      #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.32.100    #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
    }
}

# 【注意】不会生成对应的端口
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.32.100 443 {
    delay_loop 6          # 设置健康检查时间,单位是秒
    lb_algo wlc           # 设置负载调度的算法为wlc,有 rr|wrr|lc|wlc|lblc|sh|dh 七种模式
    lb_kind DR            # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 192.168.32.137 443 {  # 指定real server1的IP地址
        weight 3   # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 443
        }
    }
    real_server 192.168.32.145 443 {  # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 443
        }
     }
}

修改keepalived backup配置

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vi /etc/keepalived/keepalived.conf
global_defs {
   smtp_server 127.0.0.1
}

vrrp_instance VI_1 {
    state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface ens33  #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 50  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1  #检查间隔,默认为1s
    authentication {   #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.32.100  #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
    }
}

# 【注意】不会生成对应的端口
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.32.100 443 {
    delay_loop 6 # 设置健康检查时间,单位是秒
    lb_algo wlc  # 设置负载调度的算法为wlc,有 rr|wrr|lc|wlc|lblc|sh|dh 七种模式
    lb_kind DR   # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 192.168.32.137 443 {  # 指定real server1的IP地址
        weight 3   # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 443
        }
    }

    real_server 192.168.32.145 443 {  # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 443
        }
     }
}

启动服务

systemctl start keepalived

总结

  1. keepalived节点不会生成对应的lvs转发端口
  2. keepalived主机(有VIP节点),telnet VIP 端口 表现是没有通的 ==> 正常现象
  3. keepalived转发规则是DR(参数lb_kind设置)的话,数据包走向是 客户端 -> keepalived节点 -> 后端主机 -> 客户端

术语说明

名称 含义
DS(Director Server) 前端负载均衡节点服务器
RS(Real SERVER) 后端真实服务器
CIP(Client IP) 客户端IP地址
VIP(Virtual IP) 负载均衡对外提供访问的IP地址,一般负载均衡IP都会通过Viirtual IP实现高可用
RIP(RealServer IP) 负载均衡后端的真实服务器IP地址

DR模式具体数据包流向分析

  1. 客户端 发送请求到 Director Server,请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP) 到达内核空间。
  2. Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输。
  3. 内核空间判断数据包的目标 IP 是本机 VIP,此时 IPVS 比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC 地址为 Director Server 的 MAC 地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源IP 地址与目标 IP 地址没有改 变,然后将数据包发送给 Real Server。
  4. 到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数 据包重新封装报文(源 IP 地址为VIP,目标 IP 为 CIP),将响应报文通过 lo 接口传送给物理 网卡然后向外发出。
  5. Real Server 直接将响应报文传送到客户端。
posted @   jiaxzeng  阅读(59)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示