主要内容:
Keepalived基础(通过VRRP实现高可用功能、设置优先级、VIP)、Keepalived+LVS(通过VRRP和LVS实现高可用+负载均衡、配置LVS规则定义健康检查)、HAproxy服务器(代理服务器)、集群调度软件对比
一、Keepalived概述
Keepalived主要是通过虚拟路由冗余(VRRP)来实现高可用功能
起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。后来Keepalived又加入了VRRP的功能,VRRP(Virtual Router Redundancy Protocol虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalived 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能。
VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信,这其中涉及到两个概念:物理路由器和虚拟路由器;可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等;而其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为"BACKUP的角色",当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的;
Keepalived运行原理:
- Keepalived检测每个服务器节点状态;
- 服务器节点异常或工作出现故障,keepalived将故障节点从集群系统中剔除;
- 故障节点恢复后,Keepalived再将其加入到集群系统中;
- 所有工作自动完成,无虚人工干预;
Keepalived具有三个功能:
- 通过VRRP实现主备切换(高可用)
- 配置LVS(配置文件自带LVS配置)
- 健康检查
软件包: keepalived
配置文件: /etc/keepalived/keepalived.conf
**补充:**Keepalived可以和nginx、mysql、ftp、dns搭配,keepalived只决定提供虚拟IP(浮动IP)实现主备设备的切换,服务器上运行的服务与keepalived无关,浮动IP的抉择取决于服务器优先级。
案例1:Keepalived高可用服务器
案例要求:使用Keepalived实现web服务器的高可用
- 1)Web服务器IP地址分别为192.168.4.100和192.168.4.200
- 2)Web服务器的浮动IP地址为192.168.4.80(VIP)
- 3)客户端通过访问VIP地址访问Web页面
主机配置表:
实验网络拓扑:
步骤1:配置防火墙和SELinux
bash
[root@web1 ~]# firewall-cmd --set-default-zone=trusted
[root@web1 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@web1 ~]# setenforce 0
[root@web2 ~]# firewall-cmd --set-default-zone=trusted
[root@web2 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@web2 ~]# setenforce 0
步骤2:配置网络环境
1)设置Web1服务器网络参数、配置Web服务
bash
[root@web1 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.4.100/24 connection.autoconnect yes
[root@web1 ~]# nmcli connection up eth0
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "192.168.4.100" > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd //启动服务
2)设置Web2服务器网络参数、配置Web服务
bash
[root@web2 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.4.200/24 connection.autoconnect yes
[root@web2 ~]# nmcli connection up eth0
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo "192.168.4.200" > /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd //启动服务
3)配置proxy主机的网络参数(该实验proxy当作客户端主机)
bash
[root@proxy ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.4.5/24 connection.autoconnect yes
[root@proxy ~]# nmcli connection up eth0
步骤3:安装、部署Keepalived软件
安装keepalived软件后,生成/etc/keepalived/keepalived.conf配置文件
1)修改Keepalived配置文件(Web1操作)
bash
[root@web1 ~]# yum install -y keepalived //安装keepalived软件
[root@web1 ~]# vim /etc/keepalived/keepalived.conf //修改配置文件
global_defs { //全局配置
...
router_id web1 //12行,设置路由ID号(web1)
vrrp_iptables //13行,手动添加清除防火墙的拦截规则(启动keepalived,它会在防火墙设置拦截规则,拒绝所有服务访问)
...
}
vrrp_instance VI_1 { //VRRP示例配置
state MASTER //21行,主服务器为MASTER(备服务器需修改为BACKUP)
interface eth0 //22行,定义网络接口(虚拟IP(VIP)配在哪个网卡)
virtual_router_id 51 //23行,配置VRID(主备服务器VRID号必须一致)
priority 100 //24行,服务器优先级,优先级高的优先获取VIP(升为MASTER)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.4.80/24 //30~32行,主服务器获得虚拟IP(VIP)
}
}
- 补充:配置文件的后续内容是提供其它的keepalived服务,可以直接删除配置
- 补充:通过# scp /etc/keepalived/keepalived.conf 192.168.4.200:/etc/keepalived/
2)修改Keepalived配置文件(web2操作)
bash
[root@web2 ~]# yum install -y keepalived //安装keepalived软件
[root@web2 ~]# vim /etc/keepalived/keepalived.conf //修改配置文件
global_defs { //全局配置
...
router_id web2 //12行,设置路由ID号(web2)
vrrp_iptables //13行,清除防火墙的拦截规则(默认拒绝所有服务访问)
...
}
vrrp_instance VI_1 { //VRRP示例配置
state BACKUP //21行,备服务器为BACKUP(主服务器需修改为MASTER)
interface eth0 //22行,定义虚拟IP(VIP)配在哪个网卡
virtual_router_id 51 //23行,配置VRID,主备服务器VRID号必须一致
priority 95 //24行,服务器优先级小于主MASTER服务器(为BACKUP)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.4.80/24 //30~32行,谁是主服务器谁配置VIP
}
}
3)启动keepalived服务
bash
[root@web1 ~]# systemctl start keepalived.service
[root@web2 ~]# systemctl start keepalived.service
4)验证:
登录Web1服务器查看IP信息:
bash
[root@web1 ~]# ip add show eth0 //因web1优先级为100,为MASTER获得VIP
登录Web2服务器查看IP信息:
bash
[root@web2 ~]# ip add show eth0 //因web2优先级为95,为BACKUP未获得VIP
客户端浏览器访问:
① 使用curl访问http://192.168.4.80,验证是否可正常访问服务
bash
[root@proxy ~]# curl 192.168.4.80 //web1服务器MASTER的页面
192.168.4.100
[root@proxy ~]# curl 192.168.4.80
192.168.4.100
② 当web1服务器的Keepalived服务为stop或关机状态,验证是否可正常访问服务
bash
[root@proxy ~]# curl 192.168.4.80
192.168.4.200
[root@proxy ~]# curl 192.168.4.80
192.168.4.200
- 补充:web2通过接收MASTER的VRRP状态通告信息,处于BACKUP角色的web2将重新进行选举,进入MASTER角色并获得VIP;(当web1服务恢复,会继续升为MASTER)
- 补充:keepalived提供热备(高可用),在访问Ping 192.168.4.80是不会中断丢包的。
**常见问题:**keepalived无法实现负载均衡,只支持实现高可用,即主备切换(选举MASTER分配VIP);而在服务器上使用的任何服务与keepalived无关。假设用户访问web1(MASTER)运行的httpd服务为stop状态,由于服务未开启,显示内容即:"服务访问拒绝",
bash
[root@web1 ~]# systemctl stop httpd
[root@proxy ~]# curl 192.168.4.80
curl: (7) Failed connect to 192.168.4.80:80; 拒绝连接
[root@proxy ~]# curl 192.168.4.80
curl: (7) Failed connect to 192.168.4.80:80; 拒绝连接
案例2:Keepalived+LVS服务器
案例要求:使用Keepalived为LVS1、LVS2调度器提供高可用功能,防止调度器单点故障,LVS调度器为用户提供负载均衡的Web服务;
- 1)LVS1调度器真实IP地址为192.168.4.5(DIP)
- 2)LVS2调度器真实IP地址为192.168.4.6(DIP)
- 3)服务器VIP地址设置为192.168.4.15,由keepalived服务进行优先级的选举分配(VIP)
- 4)真实Web服务器地址分别为192.168.4.100、192.168.4.200(RIP)
- 5)使用加权轮询调度算法(wrr)
主机分配表:
实验网络拓扑:
步骤1:配置防火墙和SELinux
bash
[root@web1 ~]# firewall-cmd --set-default-zone=trusted
[root@web1 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@web1 ~]# setenforce 0
[root@web2 ~]# firewall-cmd --set-default-zone=trusted
[root@web2 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@web2 ~]# setenforce 0
步骤2:配置网络环境
1)设置后端web服务器的网络参数
bash
[root@web1 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.100/24 connection.autoconnect yes
[root@web1 ~]# nmcli connection up eth0
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "192.168.4.100" > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd //启动服务
[root@web2 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.200/24 connection.autoconnect yes
[root@web2 ~]# nmcli connection up eth0
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo "192.168.4.200" > /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd //启动服务
2)配置proxy主机的网络参数
bash
[root@proxy ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.4.5/24 connection.autoconnect yes
[root@proxy ~]# nmcli connection up eth0
[root@proxy2 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.4.6/24 connection.autoconnect yes
[root@proxy2 ~]# nmcli connection up eth0
步骤3:部署LVS-DR调度模式
1)配置后端服务器的VIP地址(web1操作)
bash
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 ~]# cp ifcfg-lo ifcfg-lo:0
[root@web1 ~]# vim ifcfg-lo:0
DEVICE=lo:0 //设备名称
IPADDR=192.168.4.15 //IP地址
NETMASK=255.255.255.255 //子网掩码
NETWORK=192.168.4.15 //网络地址
BROADCAST=192.168.4.15 //广播地址
ONBOOT=yes //开机是否激活该网卡
NAME=lo:0 //网卡名称
2)修改内核配置说明文件(不回应广播,不向外宣告,防止进出站IP冲突)
bash
[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
[root@web1 ~]# sysctl -p //刷新配置文件,立刻生效
3)重启服务
bash
[root@web1 ~]# systemctl restart network //重启网络服务
[root@web1 ~]# ip add show
4)配置后端服务器的VIP地址(web2操作)
bash
[root@web2 ~]# cd /etc/sysconfig/network-scripts/
[root@web2 ~]# cp ifcfg-lo ifcfg-lo:0
[root@web2 ~]# vim ifcfg-lo:0
DEVICE=lo:0 //设备名称
IPADDR=192.168.4.15 //IP地址
NETMASK=255.255.255.255 //子网掩码
NETWORK=192.168.4.15 //网络地址
BROADCAST=192.168.4.15 //广播地址
ONBOOT=yes //开机是否激活该网卡
NAME=lo:0 //网卡名称
5)修改内核配置说明文件(不回应广播,不向外宣告,防止进出站IP冲突)
bash
[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
[root@web2 ~]# sysctl -p //刷新配置文件,立刻生效
6)重启服务
bash
[root@web2 ~]# systemctl restart network //重启网络服务
[root@web2 ~]# ip add show
步骤4:部署Keepalived与ipvsadm软件,实现LVS-DR模式调度器的高可用
- 通过keepalived服务,从2台LVS调度器选举MASTER并分配VIP地址
- 通过keepalived配置文件,可对LVS进行相关配置(Keepalived起初就是为LVS设计)
- 通过keepalived服务,可监控后端服务器服务,并做健康检查,
1)关闭服务(把案例1中web1、web2的keepalived服务关闭)
bash
[root@web1 ~]# systemctl stop keepalived
[root@web2 ~]# systemctl stop keepalived
2)两台LVS调度器安装软件
bash
[root@proxy ~]# yum install -y keepalived
[root@proxy ~]# systemctl enable keepalived
[root@proxy ~]# yum install -y ipvsadm
[root@proxy ~]# ipvsadm -C
[root@proxy2 ~]# yum install -y keepalived
[root@proxy2 ~]# systemctl enable keepalived
[root@proxy2 ~]# yum install -y ipvsadm
[root@proxy2 ~]# ipvsadm -C
3)LVS1调度器设置Keepalived并启动服务(proxy操作)
bash
[root@proxy ~]# vim /etc/keepalived/keepalived.conf
global_defs { //全局配置
...
router_id lvs1 //设置路由ID号
vrrp_iptables //清除防火墙的拦截规则(实验需要修改,手动添加)
...
}
vrrp_instance VI_1 { //VRRP示例配置
state MASTER //主服务器为MASTER
interface eth0 //定义网络接口
virtual_router_id 51 //配置VRID(主辅VRID号必须一致)
priority 100 //服务器优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { //配置分配的VIP
192.168.4.15/24
}
}
virtual_server 192.168.4.15 80 { //设置LVS虚拟服务器集群规则(VIP)
delay_loop 6 //默认健康检查延迟6秒
lb_algo rr //设置LVS调度算法为rr(轮询)
lb_kind DR //设置LVS的模式为DR
#persistence_timeout 50 //无语法错误,但实验需删除,开启后客户端在一定时间内(50秒)始终访问相同服务器(无法实现轮询效果)
protocol TCP //集群基于TCP协议
real_server 192.168.4.100 80 { //设置LVS后端服务器规则(RIP)
weight 1 //设置权重为1
TCP_CHECK { //设置对后端real_server做健康检查
connect_timeout 3 //健康检查的超时时间3秒
nb_get_retry 3 //健康检查的重试次数3次
delay_before_retry 3 //健康检查的间隔时间3秒
}
}
real_server 192.168.4.200 80 { //设置LVS后端服务器规则(RIP)
weight 1 //设置权重为1
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 Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.4.15:80 rr
-> 192.168.4.100:80 Route 1 0 0
-> 192.168.4.200:80 Route 1 0 0
4)LVS2调度器设置Keepalived并启动服务(proxy2操作)
bash
[root@proxy2 ~]# vim /etc/keepalived/keepalived.conf
global_defs { //全局配置
...
router_id lvs2 //设置路由ID号
vrrp_iptables //清除防火墙的拦截规则(实验需要修改,手动添加)
...
}
vrrp_instance VI_1 { //VRRP示例配置
state BACKUP //备服务器为BACKUP
interface eth0 //定义网络接口
virtual_router_id 51 //配置VRID
priority 95 //服务器优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { //配置分配的VIP
192.168.4.15/24
}
}
virtual_server 192.168.4.15 80 { //设置LVS虚拟服务器集群规则(VIP)
delay_loop 6
lb_algo rr //设置LVS调度算法为rr(轮询)
lb_kind DR //设置LVS的模式为DR
protocol TCP //集群基于TCP协议
real_server 192.168.4.100 80 { //设置LVS后端服务器规则(RIP)
weight 1
TCP_CHECK { //设置对后端real_server做健康检查
connect_timeout 3 //健康检查的超时时间3秒
nb_get_retry 3 //健康检查的重试次数3次
delay_before_retry 3 //健康检查的间隔时间3秒
}
}
real_server 192.168.4.200 80 { //设置LVS后端服务器规则(RIP)
weight 1
TCP_CHECK { //设置对后端real_server做健康检查
connect_timeout 3 //健康检查的超时时间3秒
nb_get_retry 3 //健康检查的重试次数3次
delay_before_retry 3 //健康检查的间隔时间3秒
}
}
}
[root@proxy2 ~]# systemctl start keepalived.service
[root@proxy2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.4.15:80 rr
-> 192.168.4.100:80 Route 1 0 0
-> 192.168.4.200:80 Route 1 0 0
5)客户端验证
① Porxy查看IP(因优先级高,选举为MASTER,获得VIP192.168.4.15)
bash
[root@proxy ~]# ip add show eth0
② Porxy2查看IP
bash
[root@proxy2 ~]# ip add show eth0
客户端使用curl命令反复连接http://192.168.4.15,查看访问的页面是否会轮询到不同的后端真实服务器
bash
[root@client ~]# curl 192.168.4.15
192.168.4.100
[root@client ~]# curl 192.168.4.15
192.168.4.200
[root@client ~]# curl 192.168.4.15
192.168.4.100
[root@client ~]# curl 192.168.4.15
192.168.4.200
补充:keepalived+LVS可实现健康检查功能;
原始的keepalived默认不带健康检查功能,在keepalived配置文件的LVS配置中添加以下TCP_CHECK记录,可实现健康检查功能;
假设当后端服务器web1的httpd服务为失败状态,keepalived+LVS进行健康检查,并在LVS调度器的规则中将问题后端服务器剔除(健康检查根据重试次数、间隔描述对服务保持检查服务,待后端服务器的服务恢复后,即可重新自动添加规则)
测试访问192.168.4.15
二、HAProxy概述
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理(HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上)
HAProxy的一般架构:
HAProxy的监控页面示例:
相关字段解释说明:
- Queue 队列数据的信息(当前队列数量,最大值,队列限制数量);
- Session rate 每秒会话率(当前值,最大值,限制数量);
- Sessions 总会话量(当前值,最大值,总量,Lbtot: total number of times a server was selected选中一台服务器所用的总时间);
- Bytes(入站、出站流量);
- Denied(拒绝请求、拒绝回应);
- Errors(错误请求、错误连接、错误回应);
- Warnings(重新尝试警告retry、重新连接redispatches);
- Server(状态、最后检查的时间(多久前执行的最后一次检查)、权重、备份服务器数量、down机服务器数量、down机时长)。
衡量负责均衡器性能的因素:
- 1.Session rate 会话率(每秒钟产生的会话数)
- 2.Session concurrency 并发会话数(服务器处理会话的时间越长,并发会话数越多)
- 3.Date rate 数据速率(以MB/s或Mbps衡量)
HAProxy工作模式:http、tcp、health
- 1.mode http 7层代理,客户端请求被深度分析后再发往服务器;
- 2.mode tcp 4层代理,不检查第7层信息
- 3.mode health 仅做健康状态检查,不做代理(不建议使用)
1)HAProxy基础
- 软件包:haproxy
- 主配置文件:/etc/haproxy/haproxy.cfg
2)管理服务
- 启动服务:systemctl start haproxy
- 停止服务:systemctl stop haproxy
- 查看状态:systemctl status haproxy
**3)haproxy的配置文件由两部分组成:**全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen;
① 全局配置段"global"用于设定全局配置参数,列举部分参数:
A)进程管理及安全相关的参数:
- chroot:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升-haproxy的安全级别;
- daemon:让haproxy以守护进程的方式工作于后台;
- pidfile:haproxy的pid存放路径;
- user:haproxy的用户;
- group:haproxy的组;
B)性能调整相关的参数:
- maxconn:设定每个haproxy进程所接受的最大并发连接数;
- retries:连接失败就认为服务不可用
② proxy代理相关配置段:"defaults"、"listen"、"frontend"和"backend"
- "defaults"段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个"defaults"所重新设定。
- "frontend"段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
- "backend"段用于定义一系列"后端"服务器,代理将会将对应客户端的请求转发至这些服务器。
- "listen"段通过关联"frontend"和"backend"定义了一个完整的代理,通常只对TCP流量有用。
案例:配置HAProxy负载平衡集群
案例要求:
- 1)客户端访问HAProxy,HAProxy分发请求到后端Real Server
- 2)开启HAProxy监控页面,及时查看调度器状态
- 3)设置HAProxy为开机启动服务
主机地址分配:
实验网络拓扑:
补充:Hapoxy是代理服务器(与Nginx原理相同),不需要给后端真实服务器配置网关;
步骤1:网络环境准备
1)配置Web服务器网络环境(web1、web2操作)
bash
[root@web1 ~]# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.2.100/24 connection.autoconnect yes
[root@web1 ~]# nmcli connection up eth1
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "192.168.2.100" > /var/www/html/index.html
[root@web1 ~]# systemctl start httpd
[root@web2 ~]# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.2.200/24 connection.autoconnect yes
[root@web2 ~]# nmcli connection up eth1
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo "192.168.2.200" > /var/www/html/index.html
[root@web2 ~]# systemctl start httpd
2)配置proxy服务器网络环境(proxy操作)(注意:配置2张网卡)
bash
[root@proxy ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.5/24 connection.autoconnect yes
[root@proxy ~]# nmcli connection up eth0
[root@proxy ~]# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.2.5/24 connection.autoconnect yes
[root@proxy ~]# nmcli connection up eth1
步骤2:部署HAProxy服务器
1)安装HAProyx软件包
bash
[root@proxy ~]# yum -y install haproxy
[root@proxy ~]# id haproxy
uid=188(haproxy) gid=188(haproxy) 组=188(haproxy)
2)修改配置文件
bash
[root@proxy ~]# vim /etc/haproxy/haproxy.cfg
global //全局配置(默认即可,不用修改)
log 127.0.0.1 local2 //错误日志([err warning info debug])
pidfile /var/run/haproxy.pid //haproxy的pid存放路径
user haproxy
group haproxy
daemon //让haproxy以守护进程的方式工作于后台
defaults //defaults段为所有其它配置段提供默认参数
mode http //默认的模式mode { tcp|http|health }
option dontlognull //不记录健康检查的日志信息
option httpclose //每次请求完毕后主动关闭http通道
option httplog //日志类别http日志格式
option redispatch //当某个服务器挂掉后强制定向到其他健康服务器
timeout client 300000 //客户端连接超时,默认毫秒,也可以加时间单位
timeout server 300000 //服务器连接超时
maxconn 3000 //最大连接数
retries 3 //3次连接失败就认为服务不可用,也可以通过后面设置
...
listen websrv 0.0.0.0:80 //listen端定义集群(集群名任意)
balance roundrobin //调度算法默认轮询(可不写)
server web1 192.168.2.100:80 check inter 2000 rise 2 fall 5
server web2 192.168.2.200:80 check inter 2000 rise 2 fall 5
listen stats *:1080 //监听端口(1080端口可任意)
stats refresh 30s //统计状态页面数据自动刷新时间
stats uri /status // 统计页面url(status为网页状态页面)
stats realm Haproxy Manager //进入的是HAProxy管理界面查看状态信息
stats auth admin:admin //统计页面用户名和密码设置
解释说明:
listen段:定义集群(集群名称可任意),0.0.0.0代表所有主机,端口为80,同【*:80】
- 补充:通过关联"frontend"和"backend"定义了一个完整的代理
balance:指定调度算法为轮询(不能用简写rr)
server:指定后端真实服务器,web1和web2的名称可以任意
check:代表健康检查,inter设定健康检查的时间间隔(/ms),rise定义成功次数(检查2次都正常,服务才正常),fall定义失败次数(检查5次都失败,服务为失败)
3)启动服务器并设置开机启动(Haproxy服务占用80端口)
bash
[root@proxy ~]# systemctl restart haproxy.service
[root@proxy ~]# systemctl enable haproxy.service
[root@proxy ~]# ss -anptul | grep :80 //Haproxy服务占用80端口
tcp LISTEN 0 128 *:80 *:* users:(("haproxy",pid=1153,fd=7))
步骤3:客户端验证
① 使用浏览器访问http://192.168.4.5,测试Haproxy代理是否正常工作及轮询效果
bash
[root@client ~]# curl 192.168.4.5
192.168.2.100
[root@client ~]# curl 192.168.4.5
192.168.2.200
[root@client ~]# curl 192.168.4.5
192.168.2.100
[root@client ~]# curl 192.168.4.5
192.168.2.200
② 尝试将web1服务器的httpd服务设置为stop状态,查看健康检查效果;
bash
[root@client ~]# curl 192.168.4.5
192.168.2.200
[root@client ~]# curl 192.168.4.5
192.168.2.200
③ 客户端访问http://192.168.4.5:1080/status测试状态监控页面是否正常。访问状态监控页的内容;账号密码为:admin admin
状态监控页面如图所示:
模拟压力测试:
bash
[root@client ~]# yum -y install httpd-tools
[root@client ~]# ab -c 100 -n 100 http://192.168.4.5/
...
Percentage of the requests served within a certain time (ms)
50% 17
66% 17
75% 17
80% 17
90% 17
95% 17
98% 17
99% 17
100% 17 (longest request)
解释说明:
- Queue队列数据的信息(Cur当前队列数量,Max最大值,Limit队列限制数量);
- Session rate每秒会话率(Cur当前值,Max最大值,Limit限制数量);
- Sessions总会话量(Cur当前值,Max最大值,Limit总量,Lbtot: total number of times a server was selected选中一台服务器所用的总时间);
- Bytes(In入站、Out出站流量);
- Denied(Req拒绝请求、Resp拒绝回应);
- Errors(Req错误请求、Conn错误连接、Resp错误回应);
- Warnings(Retr重新尝试警告retry、Redis重新连接redispatches);
- Server(Status状态(红色、黄色、绿色)、LastChk最后检查的时间(多久前执行的最后一次检查)、Wght权重、Act备份服务器数量、down机服务器数量、down机时长)。
**常见报错:**没有可用于处理此请求的服务器
bash
[root@client ~]# curl 192.168.4.5
<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>
思路分析:
- 1.服务器与调度器之间的网络不通,调度器无法到后端服务器获取数据;
- 2.web服务器的httpd服务未开启;
- 3.Haproxy的配置文件中,定义集群的后端服务器地址有问题;
**常见报错:**没有到主机的路由
bash
[root@client ~]# curl 192.168.4.5
curl: (7) Failed connect to 192.168.4.5:80; 没有到主机的路由
思路分析:排查客户端与服务器之间的网络通信
**常见报错:**在同一个服务器上安装并启动了httpd或nginx服务,导致80端口被占用
思路分析:排查是否80端口被占用
三、集群调度软件对比
1)Nginx分析
- 优点:
- ① 工作在7层,可针对http做分流策略;
- ② 1.9版本开始支持4层代理;
- ③ 正则表达式比HAProxy更出色;
- ④ 安装、配置、测试简单,可通过日志可以解决多数问题;
- ⑤ 并发量可达到理论值5万次;
- ⑥ Nginx可作为WEB服务器使用;
- 缺点:
- ① 7层代理仅支持http、https、mail协议,应用面小;
- ② 监控检查仅通过端口,无法对具体页面内容使用URL检查(网页服务状态)
2)LVS分析
- 优点:
- ① 负载能力强,工作在4层,对内存、CPU消耗低;
- ② 配置性低,没有太多可配置性,减少人为错误;
- ③ 工作在4层,应用面广,几乎可以为所有应用提供负载均衡;
- 缺点:
- ① 配置性低,相对的功能就会少;
- ② 不支持健康检查(通过keepalived+LVS弥补)
- ③ 不支持正则表达式,不能实现动静分离;
- ④ 如果网站架构庞大,LVS-DR配置比较繁琐;
3)HAProxy分析
- 优点:
- ① 支持session、cookie功能;
- ② 可以通过URL进行健康健康;
- ③ 效率、负载均衡速度,高于Nginx,低于LVS;
- ④ HAProxy支持TCP,可以对MySQL进行负载均衡;
- ⑤ 调度算法丰富;
- 缺点:
- ① 正则表达式弱于Nginx
- ② 本身不带日志,日志需要依赖于syslogd
思维导图:
小结:
本篇章节为**【第二阶段】CLUSTER-DAY2**的学习笔记,这篇笔记可以初步了解到 Keepalived基础、Keepalived+LVS 实现高可用和负载均衡、HAproxy、集群调度软件对比。除此之外推荐参考相关学习网址:
- Keepalived + Nginx 实现高可用 Web 负载均衡_nginx应用高可用-CSDN博客
- https://www.cnblogs.com/losbyday/p/5841830.html
- http://www.ttlsa.com/linux/haproxy-study-tutorial/
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解