高可用与负载均衡

发布时间:2026/7/26 5:13:20
高可用与负载均衡 LVS 负载均衡Linux Virtual Server概念基本概念LVS 是章文嵩博士开发基于 Linux 内核Netfilter实现的四层负载均衡传输层基于 IP 端口调度。工作在内核态性能极高支持大量并发。组成角色VSVirtual Server调度器 / Director负载均衡服务器接收用户请求分发后端服务器RSReal Server真实服务器后端提供业务服务的服务器VIP虚拟 IP用户访问的统一入口RIP真实服务器内网 IPDIP调度器后端内网 IP工作原理客户端发起请求访问VIP数据包到达 Director。调度器根据预设调度算法挑选一台 RS将请求包转发给后端真实服务器RS 处理请求后把响应数据包返回客户端。LVS 工作在TCP/IP 四层传输层只识别 IP、端口不解析 HTTP 应用层内容。工作模式NAT 模式网络地址转换原理客户端请求→Director调度器修改数据包目标 IP转发给 RSRS 响应数据包必须经过 Director调度器修改源 IP 为 VIP 返回客户端。特点RS 网关必须指向 DIPRS 可以是任意操作系统调度器会成为瓶颈所有进出流量都经过 VSDR 模式直接路由生产最常用原理请求报文客户端→Director调度器修改 MAC 地址转发给同网段 RS目标 MAC 改为 RS 网卡 MAC响应报文RS 直接封装 VIP 作为源 IP不经过调度器直接返回客户端特点请求走 VS响应直连客户端调度器压力小VS 与 RS 必须在同一局域网RS 网卡需要配置 VIP抑制 ARPTUN 模式IP 隧道原理Director 把原始数据包封装一层新 IP 隧道报文转发给跨网段 RSRS 解封装处理业务响应包直接回客户端不经过 VS。特点VS 和 RS 可以跨公网、跨网段RS 需要支持 IP 隧道模块FULLNAT 模式阿里扩展模式非官方原生同时修改源 IP 目标 IP内网之间通信支持跨网段但是性能低于 DR。常见调度算法静态算法不考虑 RS 负载RR 轮询依次分发WRR 加权轮询权重越高分配越多请求DH 目标地址哈希SH 源地址哈希动态算法感知负载LC 最少连接WLC 加权最少连接默认常用LBLC、LBLCRLVS配置参数说明DIP:server3 192.168.234.135 RIP:server4 192.168.234.136 server5 192.168.234.137 VIP:192.168.234.100外加一台测试虚拟机server6 192.168.234.138ipvsadmipvsadm 是 Linux 下用于管理 IPVSIP Virtual ServerIP 虚拟服务器 的命令行工具主要用于构建 LVSLinux Virtual Server负载均衡集群。它允许管理员配置和管理虚拟服务、真实服务器后端节点以及负载均衡策略。参数含义-A添加虚拟服务 VSVIP: 端口-E修改虚拟服务-D删除虚拟服务-a添加后端真实服务器 RS-e修改真实服务器-d删除真实服务器-L / -l查看集群规则-n数字格式显示 IP、端口不解析域名常用-Ln-C清空全部 IPVS 规则-Z清空连接统计计数器-S保存规则ipvsadm-save-R载入规则ipvsadm-restore协议与模式参数参数说明-t VIP:portTCP 协议虚拟服务最常用-u VIP:portUDP 协议虚拟服务-s 算法指定调度算法rr、wrr、lc、wlc (默认)-r RIP:port指定后端真实服务器地址-gDR 直接路由模式生产首选-mNAT 地址转换模式-iTUN 隧道模式-w 数字设置 RS 权重辅助参数参数作用-c查看当前活跃连接--stats输出数据包、连接统计--rate查看流量速率标准示例命令#1 添加虚拟服务VIPwlc算法 ipvsadm -A -t 192.168.1.100:80 -s wlc ​ #2 添加RSDR模式权重1 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.10:80 -g -w 1 ​ #3 添加RSNAT模式 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -m -w 1 ​ #4 查看规则 ipvsadm -Ln ​ #5 清空所有规则 ipvsadm -C ​ #6 持久化保存规则 ipvsadm-save /etc/sysconfig/ipvsadmarptables概念arptables用户空间命令工具依托 Linux 内核 Netfilter 框架专门用于过滤 ARP 报文2.5 层介于二层 MAC 与三层 IP 之间。类比关系arptables ↔ ARP报文 iptables ↔ IP数据包iptables 只能处理 IP 包无法拦截 ARP 广播帧ARP 流量必须由 arptables 管控。核心架构仅有一张表filter 表两条内置链链作用INPUT进入本机的 ARP 报文OUTPUT本机向外发出的 ARP 报文常见动作ACCEPT允许 ARP 报文DROP丢弃 ARP 报文RETURN跳出当前链主要用途防范 ARP 欺骗、ARP 攻击拦截非法 ARP 广播LVS DR 模式 ARP 抑制方案之一阻止 RS 响应 VIP 的 ARP 请求DR 模式冲突VS 和所有 RS 都配置 VIP如果 RS 应答 VIP 的 ARP客户端流量直接访问 RS绕过调度器失效。两种抑制手段①内核参数arp_ignore/arp_announce最常用②arptables 丢弃 ARP 应答报文。常用核心参数参数功能-A追加规则-I头部插入规则-D删除规则-L查看规则arptables -Ln数字显示-F清空所有规则-P设置链默认策略-s匹配 ARP 源 IP-d匹配 ARP 目标 IP-j指定动作ACCEPT/DROP典型示例# 丢弃本机向外发送、目标为VIP的ARP响应 arptables -A OUTPUT -d 192.168.1.100 -j DROP ​ # 查看规则 arptables -Ln ​ # 清空规则 arptables -Fiptables /arptables/ebtables 层级区分工具工作层级处理对象ebtables二层以太网帧MAC 帧网桥环境arptables2.5 层ARP 报文iptables三层 / 四层IP 数据包、TCP/UDPVS调度器配置安装ipvsadm[rootserver1 ~]# yum install -y ipvsadm进行配置 server3上进行#查看目前规则 [rootserver1 ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size4096) Prot LocalAddress:Port Scheduler Flags - RemoteAddress:Port Forward Weight ActiveConn InActConn ​ 添加vip [rootserver1 ~]# ip addr add 192.168.234.100/24 dev eth0 ​ 添加虚拟服务 [rootserver1 ~]# ipvsadm -A -t 192.168.234.100:80 -s rr ​向虚拟服务添加真实服务器RS[rootserver1 ~]# ipvsadm -a -t 192.168.234.100:80 -r 192.168.234.136:80 -g -w 1 ​ [rootserver1 ~]# ipvsadm -a -t 192.168.234.100:80 -r 192.168.234.137:80 -g -w 1保存配置ipvsadm-save /etc/sysconfig/ipvsadmRS调度器配置server4安装测试服务[rootserver2 ~]# yum install -y httpd ​ [rootserver2 ~]# systemctl start httpd ​ [rootserver2 ~]# echo server4 /var/www/html/index.html ​ [rootserver2 ~]# systemctl enable httpd ​RS也需要添加vip[rootserver2 ~]# ip a a 192.168.234.100/24 dev eth0server5同样server6测试机上测试for i in {1..10}; do curl 192.168.234.100; done问题1.测试机测试时只显示其中一RS其中一台虚拟机另一台并未调用解决在 RS 上使用 arptables 丢弃向外发出的 VIP ARP 应答报文、禁用arp[rootserver3 ~]# yum install arptables ​ [rootserver3 ~]# arptables -A INPUT -d 192.168.36.100 -j DROP [rootserver3 ~]# arptables -A OUTPUT -s 192.168.36.100 -j mangle --mangle-ip-s 192.168.36.134 ​ [rootserver3 ~]# arptables-save /etc/sysconfig/arptables [rootserver3 ~]# systemctl enable arptables ​2.修改网卡时网卡无法重启查看报错信息可知其无法找到ens33网卡此时查看ip地址发现无ens33网卡网卡名称为eth0输入vim /sysconfig/network-scripts/ifcfg-ens33 #进入文件内修改设备名称为“eth0,并检查有无其他错误修改后保存退出此时重新启动网卡发现重启成功但网卡文件名仍为”ifcfg-ens33“输入mv /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-eth0 #修改文件名称方便辨认LVS NAT模式LVS/NAT 的优点是服务器可以运行任何支持 TCP/IP 的操作系统它只需要一个 IP 地址配置在调度器上服务器组可以用私有的 IP 地址。缺点是它的伸缩能力有限 当服务器结点数目升到 20 时调度器本身有可能成为系统的新瓶颈因为在 VS/NAT 中请求和响应报文都需要通过负载调度器。示例参数Load Balance双网卡 eth0: 192.168.64.128 (对外) eth1: 192.168.234.135(对内) ​ Virtual IP: 192.168.64.128 ​ Gateway: 192.168.234.135 ​ Realserver1: 192.168.234.136 ​ Realserver2: 192.168.234.137其中双网卡需要为虚拟机另加一个网卡并进行配置,VS的第二块网卡和server6网卡做以下更改其中对内网卡eth0对外网卡eth1:开启路由机制vi /etc/sysctl.conf ​ net.ipv4.ip_forward 1执行命令生效sysctl --system加载 nat 模块modprobe iptable_nat注如果不加载此模块也可以在第一次访问时成功但是会在再次访问时出现延迟过长或访问超时现象加载 lvs规则ipvsadm -A -t 192.168.64.128:80 -s rr ​ ipvsadm -a -t 192.168.64.128:80 -r 192.168.234.136:80 -m ​ ipvsadm -a -t 192.168.64.128:80 -r 192.168.234.137:80 -mRS上配置静态路由所有RS上都要配置查看路由信息[rootserver2 ~]# ip r ​ default via 192.168.234.2 dev eth0 proto static metric 100 ​ 192.168.234.0/24 dev eth0 proto kernel scope link src 192.168.234.136 metric 100删除原有露营配置必须指向调度器的IP[rootserver2 ~]# ip r d default via 192.168.234.2 ​ [rootserver2 ~]# ip r ​ 192.168.234.0/24 dev eth0 proto kernel scope link src 192.168.234.136 metric 100 ​ [rootserver2 ~]# ip r a default via 192.168.234.135所有RS以此类推测试keepalived高可用基础概念Keepalived 基于VRRP 协议虚拟路由冗余协议实现 Linux 服务器故障转移HA 高可用。常搭配 LVS 使用实现LVS 调度器 VS 主备架构防止单点故障。VRRP 核心思想多台服务器组成一个VRRP 组共享同一个虚拟 IPVIP。MASTER主节点正常工作持续发送 VRRP 通告报文持有 VIPBACKUP备节点监听主节点报文超过预设时间收不到主节点消息判定主故障备节点升级为 Master抢占 VIP接管业务。两大核心功能VRRP 高可用实现 VIP 漂移解决调度器单点故障健康检测Check检测后端 Real ServerRS服务状态RS 宕机 / 服务异常自动从 ipvsadm 集群中剔除恢复后自动加入重点Keepalived不负责负载均衡转发负载均衡由内核 IPVS 实现Keepalived 只做高可用 健康检查。核心组件与配置Keepalived 由 核心组件 和 配置文件 两部分组成配置决定其行为逻辑。核心组件● vrrp_instanceVRRP 实例是 Keepalived 配置的核心单元一个实例对应一个 VIP 及一组主备节点。● Global_defs全局配置定义集群标识如 router_id、邮件通知故障时发告警邮件等基础参数。● Track_script健康检查脚本用于检测主节点上 “核心业务服务”如 Nginx、LVS是否存活。若服务挂了即使主节点本身存活也会主动释放 VIP触发切换避免 “主节点存活但服务不可用” 的问题。核心配置文件路径/etc/keepalived/keepalived.confmaster和BACKUP配置server1清除资源[rootserver1 ~]# ip a d 192.168.36.100/24 dev eth0 ​ [rootserver1 ~]# ipvsadm -C安装高可用软件[rootserver1 ~]# yum install -y keepalived ​ [rootserver1 ~]# vim /etc/keepalived/keepalived.confserver6同理MASTER改为BACKUP同时权重调低少于MASTER权重systemctl start keepalived.service tail -f /var/log/messages可看到server6作为备用机停止server1后server6自动接管用本机访问pacemaker高可用基础概念PacemakerLinux 集群资源管理器CRM属于开源高可用集群软件。常搭配Corosync消息层组件使用整套架构统称PCS 集群CorosyncPacemaker。和 Keepalived 核心区分Keepalived基于 VRRP适合VIP 漂移、LVS 主备结构简单一般最多 2 台节点只管控 VIP。PacemakerCorosync完整集群资源管理支持 3 节点、多资源、多种模式主备、双主、多实例可以管理 VIP、Apache、NFS、数据库、LVS 等任意服务资源。组件分工Corosync集群底层通信层。负责集群节点之间心跳通信、节点状态同步、传递成员信息检测节点宕机。通信端口5404、5405、5406。Pacemaker上层资源调度管理器。根据 Corosync 上报节点状态实现资源启动、停止、迁移、故障转移、资源约束。PCS 工具pcsd命令行管理工具CentOS7/8 默认管理入口旧版本工具crmsh。集群资源Resource集群中需要被托管的对象都叫资源虚拟 IPVIP、Apache、Nginx、挂载存储、LVS、数据库等。资源类型ocf 资源开放集群框架功能最强常用lsb 资源系统 /etc/init.d 传统脚本systemd 资源托管 systemd 服务primitive原始资源最小单元资源创建集群步骤免密配置[rootserver3 ~]# ssh-keygen [rootserver3 ~]# ssh-copy-id server6时间同步server3与server6都需要进行[rootserver3 ~]# vim /etc/chrony.conf[rootserver3 ~]# timedatectl [rootserver3 ~]# systemctl restart chronyd [rootserver3 ~]# systemctl enable --now chronyd安装集群软件[rootserver3 ~]# yum install -y pacemaker pcs psmisc policycoreutils-python [rootserver3 ~]# ssh server6 yum install -y pacemaker pcs psmisc policycoreutils-python #给server6也安装配置防火墙——这两台虚拟机已经禁用不用多余操作[rootserver3 ~]# setenforce 0 [rootserver3 ~]# sed -i.bak s/SELINUXenforcing/SELINUXpermissive/g /etc/selinux/ config [rootserver3 ~]# systemctl mask firewalld.service [rootserver3 ~]# systemctl stop firewalld.service [rootserver3 ~]# iptables --flush启动pcsd服务[rootserver3 ~]# systemctl start pcsd.service [rootserver3 ~]# systemctl enable pcsd.service [rootserver3 ~]# ssh server6 systemctl start pcsd.service [rootserver3 ~]# ssh server6 systemctl enable pcsd.service配置身份认证——server3和server6相同[rootserver3 ~]# passwd hacluster集群节点身份认证——两台节点任意一个完成即可[rootpcmk-1 ~]# pcs cluster auth server3 server6输入用户名”hacluster”和密码认证后的节点加入集群[rootserver3 ~]# pcs cluster --force setup --name mycluster server3 server6集群创建完成处理pcs中警告pcs statuspcs start vip pcs resource create vip ocf:heartbeat:IPaddr2 ip192.168.234.100 cidr_netmask32 op monitor interval30shaproxy概念haproxy 是一款开源高性能 TCP/HTTP 四层、七层负载均衡软件单进程事件驱动模型。四层负载均衡TCP 模式只转发数据包解析 IP 端口不解析应用层适合 MySQL、Redis 等。七层负载均衡HTTP 模式解析 HTTP 请求可以基于 URL、Host、Cookie 实现更灵活的调度。LVS内核四层负载均衡性能最强只能四层HAProxy用户态同时支持四层 七层Nginx七层为主四层能力较弱。核心配置文件路径/etc/haproxy/haproxy.conf配置分为global 全局段进程、日志、最大连接、系统参数defaults 默认段frontend/backend 继承通用参数超时、日志模式frontend 前端对外监听端口接收客户端请求backend 后端定义真实服务器集群、调度算法listen整合 frontendbackend简写模式配置[rootserver3 ~]#yum install -y haproxy.x86_64 [rootserver3 ~]# pcs resource create haproxy systemd:haproxy op monitor interval1min [rootserver3 ~]# pcs status此时发现服务和vip不在同一节点[rootserver3 ~]# pcs resource group add hagroup vip haproxyLAMP架构nginx平滑升级nginx的gcc文件做如下更改此时server3所用nginx版本为1.30.0下载新版本后进行解压缩并且更改文件配置和原版本一样配置环境后新版本只用make编译不进行安装[rootserver3 nginx-1.30.4]# cd /usr/local/nginx/sbin[rootserver3 sbin]# cp nginx nginx.bak [rootserver3 sbin]# cd [rootserver3 ~]# cd nginx-1.30.4 [rootserver3 nginx-1.30.4]# cd objs cp -f nginx/usr/local/nginx/sbin/nginx ​ps ax|grep nginxkill -USR2 8480此时发现nginx已经换为1.30.4但是新旧进程同时存在关闭原先的worker进程kill -WINCH 8480此时访问皆为新版本等待新版本稳定后退出旧版本master进程版本回退还原nginx程序# cp -f nginx.old nginx ​ 唤醒原进程# kill -HUP 8480 ​ 回收新版本的worker进程 kill -WINCH 8517 ​ 关闭新版本主进程 kill -QUIT 8517nginx并发优化通过更改worker_processes数量[rootserver3 ~]# cd nginx-1.30.3/ [rootserver3 nginx-1.30.3]# cd /usr/local/ [rootserver3 local]# cd nginx [rootserver3 nginx]# cd conf/ [rootserver3 conf]# vim nginx.conf根据CPU数量更改work_processes数量[rootserver3 ~]# nginx -s reload [rootserver3 ~]# ps ax|grep nginx.conf 1333 pts/0 S 0:00 grep --colorauto nginx.conf [rootserver3 ~]# ps ax|grep nginx 1313 ? Ss 0:00 nginx: master process nginx 1320 ? S 0:00 nginx: worker process 1321 ? S 0:00 nginx: worker process 1335 pts/0 S 0:00 grep --colorauto nginx修改CPU内核[rootserver3 conf]# vim nginx.conf [rootserver3 conf]# nginx -s reload [rootserver3 conf]# ps ax|grep nginx修改用户进程可打开文件数限制 /etc/security/limits.conf nginx - nofile 65535nginx作为http服务器时 max_clients worker_processes * worker_connections nginx作为反向代理服务器时 max_clients worker_processes * worker_connections / 2nginx限流控制单IP并发连接数http { limit_conn_zone $binary_remote_addr zoneaddr:10m; //$binary_remote_addr 表示通过remote_addr这个标识来做限制 //zoneaddr:10m 表示生成一个大小为10M名字为addr的内存区域 ... server { location /download/ { limit_conn addr 1; #限制并发数 limit_rate 50k; #限制带宽 } }限制单位时间内的请求数目,以及速度限制http { limit_req_zone $binary_remote_addr zoneone:10m rate1r/s; //rate1r/s表示允许相同标识的客户端的访问频次这里限制的是每秒1次 ... server { location / { limit_req zoneone; # limit_req zoneone burst5 # limit_req zoneone burst5 nodelay; } }nginx配置管理自动索引下载方便location / { autoindex on; }Nginx expire缓存配置: 缓存可以降低网站带宽加速用户访问location ~ .*\.(gif|jpg|png)$ { expires 365d; root /www; }日志轮询#cat nginxlog.sh #!/bin/bash cd /usr/local/nginx/logs mv access.log access_$(date %F -d -1day).log kill -USR1 cat /usr/local/nginx/logs/nginx.pid禁用不必要的日志记录以节省磁盘IO的消耗location ~ .*\.(js|jpg|jpeg|png|css|bmp|gif)$ { access_log off; }站点目录和文件的限制location ~ ^/images/.*\.(sh|php)$ { deny all; }中文乱码charset utf-8;限制IPlocation / { deny 172.25.0.10; allow 172.25.0.0/24; deny all; } if ($remote_addr 172.25.0.254) { return 403; }nginx重定向防止域名恶意解析到服务器IP:server { listen 80; server_name _; return 500; }也可以重定向server { listen 80; server_name _; rewrite ^(.*) http://www.westos.org permanent; }80重定向443:server { listen 80; server_name www.westos.org; rewrite ^/(.*)$ https://www.westos.org/$1 permanent; }www.westos.org/bbs 重定向bbs.westos.org:rewrite ^/bbs$ http://bbs.westos.org permanent; rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; bbs.westos.org 重定向www.westos.org/bbs: if ($host bbs.westos.org){ rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent; }nginx 防盗链location ~ \.(jpg|png)$ { valid_referers none blocked www.westos.org; if ($invalid_referer) { return 403; #rewrite ^/ http://www2.westos.org/daolian.jpg; } }