Linux(企业级)—— 负载均衡&流量调度
在企业级服务器运维中,这是很重要的一环。也与当前的企业运营息息相关。
1. LVS(4层)
LVS可以避免DNS更新慢,算法单一以及无法防御攻击。
LVS 可以工作在不同的调度算法下,并且有不同的转发模式,其速度:DR>Tun>NAT>fullNAT。
-
DR 模式下,轮转转发算法的配置示例。
调度端:
首先安装ipvsadm模块,配置RS池,以及调度算法等
配置VIP地址:172.25.52.100服务端RS:
安装arptables,配置VIP地址并且屏蔽RS上的ARP请求与回复。
[root@server2 ~]# ip addr add 172.25.52.100/32 dev eth0
[root@server2 ~]# systemctl restart network
[root@server2 ~]# arptables -A INPUT -d 172.25.52.100 -j DROP
[root@server2 ~]# arptables -A OUTPUT -s 172.25.52.100 -j mangle --mangle-ip-s 172.25.52.2
开启apache,修改两个RS的发布页面,以区别访问对象。
[root@server2 ~]# echo server2 > /var/www/html/index.html
[root@server2 ~]# systemctl restart httpd
server3的设置同server2。
测试:
在远程主机访问VIP;
2. Keepalive
调度端配备份高可用,服务端进行掉线检测;
- 服务端进行掉线检测
调度端:
安装keepalived,取消VIP 设置,清空ipvsadm设置;
配置keepalived:
[root@server1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@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 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.52.100
}
}
virtual_server 172.25.52.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.52.2 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.52.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
服务端设置与上节相同。
测试:
在远端访问VIP,查看响应RS,手动关闭某个RS ,查看LVS策略以及响应的RS。
当RS工作策略有变动时,调度端可以收到RS上下线信息:
查看LVS策略:
手动关闭server2的httpd服务,重新查看Lvs策略,并在远端访问:
此时流量全部被调度至server2
重新开启server2的httpd服务,重新查看Lvs策略,并在远端访问:
此时流量重新被均衡分配。
- 调度端配备份高可用(调度端备份)
在辅助调度端配置keepalive,基本与主调度相同,区别如下:
当主配置调度掉线时,副配置调度上线:
主调度重新上线时:
3. Haproxy(7层)
反向代理,访问haproxy时会定向由调度端访问后端的资源,支持端口映射。
roundrobin :均衡轮询调度 支持权重
source : 根据来源IP进行调度
等等
支持制定策略调度,如访问图片定向至指定后端等
安装haproxy
配置系统限制:
编写配置文件,指定访问文件夹与图片定向至server3,开启后端日志监控 ,读写分离 等:
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
stats uri /status #后端检测页面
stats auth admin:abc123 #账号密码认证
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:80 #指定acl规则 ,访问指定格式至static
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
acl list src 172.25.52.250 #设定250的策略族组
#block if list #拒绝list访问
#errorloc 403 http://www.baidu.com #403错误重定向
#redirect location http://www.baidu.com if list #list重定向至百度,如果没有判断则所有访问都重定向
####### 读写分离,网页存储在server2 上传数据存储在server3
acl List method PUT #检测put方法
acl List method POST #检测post方法
use_backend static if List #将上传资料定向至static表
use_backend static if url_static
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 172.25.52.3:80 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin #后台使用 轮询调度
server app1 172.25.52.2:80 check weight 2 #表示权重为2
server app2 172.25.52.3:80 check #默认权重为1
server backup 172.25.52.1:8080 backup #调度器的8080端口设置为备份主机
测试:
访问后台监控界面
测试调度优先级:
测试访问路径调度:
在server2与3上安装php,并且添加上传文件的php文件:
server3作为存储数据的设备,不创建index.php
在远端访问上传页面:
上传图片,成功:
数据存储在server3,server2对应目录为空:
4. PCS
yum install -y pacemaker pcs psmisc policycoreutils-python
scp /etc/yum.repos.d/dvd.repo root@172.25.52.4:/etc/yum.repos.d/dvd.repo
ssh-keygen
ssh-copy-id server4
systemctl enable --now pcsd.service
ssh server4 systemctl enable --now pcsd.service
echo westos | passwd --stdin hacluster
ssh server4 'echo westos | passwd --stdin hacluster'
pcs cluster auth server1 server4
pcs cluster setup --name mycluster server1 server4
pcs cluster start --all
pcs cluster enable --all
pcs property set stonith-enabled=false
pcs resource create VIP ocf:heartbeat:IPaddr2 ip=172.25.52.100 op monitor interval=30s
pcs resource create haproxy systemd:haproxy op monitor interval=30s
pcs resource group add Group vip haproxy
当VIP与haproxy都运行在server1上时,访问调度后台:
令server1 standby,刷新页面
刷新管理页面,发现pid发生变化,证明代理服务器已经变动。
5. fence
真机安装:
fence-virtd-0.4.0-9.el8.x86_64
fence-virtd-multicast-0.4.0-9.el8.x86_64
fence-virtd-libvirt-0.4.0-9.el8.x86_64
虚拟机调度端安装:
fence_virt
在调度端 配置fence
[root@server1 ~]# yum install -y fence-virt #安装fence客户端
[root@server1 ~]# ssh server4 yum install -y fence-virt
[root@server1 ~]# mkdir /etc/cluster #创建密钥文件夹
[root@server1 ~]# ssh server4 mkdir /etc/cluster
[root@server1 ~]#p cs property set stonith-enabled=true #开启stonith
# 创建fence服务 名为vmfence
[root@server1 ~]# pcs stonith create vmfence fence_xvm [root@server1 ~]# pcmk_host_map="server1:server1;server4:server4" op monitor interval=60s
[root@server1 ~]# crm_verify -LV #检查配置
[root@server1 ~]# pcs status
server4 无响应之后fence使其强制重新启动,查看pcs 状态:
关闭pcs: