高可用示例
两台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
总结
- keepalived节点不会生成对应的lvs转发端口
- keepalived主机(有VIP节点),
telnet VIP 端口
表现是没有通的 ==> 正常现象 - 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模式具体数据包流向分析
- 客户端 发送请求到 Director Server,请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP) 到达内核空间。
- Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输。
- 内核空间判断数据包的目标 IP 是本机 VIP,此时 IPVS 比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC 地址为 Director Server 的 MAC 地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源IP 地址与目标 IP 地址没有改 变,然后将数据包发送给 Real Server。
- 到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数 据包重新封装报文(源 IP 地址为VIP,目标 IP 为 CIP),将响应报文通过 lo 接口传送给物理 网卡然后向外发出。
- Real Server 直接将响应报文传送到客户端。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具