|
目录
一、Keepalived概述
1、Keepalived描述
2、Keepalived运行原理
二、Keepalived服务
1、 Keepalived高可用服务器拓扑图
2、Keepalived安装与配置
3、客户端验证
三、keepalived+LVS
1、keepalived+LVS拓扑
2、配置web1服务器
3、配置web2服务器
4、配置proxy
5、配置proxy1
6、验证测试
四、HAProxy服务
1、HAProxy概述
1. HAProxy简介
2. 衡量负载均衡器性能的因素
3. HAProxy工作模式
2、HAProxy配置案例
1. 拓扑图
2. 部署web1
3. 部署web2
4. 部署HAProxy
5.客户端访问测试
五、集群调度软件对比
1、NGINX分析
2、LVS分析
3、HAProxy分析
一、Keepalived概述
1、Keepalived描述
| Keepalived实现了高可用集群 |
|---|
| Keepalived最初是为了LVS设计的 ? ? ? ? - 专门监控各服务器节点状态 | | Keepalived后来加入了VRRP功能,防止单点故障 |
2、Keepalived运行原理
| Keepalived检测每个服务器节点状态 |
|---|
| 服务器节点异常或工作出现故障,Keepalived将故障节点从集群系统中剔除 | | 故障节点恢复后,Keepalived再将其加入到集群系统中 | | 所有工作自动完成,无需人工干预 |
二、Keepalived服务
1、 Keepalived高可用服务器拓扑图

2、Keepalived安装与配置
① WEB1部署环境与安装Keepalived
[root@web1 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 192.168.5.11/24 ipv4.gateway 192.168.5.254 ipv4.dns 114.114.114.114 connection.autoconnect yes
#由于我配的是是网络yum源需要联网,只做实验有本地yum源只配IP和子网即可
[root@web1 ~]# nmcli connection up ens33 #激活网卡
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "192.168.5.11" > /var/www/html/index.html #编写测试网页
[root@web1 ~]# yum install -y keepalived #安装Keepalived
[root@web1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id web1 #设置路由ID号,可以随意修改
vrrp_iptables #清除防火墙的拦截规则
}
vrrp_instance VI_1 {
state MASTER #主服务器为MASTER(备服务器需要修改为BACKUP)
interface ens33 #定义网络接口
virtual_router_id 51 #主备服务器VRID号必须一致
priority 100 #服务器优先级,优先级高优先获取VIP(数字越大优先级越高)
advert_int 1 #检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s组播信息发送间隔,两个节点设置必须一样
authentication {
auth_type PASS #验证类型
auth_pass 1111 #主备服务器密码必须一致
}
virtual_ipaddress {
192.168.5.80/24 #VIP地址
}
}
[root@web1 ~]# systemctl restart keepalived.service #重启服务
[root@web1 ~]# ip a s ens33 #会出现5.80的VIP地址
② WEB2部署与安装Keepalived
[root@web2 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 192.168.5.12/24 ipv4.gateway 192.168.5.254 ipv4.dns 114.114.114.114 connection.autoconnect yes
#由于我配的是是网络yum源需要联网,只做实验有本地yum源只配IP和子网即可
[root@web2 ~]# nmcli connection up ens33 #激活网卡
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo "192.168.5.11" > /var/www/html/index.html #编写测试网页
[root@web2 ~]# yum install -y keepalived #安装Keepalived
[root@web2 ~]# scp root@192.168.5.11:/etc/keepalived/keepalived.conf /etc/keepalived/
#将web1的Keepalived文件覆盖到本地,减少修改时间
[root@web2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id web2 #设置路由ID号
vrrp_iptables
}
vrrp_instance VI_1 {
state BACKUP #主服务器为MASTER(备服务器需要修改为BACKUP)
interface ens33
virtual_router_id 51
priority 50 #服务器优先级,优先级高优先获取VIP(数字越大优先级越高)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.80/24
}
}
[root@web1 ~]# systemctl restart keepalived.service #重启服务
3、客户端验证
① 默认主备都正常,浮动IP会给到web1

② 若主(web1)异常,浮动IP会给到web2?
[root@web1 ~]# systemctl stop keepalived.service? ?#停止web1的keepalived服务

三、keepalived+LVS
1、keepalived+LVS拓扑
① 使用Keepalived高可用解决调度器单点故障问题
② 主、备调度器上配置LVS
③ 主调度器异常时,Keepalived启用备用调度器

2、配置web1服务器
将第一个实验环境web1、web2的Keepalived服务停掉
[root@web1 ~]# systemctl stop keepalived.service
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 #配置VIP地址
DEVICE=lo:0 #设备名称
IPADDR=192.168.5.50 #IP地址
NETMASK=255.255.255.255#子网掩码
NETWORK=192.168.5.50 #网络地址
BROADCAST=192.168.5.50 #广播地址
ONBOOT=yes #开机是否激活网卡
NAME=lo:0 #网卡名称
注意:因为web1配置与调度器一样的VIP地址,默认肯定会出现地址冲突,
[root@web1 ~]# vim /etc/sysctl.conf #修改文件,目的(只有调度器响应,其他主机均不响应)
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
#当有arp广播问谁是192.168.5.50时,本机忽略该ARP广播,不做任何回应(防止进站冲突)
#本机不要向外宣告自己的lo回环地址是192.168.5.50(防止出站冲突)
[root@web1 ~]# sysctl -p #加载系统参数
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@web1 ~]# systemctl restart network #重启网络服务
[root@web1 ~]# ip a s lo | grep inet #查看虚拟IP是否生成
inet 127.0.0.1/8 scope host lo
inet 192.168.5.50/32 brd 192.168.5.50 scope global lo:0
inet6 ::1/128 scope host
3、配置web2服务器
将第一个实验环境web2的Keepalived服务停掉
[root@web2 ~]# systemctl stop keepalived.service
注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 #配置VIP地址
DEVICE=lo:0 #设备名称
IPADDR=192.168.5.50 #IP地址
NETMASK=255.255.255.255#子网掩码
NETWORK=192.168.5.50 #网络地址
BROADCAST=192.168.5.50 #广播地址
ONBOOT=yes #开机是否激活网卡
NAME=lo:0 #网卡名称
注意:因为web1配置与调度器一样的VIP地址,默认肯定会出现地址冲突,
[root@web2 ~]# vim /etc/sysctl.conf #修改文件,目的(只有调度器响应,其他主机均不响应)
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
#当有arp广播问谁是192.168.5.50时,本机忽略该ARP广播,不做任何回应(防止进站冲突)
#本机不要向外宣告自己的lo回环地址是192.168.5.50(防止出站冲突)
[root@web2 ~]# sysctl -p #加载系统参数
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@web2 ~]# systemctl restart network #重启网络服务
[root@web2 ~]# ip a s lo | grep inet #查看虚拟IP是否生成
inet 127.0.0.1/8 scope host lo
inet 192.168.5.50/32 brd 192.168.5.50 scope global lo:0
inet6 ::1/128 scope host
4、配置proxy
[root@proxy ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.5.5/24 ipv4.gateway 192.168.5.254 ipv4.dns 114.114.114.114 connection.autoconnect yes
#由于我配的是是网络yum源需要联网,只做实验有本地yum源只配IP和子网即可
[root@proxy ~]# nmcli connection up eth0
[root@proxy ~]# yum -y install ipvsadm
[root@proxy ~]# yum -y install keepalived
[root@proxy ~]# rm -rf /etc/sysconfig/network-scripts/ifcfg-eth0:0
#若没有不用删除,之前的实验配置过之前VIP网卡
[root@proxy ~]# ipvsadm -C #清除所有规则
[root@proxy ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id proxy #设置路由号
vrrp_iptables #清除防火墙规则
}
vrrp_instance VI_1 {
state MASTER #设置为主服务器为MASTER
interface eth0 #定义网络接口
virtual_router_id 51 #主备VRID号必须一致
priority 100 #服务器优先级
advert_int 1 #检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s组播信息发送间隔,两个节点设置必须一样
authentication {
auth_type PASS #认证方式
auth_pass 1111 #认证密码,主备必须一致
}
virtual_ipaddress { #设置VIP
192.168.5.50/24
}
}
virtual_server 192.168.5.50 80 { #设置ipvsadm的VIP规则
delay_loop 6 #健康检查时间间隔(不大于6s,值不定)
lb_algo wrr #LVS调度算法,wrr加权轮询
lb_kind DR #负载均衡调度算法
#persistence_timeout 50 #会话保持时间,开启后客户端在一定时间内(50秒)始终访问相同服务器
protocol TCP #TCP协议
real_server 192.168.5.11 80 { #设置后端web服务器真实IP
weight 1 #权重值
TCP_CHECK { #对后台real_server做健康检查
connect_timeout 3 #健康检查的超时时间3秒
nb_get_retry 3 #健康检查的重试次数3次
delay_before_retry 3 #健康检查的间隔时间3秒
}
}
real_server 192.168.5.12 80 { #设置后端web服务器真实IP
weight 2 #设置权重为2
TCP_CHECK { #对后台real_server做健康检查
connect_timeout 3 #健康检查的超时时间3秒
nb_get_retry 3 #健康检查的重试次数3次
delay_before_retry 3 #健康检查的间隔时间3秒
}
}
}
[root@proxy ~]# systemctl restart keepalived.service
[root@proxy ~]# ipvsadm -Ln #查看IP规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.5.50:80 wrr
-> 192.168.5.11:80 Route 1 0 0
-> 192.168.5.12:80 Route 2 0 0
[root@proxy ~]# ip a s eth0 | grep inet #查看VIP配置
inet 192.168.5.5/24 brd 192.168.5.255 scope global noprefixroute eth0
inet 192.168.5.50/24 scope global secondary eth0 #VIP已产生
inet6 fe80::da6d:94a0:3f30:531/64 scope link noprefixroute
5、配置proxy1
[root@proxy1 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.5.6/24 ipv4.gateway 192.168.5.254 ipv4.dns 114.114.114.114 connection.autoconnect yes
#由于我配的是是网络yum源需要联网,只做实验有本地yum源只配IP和子网即可
[root@proxy1 ~]# nmcli connection up eth0
[root@proxy1 ~]# yum -y install ipvsadm
[root@proxy1 ~]# yum -y install keepalived
[root@proxy1 ~]# scp root@192.168.5.5:/etc/keepalived/keepalived.conf /etc/keepalived/ #拷贝proxy配置文件
[root@proxy1 ~]# ipvsadm -C #清除所有规则
[root@proxy1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id proxy1 #设置路由号
vrrp_iptables #清除防火墙规则
}
vrrp_instance VI_1 {
state BACKUP #设置为主服务器为MASTER
interface eth0 #定义网络接口
virtual_router_id 51 #主备VRID号必须一致
priority 50 #服务器优先级
advert_int 1 #检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s组播信息发送间隔,两个节点设置必须一样
authentication {
auth_type PASS #认证方式
auth_pass 1111 #认证密码,主备必须一致
}
virtual_ipaddress { #设置VIP
192.168.5.50/24
}
}
virtual_server 192.168.5.50 80 { #设置ipvsadm的VIP规则
delay_loop 6 #健康检查时间间隔(不大于6s,值不定)
lb_algo wrr #LVS调度算法,wrr加权轮询
lb_kind DR #负载均衡调度算法
#persistence_timeout 50 #会话保持时间,开启后客户端在一定时间内(50秒)始终访问相同服务器
protocol TCP #TCP协议
real_server 192.168.5.11 80 { #设置后端web服务器真实IP
weight 1 #权重值
TCP_CHECK { #对后台real_server做健康检查
connect_timeout 3 #健康检查的超时时间3秒
nb_get_retry 3 #健康检查的重试次数3次
delay_before_retry 3 #健康检查的间隔时间3秒
}
}
real_server 192.168.5.12 80 { #设置后端web服务器真实IP
weight 2 #设置权重为2
TCP_CHECK { #对后台real_server做健康检查
connect_timeout 3 #健康检查的超时时间3秒
nb_get_retry 3 #健康检查的重试次数3次
delay_before_retry 3 #健康检查的间隔时间3秒
}
}
}
[root@proxy1 ~]# systemctl restart keepalived.service
[root@proxy1 ~]# ipvsadm -Ln #查看LVS规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.5.50:80 wrr
-> 192.168.5.11:80 Route 1 0 0
-> 192.168.5.12:80 Route 2 0 0
[root@proxy1 ~]# ip a s eth0 | grep inet #查看VIP配置,因为是从所以没有产生VIP
inet 192.168.5.6/24 brd 192.168.5.255 scope global noprefixroute eth0
inet6 fe80::b1e:5f70:5e1e:8c0f/64 scope link noprefixroute
6、验证测试
① 使用clinet主机(自行配置同网IP)
[root@client ~]# curl 192.168.5.50
192.168.5.11
[root@client ~]# curl 192.168.5.50
192.168.5.12
[root@client ~]# curl 192.168.5.50
192.168.5.12
[root@client ~]# curl 192.168.5.50
192.168.5.11
[root@client ~]# curl 192.168.5.50
192.168.5.12
[root@client ~]# curl 192.168.5.50 #因为是加权轮询,所以web2每次被访问2次
② 使用主机浏览器访问验证轮询效果不加,猜测是缓存机制问题
③ 停止主服务器keepalived,VIP会自动跳到备用服务器
[root@proxy ~]# systemctl stop keepalived.service
[root@proxy1 ~]# ip a s eth0 | grep inet #proxy1设备查看,VIP已跳到备用服务器
inet 192.168.5.6/24 brd 192.168.5.255 scope global noprefixroute eth0
inet 192.168.5.50/24 scope global secondary eth0
inet6 fe80::b1e:5f70:5e1e:8c0f/64 scope link noprefixroute
[root@proxy ~]# systemctl start keepalived.service #再开启主服务器
[root@proxy ~]# ip a s eth0 | grep inet #VIP自动跳到主服务器
inet 192.168.5.5/24 brd 192.168.5.255 scope global noprefixroute eth0
inet 192.168.5.50/24 scope global secondary eth0
inet6 fe80::da6d:94a0:3f30:531/64 scope link noprefixroute
[root@proxy1 ~]# ip a s eth0 | grep inet #备用服务器VIP自动消失
inet 192.168.5.6/24 brd 192.168.5.255 scope global noprefixroute eth0
inet6 fe80::b1e:5f70:5e1e:8c0f/64 scope link noprefixroute
四、HAProxy服务
1、HAProxy概述
1. HAProxy简介
| ① 它是免费、快速并且可靠的一种解决方案 |
|---|
| ② 适用于那些负载大的Web站点,这些站点通常又需要会话保持或七层处理 | | ③ 提供高可用性、、负载均衡以及基于TCP和HTTP应用的代理 |
2. 衡量负载均衡器性能的因素
| Session? rate 会话率 ? ? ? ? - 每秒钟产生的会话数 | | Session? concurrency 并发会话数 ? ? ? ? - 服务器处理会话的时间越长,并发会话数越多 | | Data? rate? 数据速率 ? ? ? ? - 以MB/s或Mbps衡量 |
3. HAProxy工作模式
| mode? http ? ? ? ? - 客户端请求被深度分析后再发往服务器 | | mode? tcp ? ? ? ? - 4层调度,不检查第七层信息 | | mode? health ? ? ? ? - 仅做健康状态检查,已经不建议使用 |
2、HAProxy配置案例
1. 拓扑图

?通俗的讲,就是客户端要送礼给WEB,HAProxy全程保密的进行,过程中客户端和WEB只是单方面知道HAProxy存在,但是客户端与WEB并不互知
2. 部署web1
[root@web1 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 192.168.4.11/24 connection.autoconnect yes
[root@web1 ~]# nmcli connection up ens33 #配置并激活ens33,网卡名根据自己设备实际来
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# echo "192.168.4.11:web1" > /var/www/html/index.html
3. 部署web2
[root@web1 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 192.168.4.11/24 connection.autoconnect yes
[root@web1 ~]# nmcli connection up ens33 #配置并激活ens33,网卡名根据自己设备实际来
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# echo "192.168.4.11:web1" > /var/www/html/index.html
4. 部署HAProxy
[root@proxy ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.5.5/24 ipv4.gateway 192.168.5.254 ipv4.dns 8.8.8.8 connection.autoconnect yes
[root@proxy ~]# nmcli connection up eth0 #配置并激活eth0
[root@proxy ~]# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.4.5/24 ipv4.gateway 192.168.4.254 ipv4.dns 8.8.8.8 connection.autoconnect yes
[root@proxy ~]# nmcli connection up eth1 #配置并激活eth1
[root@proxy ~]# yum -y install haproxy #安装haproxy
[root@proxy ~]# yum -y install keepalived #安装keepalived
[root@proxy ~]# yum -y install ipvsadm #安装ipvsadm
[root@proxy ~]# ipvsadm -C #清除规则
[root@proxy ~]# vim /etc/haproxy/haproxy.cfg #修改配置文件
global
log 127.0.0.1 local2 #调试错误警告信息
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid#haproxy的pid存放路径
maxconn 4000 #最大连接数量
user haproxy #用户
group haproxy #组
daemon #将进程放入deamon模式运行
stats socket /var/lib/haproxy/stats
defaults
mode http #默认的模式{tcp | http | health}
log global #采用全局定义的日志
option httplog #日志类别
option dontlognull #不记录健康检查的日志信息
option http-server-close #每次请求完毕后主动关闭http通道
option forwardfor except 127.0.0.0/8
option redispatch #serverid服务器挂掉后强制定向到其它健康服务器
retries 3 #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 #最大连接次数
frontend main *:5000
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
backend static
balance roundrobin
server static 127.0.0.1:4331 check
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
listen webs *:80 #定义集群,listen后面的名称任意,端口为80
balance roundrobin #balance指定调度算法为轮询(不能用简写的rr)
server web1 192.168.4.11:80 check inter 2000 rise 2 fall 5
server web2 192.168.4.12:80 check inter 2000 rise 2 fall 5
#server指定后端真实服务器,web1和web2的名称可以任意
listen stats 0.0.0.0:1080 #监听端口
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计界面url
stats realm HaManager #进入管理界面查看状态信息
stats auth admin:admin #统计页面用户名和密码设置
#stats hide-version #隐藏统计页面上HAProxy的版本信息
[root@proxy ~]# systemctl enable --now haproxy.service #启动haproxy
5.客户端访问测试
① 客户端配置与HAProxy相同网络的IP地址,使用浏览器访问http://192.168.5.5,测试调度器是否可正常工作
 
?② 客户端访问http://192.168.5.5:1080/stats测试状态监控是否正常


Queue队列数据的信息(当前队列数量,最大值,队列限制数量);
Session rate每秒会话率(当前值,最大值,限制数量);
Sessions总会话量(当前值,最大值,总量,Lbtot: total number of times a server was selected选中一台服务器所用的总时间);
Bytes(入站、出站流量);
Denied(拒绝请求、拒绝回应);
Errors(错误请求、错误连接、错误回应);
Warnings(重新尝试警告retry、重新连接redispatches);
Server(状态、最后检查的时间(多久前执行的最后一次检查)、权重、备份服务器数量、down机服务器数量、down机时长)。
当停止web2时,监控界面会动态监测


五、集群调度软件对比
1、NGINX分析
| 优点: |
|---|
| ? ? ? ? - 工作在7层,可以针对http做分流策略 | | ? ? ? ? - 1.9版本开始支持4层代理 | | ? ? ? ? - 正则表达式比HAProxy强大 | | ? ? ? ? - 安装、配置、测试简单,通过日志可以解决多数问题 | | ? ? ? ? - 并发量可以达到几万次 | | ? ? ? ? - Nginx还可以作为web服务器使用 | | 缺点: | | ? ? ? ? - 7层代理仅支持https、https、mail协议,应用面小 | | ? ? ? ? - 监控检查仅通过端口,无法使用url检查 |
2、LVS分析
| 优点: |
|---|
| ? ? ? ? - 负载能力强,工作在四层,对内存、CPU消耗低 | | ? ? ? ? - 配置性低,没有太多可配置性,减少人为错误 | | ? ? ? ? - 应用面广,几乎可以为所有应用提供负载均衡 | | 缺点: | | ? ? ? ? - 不支持正则表达式,不能实现动静分离 | | ? ? ? ? - 如果网站架构庞大,LVS-DR配置比较繁琐 |
3、HAProxy分析
| 优点: |
|---|
| ? ? ? ? - 支持session、cookie功能 | | ? ? ? ? - 可以通过url进行健康检查 | | ? ? ? ? - 效率、负载均衡速度,高于Nginx、低于LVS | | ? ? ? ? - HAProxy支持TCP,可以对MySQL进行负载均衡 | | ? ? ? ? - 调度算法丰富 | | 缺点: | | ? ? ? ? - 正则弱于Nginx | | ? ? ? ? - 日志依赖于syslogd |
|