目录
一、LVS负载均衡
环境:rhel7.6 (selinux and firewalld is disabled)
准备:
测试机 | LVS调度器 | realserver1 | realserver2 |
server4 | server1 | server2 | server3 |
1.什么是LVS
LVS(Linux Virtual Server),即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立。
2.负载均衡的含义
负载均衡(Load Balance),就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,从而提高网络的数据处理能力。
3.LVS的工作模式
LVS包括三种工作模式包括:1.NAT、2.TUN(隧道)、3.DR(路由直连)
路径模式:
NAT:client-->LVS-->RS(realservers)-->LVS-->client
TUN:client-->LVS-->RS-->client
DR:client-->LVS-->RS-->client (需要在同一个网段内)
4.实验搭建
(1)LVS调度器的搭建
yum install -y ipvsadm #安装软件
ip addr add IP/24 dev ens33 #添加VIP地址,需要确保IP地址没有被占用
编写LVS策略:
ipvsadm -A -t 192.168.56.200:80 -s rr # rr通过轮询的方式依次呼叫后方主机
ipvsadm -a -t 192.168.56.200:80 -r 192.168.56.164:80 -g # realserver1
ipvsadm -a -t 192.168.56.200:80 -r 192.168.56.165:80 -g # realserver2
ipvsadm -ln # 查看策略信息
(2)realserver服务搭建
yum install -y httpd
systemctl enable --now httpd
echo server2 > /var/www/html/index.html
#server3与server2保持一致
yum install -y arptables
arptables -A INPUT -d 192.168.56.200 -j DROP
arptables -A OUTPUT -s 192.168.56.200 -j mangle --mangle-ip-s 192.168.56.164
# 保存策略,这样开机后策略不会被清除掉
arptables-save > /etc/sysconfig/arptables
systemctl enable arptables.service
# server3也需要做相同的操作
工作原理:这里我们分别搭建了中间的调度器,以及后端的真实主机用来模仿日常客户端在访问过程中如何实现负载均衡,当用户发出请求时,调度器会对用户请求响应,并通过轮询的方式将信息传递给后面的真实主机,由后端真实主机直接向客户端展示请求的内容。
测试结果:
二、keepalivede高可用
1.两个问题
LVS虽然实现了负载均衡但是同样的也会出现两个问题,即(1)如果后端的realserver down了怎么办?(2)调度器本身down掉了怎么办?
首先来看第一个问题,当我们停掉后端server2的apache后,可以看到调度器这里仍然是正常工作的,同时客户端这边会在访问server2时会出现访问不到的情况,这对用户的体验其实是非常不好的。
第二个问题,调度器本身出现问题后,同样的客户端在访问的时候也会出现问题
2.什么是高可用集群
高可用集群,英文原文为High Availability Cluster,简单的说,集群就是一组计算机,它们作为一个整体向用户提供一组网络资源。这里引入一个概念“双机热备”:也就是两个节点的高可用集群,如果一台服务器出现故障时,可由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续对外提供服务。
3.问题解决
这里通过keepalived一方面可以提供健康检测,对后端的主机进行检测,另一方面,提供LVS冗余,通过心跳检测当主调度器停止后,由备用调度器进行补充。
4.配置
master | backup | realserver1 | realserver2 |
server1 | server4 | server2 | server3 |
yum install -y keepalived
vim /etc/keepalived/keepalived.conf
master配置:
global_defs {
notification_email {
root@localhost #邮箱
}
notification_email_from Alexandre.Cassen@firewall.loc
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 { #vrrp高可用
state MASTER #master状态
interface ens33 #通信接口,与主机实际接口名称相同
virtual_router_id 51 #VRID master和backup保持一致
priority 100 #优先级
advert_int 1 #心跳频率
authentication { #认证方式
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #lvs vip地址
192.168.10.200
}
}
virtual_server 192.168.10.200 80 { #LVS虚拟服务
delay_loop 6 #对rs的健康检测频率
lb_algo rr #调度算法
lb_kind DR #lvs工作模式
#persistence_timeout 50 #持久连接
protocol TCP
real_server 192.168.10.151 80 { #rs定义
weight 1 #权重
TCP_CHECK { #rs检测方式
connect_timeout 3
delay_before_retry 3
}
}
real_server 192.168.10.152 80 {
weight 1
TCP_CHECK {
connect_timeout 3
delay_before_retry 3
}
}
}
backup配置:
global_defs {
notification_email {
root@localhost #邮箱
}
notification_email_from Alexandre.Cassen@firewall.loc
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 { #vrrp高可用
state BACKUP #mbackup状态
interface ens33 #通信接口,与主机实际接口名称相同
virtual_router_id 51 #VRID master和backup保持一致
priority 50 #优先级
advert_int 1 #心跳频率
authentication { #认证方式
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #lvs vip地址
192.168.10.200
}
}
virtual_server 192.168.10.200 80 { #LVS虚拟服务
delay_loop 6 #对rs的健康检测频率
lb_algo rr #调度算法
lb_kind DR #lvs工作模式
#persistence_timeout 50 #持久连接
protocol TCP
real_server 192.168.10.151 80 { #rs定义
weight 1 #权重
TCP_CHECK { #rs检测方式
connect_timeout 3
delay_before_retry 3
}
}
real_server 192.168.10.152 80 {
weight 1
TCP_CHECK {
connect_timeout 3
delay_before_retry 3
}
}
}
配置完成后需要重启服务,否则没有办法生效。配置完成后检测第一个问题,首先关闭server2上apache服务,此时客户端再访问时,调度器只会向server3调度,这样就解决了用户再访问过程中可能出现访问不到的情况。
问题二,当主调度器down掉后,可以看到server4作为备用调度器自动接管,server1的调度器的工作,从而继续实现负载均衡工作。
而当server1恢复正常后,又会重新承担主调度器的工作,从而实现了双机热备。
三、nginx 7层负载均衡
1.nginx的部署
# 1.安装软件依赖性
yum install -y gcc pcre-devel openssl-devel
# 2.nginx官网可以直接下载开源版本的压缩包
tar zxf nginx-1.22.0.tar.gz
cd nginx-1.22.0/
vim auto/cc/gcc
# debug
#CFLAGS="$CFLAGS -g" #禁用debug,可以节省大量的空间
# 3.编译安装,可以根基需求自定义编译
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-threads --with-file-aio
make
make install
# 4.切换到安装完成后的目录
cd /usr/local/nginx
# 5.制作软链接
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
nginx -t #检测语法
nginx #启动服务
nginx -s reload #重载服务
nginx -s stop #停止服务
配置nginx启动文件
vim /lib/systemd/system/nginx.service
[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
systemctl daemon-reload #重载脚本
systemctl enable --now nginx
此时表示nginx已经部署完成。
2.平滑升级
# 1.从官网上可以下载到较新的版本
tar zxf nginx-1.22.1.tar.gz
cd nginx-1.22.1/
vim auto/cc/gcc
# debug
#CFLAGS="$CFLAGS -g"
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-threads --with-file-aio
make
make之后不要执行make install
# 2.在升级之前备份原程序
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
\cp -f objs/nginx /usr/local/nginx/sbin/
cd /usr/local/nginx/sbin/
# 3.查看当前nginx pid
ps ax |grep nginx
7767 ? Ss 0:00 nginx: master process /usr/local/nginx/sbin/nginx
7768 ? S 0:00 nginx: worker process
# 4.升级新程序
kill -USR2 7767
ps ax|grep nginx
7767 ? Ss 0:00 nginx: master process /usr/local/nginx/sbin/nginx
7768 ? S 0:00 nginx: worker process
10572 ? S 0:00 nginx: master process /usr/local/nginx/sbin/nginx
10573 ? S 0:00 nginx: worker process
此时访问还是老版本:
# 5.关闭原worker进程
kill -WINCH 7767
ps ax|grep nginx
7767 ? Ss 0:00 nginx: master process /usr/local/nginx/sbin/nginx
10572 ? S 0:00 nginx: master process /usr/local/nginx/sbin/nginx
10573 ? S 0:00 nginx: worker process
版本退回:
\cp -f nginx.bak nginx
kill -HUP 7767
ps ax|grep nginx
7767 ? Ss 0:00 nginx: master process /usr/local/nginx/sbin/nginx
10572 ? S 0:00 nginx: master process /usr/local/nginx/sbin/nginx
10573 ? S 0:00 nginx: worker process
10618 ? S 0:00 nginx: worker process
老版本进程已经拉起来,但访问还是新版本:
kill -WINCH 10572
ps ax|grep nginx
7767 ? Ss 0:00 nginx: master process /usr/local/nginx/sbin/nginx
10572 ? S 0:00 nginx: master process /usr/local/nginx/sbin/nginx
10618 ? S 0:00 nginx: worker process
此时版本回滚到刚开始安装的版本。