LVS负载均衡
|
主机名 |
ip |
vip |
角色 |
|
server1 |
192.168.247.129 |
192.168.247.100 |
调度器(VS) |
|
server2 |
192.168.247.130 |
192.168.247.100 |
真实服务器(RS) |
|
server3 |
192.168.247.132 |
192.168.247.100 |
真实服务器(RS) |
|
server4 |
192.168.247.133 |
测试机 |
VS调度器配置
ipvsadm 是 Linux 下用于管理 IPVS(IP Virtual Server,IP 虚拟服务器) 的命令行工具,主要用于构建 LVS(Linux Virtual Server)负载均衡集群。它允许管理员配置和管理虚拟服务、真实服务器(后端节点)以及负载均衡策略。
安装ipvsadm
[root@server1 ~]# yum install -y ipvsadm
基础语法
# 查看所有虚拟服务和后端真实服务器(详细信息)
ipvsadm -Ln
# 查看更详细的统计信息(连接数、包数等)
ipvsadm -Ln --stats
# 查看每个真实服务器的当前连接状态
ipvsadm -Ln --rate
添加vip
[root@server1 ~]# ip addr add 192.168.247.100/24 dev ens33
添加虚拟服务
[root@server1 ~]# ipvsadm -A -t 192.168.247.100:80 -s rr
参数解释:
-A:添加虚拟服务
-t:指定 TCP 协议的虚拟服务(格式:VIP:端口)
其他协议:-u(UDP)、-f(防火墙标记,用于复合协议)
-s:指定负载均衡调度算法,常用算法:
rr:轮询(Round Robin)
wrr:加权轮询(Weighted RR)
lc:最少连接(Least Connections)
wlc:加权最少连接(Weighted LC)
sh:源地址哈希(Source Hash,会话保持)
dh:目标地址哈希(Destination Hash)
向虚拟服务添加真实服务器RS
[root@server1 ~]# ipvsadm -a -t 192.168.247.100:80 -r 192.168.247.130:80 -g
[root@server1 ~]# ipvsadm -a -t 192.168.247.100:80 -r 192.168.247.132:80 -g
参数解释:
-a:添加真实服务器
-t:指定关联的虚拟服务(需与添加虚拟服务时的 -t 一致)
-r:指定真实服务器地址(格式:RIP:端口)
转发模式(必选其一):
-g:DR 模式(Direct Routing,直接路由,性能最优)
-m:NAT 模式(Network Address Translation,网络地址转换)
-i:TUN 模式(IP Tunneling,IP 隧道,跨网段场景)
-w:指定权重(值越大,分配的请求越多,仅用于加权算法)
[root@server1 ~]# ipvsadm -ln

RS真实服务器配置
server2:
安装测试服务
[root@server2 ~]# yum install -y httpd
[root@server2 ~]# systemctl start httpd
[root@server2 ~]# echo server2 > /var/www/html/index.html
[root@server2 ~]# systemctl enable httpd
rs也需要添加vip
[root@server2 ~]# ip a a 192.168.247.100/24 dev ens33
server3同理配置
LVS-DR ARP 问题背景
后端 RealServer 上也配置了 VIP 192.168.247.100/24 在 ens33 网卡。 默认情况下: 如果局域网内其他机器发起 ARP 询问:谁是 192.168.247.100/24? 所有配置了 VIP 的机器(调度器 + 所有 RS)都会对外回应 ARP。 → 网关 / 客户端 ARP 表乱掉,流量直接绕开 LVS 调度器,负载均衡失效。
安装arptables
[root@server2 ~]# yum install arptables
查看规则
# 查看所有链的规则(详细信息)
arptables -L -n
# 查看 INPUT 链的规则,并显示序号(方便删除)
arptables -L INPUT --line-numbers
添加规则
[root@server2 ~]# arptables -A INPUT -d 192.168.247.100 -j DROP
-A INPUT:向INPUT链添加一条规则
-d 192.168.247.100:匹配目的IP为192.168.247.100的arp包
-j DROP:对匹配的报文执行丢弃操作
[root@server2 ~]# arptables -A OUTPUT -s 192.168.247.100 -j mangle --mangle-ip-s 192.168.247.130
- -A OUTPUT:向 OUTPUT 链(本机发出的 ARP 报文)添加一条规则。
- -s 192.168.247.100:匹配源 IP 为 192.168.247.100 的 ARP 报文(即本机以该 IP 发送的 ARP 包)。
- -j mangle:对匹配的报文执行 “修改” 操作
- --mangle-ip-s 192.168.247.130:试图将 ARP 报文中的源 IP 地址修改为 192.168.247.130。

server3同理配置

测试
[root@server4 ~]# for i in {1..10}; do curl 192.168.247.100; done


keepalived高可用
master配置
安装高可用软件:yum install -y keepalived
修改配置文件:vim /etc/keepalived/keepalived.conf


[root@server1 ~]# systemctl enable --now keepalived
查看资源是否就绪


测试keepalived对后端RS的健康检测
[root@server2 ~]# systemctl stop httpd
故障的RS会自动从调度列表中被摘除
再次启动服务
[root@server2 ~]# systemctl start httpd
恢复的RS会自动添加到调度列表

backup配置
server4:
安装高可用软件
[root@server4 ~]# yum install -y keepalived
从server1拷贝配置文件
[root@server1 ~]# scp /etc/keepalived/keepalived.conf server4:/etc/keepalived/
[root@server4 ~]# vim /etc/keepalived/keepalived.conf

测试
停止server1上服务
[root@server1 ~]# systemctl stop keepalived.service

LVS NAT模式
Load Balance双网卡 ens33: 192.168.247.129 (对内) ens36: 192.168.159.128 (对外)
Virtual IP: 192.168.159.128
Gateway: 192.168.247.129
Realserver1: 192.168.247.130
Realserver2: 192.168.247.132


开启路由机制
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

执行命令生效
sysctl --system
加载 nat 模块
modprobe iptable_nat
注:如果不加载此模块,也可以在第一次访问时成功,但是会在再次访问时出现延迟过长,或访问超时现象
加载 lvs规则
ipvsadm -A -t 192.168.159.128:80 -s rr
ipvsadm -a -t 192.168.159.128:80 -r 192.168.247.130:80 -m
ipvsadm -a -t 192.168.159.128:80 -r 192.168.247.132:80 -m
RS上配置静态路由
所有RS上都要配置
查看路由信息
[root@server2 ~]# ip r

删除原有露营配置,必须指向调度器的IP
[root@server2 ~]# ip r d default via 192.168.247.2
[root@server2 ~]# ip r a default via 192.168.247.129

所有RS以此类推
Server4:


测试

Haproxy
安装
[root@server1 ~]# yum install -y haproxy
修改配置文件
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg

启动:
[root@server1 ~]# systemctl start haproxy


Pacemaker高可用
节点配置主机名解析
server1和server4两台主机都要配置:vim /etc/hosts

主机配置免密
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server4
配置ntp时间同步
yum install -y chrony.x86_64
vim /etc/chrony.conf

启动服务:systemctl enable --now chronyd
验证:chronyc sources -v
安装集群软件
[root@server1 ~]# yum install -y pacemaker pcs psmisc policycoreutils-python
[root@server1 ~]# ssh server4 yum install -y pacemaker pcs psmisc policycoreutils-python
启动pcsd服务
[root@server1 ~]# systemctl enable --now pcsd.service
[root@server1 ~]# ssh server4 systemctl enable --now pcsd.service
[root@server1 ~]# echo redhat | passwd --stdin hacluster
[root@server1 ~]# ssh server4 'echo redhat | passwd --stdin hacluster'
配置corosync
[root@server1 ~]# pcs cluster auth server1 server4
[root@server1 ~]# pcs cluster setup --name mycluster server1 server4
启动集群
[root@server1 ~]# pcs cluster start --all
[root@server1 ~]# pcs cluster enable --all
校验集群
[root@server1 ~]# crm_verify -L -V

[root@server1 ~]# pcs property set stonith-enabled=false
[root@server1 ~]# pcs status

创建集群资源
[root@server1 ~]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.247.100 op monitor interval=30s
手动移除server1上的vip后,集群会自动检测并修复

节点失效备援
[root@server1 ~]# pcs node standby

server1失效后资源自动迁移至server4
恢复server1
[root@server1 ~]# pcs node unstandby

添加apache服务资源
在添加资源之前,确保server1和server4主机上已经安装了httpd软件
[root@server1 ~]# pcs resource create WebSite systemd:httpd op monitor interval=1min

此时发现资源并不在同一台主机上
创建资源组,强制资源运行在同一节点
[root@server1 ~]# pcs resource group add webgroup vip WebSite

server1节点失效,资源整体迁移到server4
[root@server1 ~]# pcs node standby

恢复节点
[root@server1 ~]# pcs node unstandby

删除集群资源
[root@server1 ~]# pcs resource group remove webgroup
[root@server1 ~]# pcs resource delete vip
[root@server1 ~]# pcs resource delete WebSite
配置iscsi存储
配置iscsi输出端
在server2上添加虚拟机磁盘 /dev/sdb

安装软件
[root@server2 ~]# yum install -y targetcli
[root@server2 ~]# systemctl enable --now target
[root@server2 ~]# targetcli

配置iscsi客户端
在server1和server4上配置iscsi客户端
server1配置如下:
[root@server1 ~]# yum install -y iscsi-initiator-utils.x86_64
[root@server1 ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2026-07.com.example:client

[root@server1 ~]# iscsiadm -m discovery -t st -p 192.168.247.130(此为server2ip地址)
[root@server1 ~]# iscsiadm -m node -l

分区格式化
[root@server1 ~]# fdisk /dev/sdb

[root@server1 ~]# mkfs.xfs /dev/sdb1

安装数据库软件
[root@server1 ~]# yum install -y mariadb-server
挂载存储
[root@server1 ~]# mount /dev/sdb1 /var/lib/mysql/
修改属性
[root@server1 ~]# chown mysql.mysql /var/lib/mysql/
启动数据库
[root@server1 ~]# systemctl start mariadb.service
卸载存储
[root@server1 ~]# systemctl stop mariadb.service
[root@server1 ~]# umount /var/lib/mysql
server4只需导入存储,无需格式化,配置如下:
[root@server4 ~]# yum install -y iscsi-initiator-utils.x86_64
[root@server4 ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2026-07.com.example:client

[root@server4 ~]# iscsiadm -m discovery -t st -p 192.168.247.130
[root@server4 ~]# iscsiadm -m node -l

安装数据库软件
[root@server4 ~]# yum install -y mariadb-server
整合iscsi存储和mariadb数据库
[root@server1 ~]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.247.100 op monitor interval=30s
[root@server1 ~]# pcs resource create iscsidb ocf:heartbeat:Filesystem device=/dev/sdb1 directory=/var/lib/mysql fstype=xfs op monitor interval=1min
[root@server1 ~]# pcs resource create mariadb systemd:mariadb op monitor interval=1min
[root@server1 ~]# pcs resource group add dbgroup vip iscsidb mariadb
dbgroup 是一组资源:VIP → 文件系统 → mariadb,三者必须在同一个节点运行。
立即执行修复步骤
步骤 1:清理当前故障计数
pcs resource cleanup dbgroup
步骤 2:重启资源组让集群重新调度
pcs resource disable dbgroup
pcs resource enable dbgroup
执行完再看状态:
pcs status
报错信息处理:
手动清理 server1 上残留的 VIP 地址:
ip addr del 192.168.247.100/24 dev ens33
ip addr del 192.168.247.100/32 dev ens33
清理 vip 资源所有历史故障记录
pcs resource cleanup vip
验证
pcs status

Nginx
安装
[root@server1 ~]# wget https://nginx.org/download/nginx-1.30.0.tar.gz
解压
[root@server1 ~]# tar zxf nginx-1.30.0.tar.gz
修改配置文件
[root@server1 ~]# cd nginx-1.30.0/
[root@server1 nginx-1.30.0]# vim auto/cc/gcc
关闭调试

安装对应依赖
[root@server1 nginx-1.30.0]# yum install -y gcc pcre-devel openssl-devel
编译安装
[root@server1 nginx-1.30.0]# ./configure --with-http_ssl_module --with-http_stub_status_module
[root@server1 nginx-1.30.0]# make && make install
创建软链接
[root@server1 nginx-1.30.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
配置nginx开机自启
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
vim /etc/systemd/system/nginx.service


平滑升级
重复上面安装,解压,修改配置文件,编译的操作,但不安装
备份
[root@server1 nginx-1.30.4]# cd /usr/local/nginx/sbin
[root@server1 sbin]# cp nginx nginx.bak

覆盖


如果使用kill 命令发现没有启动新版本,按以下方法解决



出现两个版本,需要关闭原先worker进程

版本回退


隐藏版本号
[root@server1 sbin]# cd /root/nginx-1.30.4/
[root@server1 nginx-1.30.4]# vim ./src/core/nginx.h
去掉红色框部分

[root@server1 nginx-1.30.4]# make clean
[root@server1 nginx-1.30.4]# ./configure --with-http_ssl_module --with-http_stub_status_module
[root@server1 nginx-1.30.4]# make
[root@server1 nginx-1.30.4]# cd objs/
[root@server1 objs]# cp -f nginx /usr/local/nginx/sbin/nginx

nginx高并发
[root@server1 objs]# cd /usr/local/nginx/conf
[root@server1 conf]# vim nginx.conf

[root@server1 conf]# nginx -s reload
[root@server1 conf]# useradd -M -d /usr/loacl/nginx/ nginx

[root@server1 conf]# vim /etc/security/limits.conf

[root@server1 conf]# cd /etc/sysctl.d/
[root@server1 sysctl.d]# vim nginx.conf

nginx负载均衡
[root@server1 sysctl.d]# vim /usr/local/nginx/conf/nginx.conf

[root@server1 sysctl.d]# vim /etc/hosts


427



被折叠的 条评论
为什么被折叠?



