目录
一、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 |
|