目录
实验环境
四台主机
vm1(调度器)
vm2(RS)
vm3(RS)
vm4(高可用/访问机)
配置好网络
关闭防护墙
关闭selinux
一、LVS介绍
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器,该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器。
将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的。
LVS工作模式分为NAT模式、TUN模式、以及DR模式
二、LVS的三种工作模式
1、NAT模式
通过网络地址转换的方式来实现调度
(1)首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。
(2)接着调度把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),真实服务器(RS)就可以接收到客户的请求数据包了。
(3)真实服务器响应完请求后,查看默认路由(NAT模式下需要将RS的默认路由设置为LB服务器),把响应后的数据包再发送给LB。
(4)LB接收到响应包后,把包的源地址改为虚拟地址(VIP),然后再发送回客户端。
整体流程:Client > VS > RS > VS > Client
当数据流进入VS时,做了一次DNAT,从VS出去时做了一次DNAT
2、TUN模式
隧道模式
(1)将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。
(2)VS/TUN工作模式拓扑结构如图所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口)。
LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据
3、DR模式
(1)直接路由模式(DR模式)要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的。
(2)由于多台计算机都设置了同样一个VIP地址,所以在直接路由模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC及对应的IP地址,真实服务器的VIP对外界是不可见的,但真实服务器却可以接受目标地址VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址。
(3)调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的VIP不需要对外界可见。
整体流程:Client----DR—RS–Client
三、ipvsadm实现Apache负载均衡横
- 利用DR工作模式和轮询调度算法实现
1、调度器(vm1):
vip:192.168.189.100
,rr
:轮询调度算法
dnf install -y ipvsadm ##安装lvs管理器
ip a a 192.168.189.100/24 dev ens160 ##添加vip
ipvsadm -A -t 192.168.189.100:80 -s rr ##添加虚拟服务
ipvsadm -a -t 192.168.189.100:80 -r 192.168.189.112:80 -g ##将虚拟服务关联到真实服务上
ipvsadm -a -t 192.168.189.100:80 -r 192.168.189.113:80 -g
ipvsadm -ln ##查看配置信息
2、真实服务端:RS端(vm2,vm3)
安装测试服务 RS添加vip
dnf install -y httpd
systemctl enable --now httpd
echo vm2 >/var/www/html/index.html
echo vm3 >/var/www/html/index.html
ip a a 192.168.189.100/24 dev ens160
禁用ARP
dnf install arptables -y
arptables -A INPUT -d 192.168.189.100 -j DROP
arptables -A OUTPUT -s 192.168.189.100 -j mangle --mangle-ip-s 192.168.189.113
arptables -nL
arptables-save > /etc/sysconfig/arptables ##保存策略
systemctl enable arptables
3、访问(vm4)
curl 192.168.189.100
for i in {1..10}; do curl 192.168.189.100; done
4、查看调度器情况
四、keepalive实现DR模式故障检测
- DR模式的缺点是无法发现客户端故障
- 针对RS服务器出现故障或者调度器单点故障,keepalive的健康检查和失败切换(LVS冗余)可以解决。
- keepalive中的vrrp协议实现高可用解决单点故障,TCP_CHECK实现对后端RS的健康检测
master配置
ip a d 192.168.189.100/24 dev ens160
ipvsadm -C
安装
yum install keepalived.x86_64 -y
cd /etc/keepalived/
vim 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 LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict ##禁用此选项
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { ##高可用部分
state MASTER
interface ens160 ##网卡
virtual_router_id 51
priority 100 ###当前主机在此虚拟路径器中的优先级;范围1-254;设置backup优先级需比master优先级低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.189.100 ##设定vip
}
}
virtual_server 192.168.189.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50 ##50秒内同一个客户端请求将会交给同一个后端处理,为观察实验效果,将其注释
protocol TCP
real_server 192.168.189.112 80 { ##RS1
weight 1
TCP_CHECK {
connect_timeout 3
delay_before_retry 3
}
}
real_server 192.168.189.113 80 { ##RS2
weight 1
TCP_CHECK {
connect_timeout 3
delay_before_retry 3
}
}
}
启动keepalive服务会自动添加VIP和编写ipvsadm规则
测试keepalived对后端RS的健康检测
systemctl stop httpd
故障的RS会自动从调度列表中被摘除
ipvsadm -ln
再次启动服务
systemctl start httpd
恢复的RS会自动添加到调度列表
五、keepalive实现LVS高可用
由于vm1为LVS策略服务提供者,当vm1出现故障时,将导致访问及负载均衡都无法进行,因此采用高可用方式,双机热备确保LVS稳定性。
高可用描述:
配置一台BACKUP 端vm4,具备与vm1相同LVS策略配置,当vmr1出现故障时,将VIP转移至vm4,并切换vm4为MASTER,继续提供服务。
当vm1恢复正常,再将VIP及MASTER转移至vm1(须设定vm1优先级大于vm4)
1、vm4端安装keepalived,ipvsadm,将vm1的配置文件复制过来,配置keepalived,启动keepalived服务
yum install keepalived -y
yum install ipvsadm -y
cd /etc/keepalived/
scp /etc/keepalived/keepalived.conf vm4:/etc/keepalived/ ##从vm1中复制
vim keepalived.conf
systemctl start keepalived.service
2、查看server4的日志,发现为BACKUP端
3、停止vm1的keepalived服务,查看资源是否自动迁移到vm4
4、 启动vm1的keepalived服务 查看资源会回到vm1上
vm4的VIP就会消失
六、负载均衡分层的介绍
1、四层负载均衡
所谓四层就是基于IP+端口的负载均衡
四层负载均衡,是指OSI七层模型中的传输层,传输层已经支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载。
2、七层负载均衡
七层是基于URL等应用层信息的负载均衡
七层负载均衡是在应用层,它可以完成很多应用方面的协议请求
3、四层与七层区别
四层负载均衡数据在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发,七层负载均衡效率没有四层负载均衡高。
四层负载均衡可以用来解决七层负载均衡端口限制问题(七层负载均衡最大使用65535个端口号)
但是四层不支持协议的转发(http,https,DNS等)只支持IP,不识别域名。
-
七层负载均衡更贴近于服务,如HTTP协议就是七层协议
支持很多功能,比如支持http信息的改写、头部信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等一些规则,在应用层的服务里面可以做的内容更多。
七、 NGINX 7层负载均衡
1、nginx部署
下载nginx安装包
nginx网站域名:http://nginx.org/
安装依赖性
dnf install -y gcc pcre-devel openssl-devel
安装nginx
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
关闭debug(可选)
vim auto/cc/gcc
去掉服务版本号(可选)
vim src/core/nginx.h
安装 相关
./configure --help #可以看到可用参数
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
【注:此命令是安装一些模块,此命令必须在nginx源码目录下执行】
很多的模块
make(将源码编译成本系统可以用的可执行程序)
dnf install -y make
make
make install
创建软连接,方便调用
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
启动服务 重载nginx服务 关闭nginx服务
nginx
nginx -s reload
nginx -s stop
配置启动脚本(使用systemctl 命令)
vim /lib/systemd/system/nginx.service
systemctl daemon-reload #使新的脚本可以运行
systemctl enable --now nginx
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.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
2、负载均衡
配置nginx文件
vim /usr/local/nginx/conf/nginx.conf
http {
upstream backend {
server 192.168.189.112 weight=2; ##权重weight=2 默认为1
server 192.168.189.113;
server 127.0.0.1 backup; //只有当所有的后端server全部失效才会被启用
}
...
#定义虚拟主机,当访问此域名时反向代理负载均衡
server {
listen 80;
server_name www.yyl.org;
location / {
proxy_pass http://backend;
}
}
}
systemctl reload nginx
测试:
vim /etc/hosts #测试机添加解析
关闭后端vm2,nginx自带健康检测
3、修改nginx服务配置
修改启动用户
useradd -M -d /usr/local/nginx/ -s /sbin/nologin nginx
vim /usr/local/nginx/conf/nginx.conf
systemctl reload nginx.service
ps aux | grep nginx
nginx进程与cpu核心绑定
vim /usr/local/nginx/conf/nginx.conf
systemctl reload nginx.service
ps aux | grep nginx
## worker_processes auto; 是自动的
修改nginx并发连接数
vim /usr/local/nginx/conf/nginx.conf
vim /etc/security/limits.conf
usermod -d /usr/local/nginx/ -s /bin/bash nginx #改成可以登录否则无法查看
su - nginx
ulimit -a
logout
usermod -d /usr/local/nginx/ -s /sbin/nologin nginx #改回不能登录比较安全
nginx模块编译
默认为rr模式 ip hash 根据客户端ip进行负载均衡
ip_hash调度算法比较符合客户使用习惯,算法为了保证连接稳定根据客户端ip进行负载均衡,相同客户端IP访问时,会访问到同一服务端,一个sever对一个IP。
ip_hash算法缺陷在于:客户端发送请求到nginx服务器,再由nginx服务器到后端RS,后端RS再返回到nginx服务器再返回客户端,所以后端RS不知道是谁访问了自己。
改进:可以用Sticky cookie来实现,类似于浏览器的cookie。客户端发送请求时,后端RS返回信息时会将session信息传回客户端,客户端存到浏览器中,这是RS分配给每一个客户端的,以后每次请求RS就通过这个cookie来判断是哪个客户端。
sticky
先停止nginx服务
systemctl stop nginx.service
下载扩展包并解压
unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
重新编译
cd nginx-1.22.0/
make clean ##清除原来编译的内容
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
make ##注意不要进行make install安装,因为软件已经安装过,现在直是去更新,执行make install 会进行覆盖安装
\cp -f objs/nginx /usr/local/nginx/sbin/nginx 覆盖原二进制程序
测试:
vim /usr/local/nginx/conf/nginx.conf
sticky 不可以使用backup
nginx -t 检测语法
启动nginx服务
测试:
不同的客户端:
4、LNMP架构
Nginx平滑版本升级
cd nginx-1.24.0/
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
make
备份原程序
cd /usr/local/nginx/sbin/
cp nginx nginx.old
拷贝新程序
\cp -f /root/nginx-1.24.0/objs/nginx nginx
修改配置文件 (1.24版本不支持sticky )
获取nginx进程Pid
ps ax|grep nginx
唤醒新程序进程
kill -USR2 42188
ps ax|grep nginx
此时有多个nginx版本在处理请求
回收旧版本进程
kill -WINCH 42188
ps ax|grep nginx
此时只有新版本在响应业务请求
Nginx平滑版本回退
拷贝旧版本程序
cd /usr/local/nginx/sbin/
\cp -f nginx.old nginx
唤醒原版本程序
kill -HUP 42188
ps ax|grep nginx
回收新版本work进程
kill -WINCH 45025
ps ax|grep nginx
curl -I localhost
回收新版本master进程
kill -QUIT 45025
ps ax|grep nginx
八、 Pacemaker高可用
(Pacemaker+Nginx)
1、Pacemaker
Pacemaker是一个集群资源管理器。它利用集群基础构件(OpenAIS 、heartbeatcorosync)提供的消息和成员管理能力来探测并从节点或资源级别的故障中恢复,以实现群集服务(亦称资源)的最大可用性。
Pacemaker是一个通过管理多台机器的资源来实现系统的高可用性框架。
2、实验环境
vm1 vm4
需要将vm4上的nginx配置与vm1完全相同
vm1:
scp -r /usr/local/nginx/ vm4:/usr/local/
scp /lib/systemd/system/nginx.service vm4:/lib/systemd/system/nginx.service
vm4
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
useradd -M -d /usr/local/nginx/ -s /sbin/nologin nginx
vim /etc/security/limits.conf
systemctl daemon-reload
systemctl enable --now nginx
ps aux | grep nginx
curl -I localhost
关闭vm1,vm4上的Nginx
systemctl disable --now nginx.service
3、主机配置免密
ssh-keygen
ssh-copy-id vm4
4、配置yum源
rhel8需要在外网下载
vm1,vm4都需要配置
vim /etc/yum.repos.d/yyl.repo
[HighAvailability]
name=HighAvailability
baseurl=https://mirrors.aliyun.com/centos/8-stream/HighAvailability/x86_64/os/
gpgcheck=0
5、安装软件
dnf install -y pacemaker-2.1.2-4.el8 pcs psmisc
ssh vm4 dnf install -y pacemaker-2.1.2-4.el8 pcs psmisc
6、启动pcsd服务
systemctl enable --now pcsd.service
ssh vm4 systemctl enable --now pcsd.service
echo yyl | passwd --stdin hacluster
ssh vm4 'echo yyl | passwd --stdin hacluster'
7、配置corosync
pcs host auth vm1 vm4
pcs cluster setup mycluster vm1 vm4
8、 启动与校验集群
pcs cluster start --all
pcs cluster enable --all
crm_verify -L -V
pcs property set stonith-enabled=false
pcs status
9、 创建集群资源
pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.189.100 op monitor interval=30s
pcs status
vim /etc/hosts
手动移除vm1上的vip后,集群会自动检测并修复
ip a d 192.168.189.100/24 dev ens160
节点失效备援
vm1失效后资源自动迁移至vm4
pcs node standby
pcs status
pcs node unstandby
pcs status
10、添加nginx服务资源
在添加资源之前,确保vm1和vm4主机上的nginx服务正确配置
pcs resource create nginx systemd:nginx op monitor interval=60s
pcs status
此时发现资源并不在同一台主机上创建资源组,强制资源运行在同一节点
pcs resource group add hagroup vip nginx
pcs status
vm4节点失效,资源整体迁移到vm1
ssh vm4 pcs node standby
pcs status
ssh vm4 pcs node unstandby
测试: