keepalived 高可用实战
keepalived 高可用实战1、Keepalived相关概念1.1 介绍1.2 keepalived工作原理1.3 VRRP协议介绍1.4 keepalived 的 相关模块1.5 脑裂介绍1.6 脑裂的解决方法2、Nginx+keepalived实现七层的负载均衡(同类服务)upstream 支持的负载均衡算法3、LVS_Director + KeepAlivedzHaproxy 基础1、Haproxy介绍2、Haproxy 实现七层负载3、Haproxy 实现四层负载均衡(了解)
1、Keepalived相关概念
1.1 介绍
Keepalived是一种用于实现高可用性(High Availability)的软件,主要通过VRRP(Virtual Router Redundancy Protocol)协议来实现IP地址的热备份。它可以在两台或多台服务器之间进行故障切换,确保当一台服务器出现故障时,其他服务器能够接管其服务,从而提高系统的可用性和稳定性。
1.2 keepalived工作原理
Keepalived的工作原理主要基于VRRP(Virtual Router Redundancy Protocol)协议,通过以下方式确保高可用性:
-
角色分配:在Keepalived配置的集群中,节点被指定为Master或Backup角色。Master节点负责处理所有客户端请求,而Backup节点则处于待命状态,准备在必要时接管服务。
-
健康检查:Keepalived能够执行健康检查,这包括使用ICMP协议发送数据包来检测节点是否存活(类似于ping命令)。如果一个节点没有响应,Keepalived会认为该节点故障,并采取相应的措施。
-
故障切换:当Master节点发生故障时,Backup节点会根据预设的规则和优先级选举出一个新的Master节点,接管虚拟IP地址(VIP),继续提供服务。
-
VRRP协议:Keepalived利用VRRP协议实现网络层的高可用性。VRRP允许多个路由器组成一个组,其中有一个作为Master,其他作为Backup。Master负责响应和处理网络流量,如果Master失败,Backup中的一个将根据优先级被选举为新的Master。
1.3 VRRP协议介绍
VRRP(Virtual Router Redundancy Protocol)即虚拟路由冗余协议,是一种网络协议,主要目的是提高网络的可靠性和稳定性。以下是VRRP协议的主要内容:
-
工作原理:VRRP允许多台路由器共同组成一个群组,其中一台作为主路由器(Master)负责响应和处理网络流量,而其他路由器则作为备份路由器(Backup)。如果主路由器出现故障,备份路由器能够迅速接管其角色,继续提供服务,从而保证网络通信不中断。
-
优点:VRRP能够简化网络管理,因为在发生故障时,不需要修改动态路由协议或路由发现协议的配置信息,也无需更改主机的默认网关设置。它通过封装在IP报文中的VRRP通告报文来实现状态的传递和故障切换,这样网络开销较小。此外,VRRP具有强大的适应性,支持各种上层协议。
-
关键概念:在VRRP中,有两组关键的概念,即VRRP路由器(包括主控路由器和备份路由器)和虚拟路由器。主控路由器负责发送VRRP通告报文,进行心跳检测。以表明其活动状态。如果主控路由器停止发送这些报文(如因故障),备份路由器将提升为新的主控路由器,确保数据稳定高效地转发。
1.4 keepalived 的 相关模块
-
Core模块:这是Keepalived的核心模块,负责主进程的启动和维护,以及全局配置文件的加载和解析。它是Keepalived工作的基础,确保其他模块能够正常运行。
-
Check模块:这个模块负责健康检查,包括多种检查方式,如Layer3、Layer4和Layer7的检测,分别工作在IP/TCP协议栈的IP层、TCP层和应用层。通过这些层次的检查,Keepalived能够全面监控服务器的运行状态,并在检测到故障时进行隔离。
-
VRRP模块:实现VRRP(Virtual Router Redundancy Protocol)协议的功能,是高可用性集群中实现故障转移的关键。结合LVS负载均衡软件,Keepalived可以部署高性能的负载均衡集群。
1.5 脑裂介绍
"脑裂"是一个网络术语,指的是在高可用性集群中,由于网络通信故障或配置不当,导致两个节点同时认为自己是主节点的情况。这种情况会引起服务的中断或不稳定。Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,就是脑裂。
1.6 脑裂的解决方法
-
添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少"裂脑"发生机会。(治标不治本,只是提高了检测到的概率);
-
做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失;
-
爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信;
-
引入仲裁机制:如果集群中存在多个主备节点,可以引入仲裁机制来解决脑裂问题。仲裁机制可以由一个独立的节点或服务来判断哪个节点是主节点,从而避免两个节点同时认为自己是主节点的情况。
2、Nginx+keepalived实现七层的负载均衡(同类服务)
Nginx通过Upstream模块实现负载均衡
upstream 支持的负载均衡算法
轮询(默认):可以通过weight指定轮询的权重,权重越大,被调度的次数越多 ip_hash:可以实现会话保持,将同一客户的IP调度到同一样后端服务器,可以解决session的问题,不能使用weight fair:可以根据请求页面的大小和加载时间长短进行调度,使用第三方的upstream_fair模块 url_hash:按请求的url的hash进行调度,从而使每个url定向到同一服务器,使用第三方的url_hash模块
环境准备
192.168.174.45 ha-server 192.168.174.46 ha-backup 192.168.174.20 real-server01 192.168.174.21 real-server02
real serve配置
# 两台 real server主机关闭防火墙和selinux [root@real-server ~]# systemctl disable --now firewalld [root@real-server ~]# setenforce 0 # 两台 real server 安装web服务,模拟真实提供服务主机 [root@real-server ~]# vim /etc/yum.repos.d/nginx.repo [root@real-server ~]# yum makecache fast [root@real-server ~]# yum install nginx -y # real server01 网站界面配置 [root@real-server01 ~]# echo "read server01" > /usr/share/nginx/html/index.html # 启动nginx [root@real-server01 ~]# systemctl enable --now nginx # 测试是否正常访问 [root@real-server01 ~]# curl 192.168.174.20 real server01 # real server02 网站界面配置 [root@real-server02 ~]# echo "read server02" > /usr/share/nginx/html/index.html # 启动nginx [root@real-server02 ~]# systemctl enable --now nginx # 测试是否正常访问 [root@real-server02 ~]# curl 192.168.174.21 real server02
调度到不同组后端服务器 网站分区进行调度 ================================================================================= 拓扑结构 [vip: 20.20.20.20] [LB1 Nginx] [LB2 Nginx] 192.168.1.2 192.168.1.3 [index] [milis] [videos] [images] [news] 1.11 1.21 1.31 1.41 1.51 1.12 1.22 1.32 1.42 1.52 1.13 1.23 1.33 1.43 1.53 ... ... ... ... ... /web /web/milis /web/videos /web/images /web/news index.html index.html index.html index.html index.html 一、实施过程 1、选择两台nginx服务器作为代理服务器。 2、给两台代理服务器安装keepalived制作高可用集群,生成VIP 3、配置nginx的负载均衡 以上两台nginx服务器配置文件一致 根据站点分区进行调度 配置upstream文件 # 两台负载均衡设备关闭防火墙selinux [root@ha ~]# systemctl disable --now firewalld && setenforce 0 # 两台负载均衡设备安装nginx作为负载均衡均衡器 [root@ha ~]# vim /etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 [root@ha ~]# yum makecache fast [root@ha ~]# yum install -y nginx # ha-master配置 [root@ha-master ~]# cd /etc/nginx/conf.d # 备份原有的nginx配置文件 [root@ha-master conf.d]# mv default.conf default.conf.bak # 配置负载均衡 [root@ha-master conf.d]# vim upstream.conf upstream index { server 192.168.174.20:80; server 192.168.174.21:80; } [root@ha-master conf.d]# vim proxy.conf server { listen 80; server_name localhost; access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://index; proxy_redirect default; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } # 将nginx的配置文件拷贝到另一台代理服务器中: [root@ha-master conf.d]# scp proxy.conf 192.168.174.46:/etc/nginx/conf.d/ [root@ha-master conf.d]# scp upstream.conf 192.168.174.46:/etc/nginx/conf.d/ # 两台负载均衡主机测试nginx配置语法是否有问题 [root@ha conf.d]# nginx -t # 两台负载均衡主机启动nginx负载均衡服务 [root@ha conf.d]# systemctl enable --now nginx # 两台负载均衡主机测试用户请求是否正常转发 略 二、Keepalived实现调度器HA # 注:主/备调度器均能够实现正常调度 # 主/备调度器安装软件 [root@ha-master ~]# yum install -y keepalived [root@ha-backup ~]# yum install -y keepalived # ha-master节点keepalived配置 [root@ha-master ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@ha-master ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { # 定义了全局参数 router_id directory1 #设置路由器的ID,可自定义。辅助改为directory2 } vrrp_instance VI_1 { # 定义一个VRRP实例,名为 VI_1,可自定义,但backup定义时需和master一致 state MASTER # 定义主还是备 interface ens33 # VIP绑定网卡地址,此处时ens33 virtual_router_id 80 # 定义了VRRP虚拟路由器的ID,整个集群的调度器应该使用这个一致的ID。此处为80 priority 100 #定义了节点的优先级。主节点的优先级通常比备用节点高。这里设置为100,如果是备用节点,通常会设置为较低的值。 advert_int 1 #心跳检测的时间间隔1s authentication { # 定义认证信息 auth_type PASS # 使用密码认证 auth_pass 1111 # 认证密码是 1111 } virtual_ipaddress { # 定义VIP地址 192.168.174.101/24 # 这是VIP地址和子网掩码 } } # ha-backup配置 [root@nginx-porxy-slave ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@nginx-proxy-slave ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory2 } vrrp_instance VI_1 { state BACKUP #设置为backup interface ens33 nopreempt #设置到back上面,不抢占资源(VIP) virtual_router_id 80 priority 50 #辅助改为50 advert_int 1 #检测间隔1s authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.174.101/24 } } # 启动KeepAlived(主备均启动) [root@ha-backup ~]# systemctl enable --now keepalived [root@ha-master ~]# systemctl enable --now keepalived [root@ha-master ~]# ip a | grep ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.174.45/24 brd 192.168.174.255 scope global noprefixroute ens33 inet 192.168.174.100/24 scope global secondary ens33 # 测试: 浏览器访问:http://192.168.174.100 如能正常访问,将keepalived主节点关机,测试vip是否漂移 # 到此: 可以解决心跳故障keepalived 不能解决Nginx服务故障,也就是心跳检测,确认的是keepalived主节点是否存活,而不是nginx服务是否正常运行 # 扩展对调度器Nginx健康检查两台都设置 思路: 让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived # 配置检测nginx健康检查脚本 [root@ha ~]# vim /etc/keepalived/check_nginx_status.sh #!/bin/bash /usr/bin/curl -I http://localhost &>/dev/null if [ $? -ne 0 ];then systemctl stop keepalived fi [root@ha ~]# chmod a+x /etc/keepalived/check_nginx_status.sh # keepalived添加配置 [root@ha ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory1 } vrrp_script check_nginx { script "/etc/keepalived/check_nginx_status.sh" interval 5 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.174.100/24 } track_script { check_nginx } } 注:必须先启动Nginx,再启动keepalived 测试访问: 将keepalived集群的主节点的Nginx服务关闭,查看vip是否漂移,如果漂移,即成功
3、LVS_Director + KeepAlivedz
LVS_Director + KeepAlived KeepAlived在该项目中的功能: 1. 管理IPVS的路由表(包括对RealServer做健康检查) 2. 实现调度器的HA(高可用) http://www.keepalived.org Keepalived所执行的外部脚本命令建议使用绝对路径 ================================================================================= 实施步骤: # 主/备调度器安装软件 [root@lvs-keepalived-master ~]# yum -y install ipvsadm keepalived [root@lvs-keepalived-backup ~]# yum -y install ipvsadm keepalived # lvs-Keepalived-master节点配置 [root@lvs-keepalived-master ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id lvs-keepalived-master #辅助改为lvs-backup } vrrp_instance VI_1 { state MASTER interface ens33 #VIP绑定接口 virtual_router_id 80 #VRID 同一组集群,主备一致 priority 100 #本节点优先级,辅助改为50 advert_int 1 #检查间隔,默认为1s authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.174.100/24 } } virtual_server 192.168.174.100 80 { #LVS配置 delay_loop 3 #启动3个进程 lb_algo rr #LVS调度算法 lb_kind DR #LVS集群模式(路由模式) nat_mask 255.255.255.0 protocol TCP #健康检查使用的协议 real_server 192.168.174.20 80 { weight 1 inhibit_on_failure #当该节点失败时,把权重设置为0,而不是从IPVS中删除 TCP_CHECK { #健康检查 connect_port 80 #检查的端口 connect_timeout 3 #连接超时的时间 } } real_server 192.168.174.21 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_timeout 3 connect_port 80 } } } # lvs-keepalived-backup节点配置 [root@lvs-keepalived-backup ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id lvs-keepalived-slave } vrrp_instance VI_1 { state BACKUP interface ens33 nopreempt #不抢占VIP virtual_router_id 80 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.174.100/24 } } virtual_server 192.168.174.100 80 { delay_loop 3 lb_algo rr lb_kind DR nat_mask 255.255.255.0 protocol TCP real_server 192.168.174.20 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_port 80 connect_timeout 3 } } real_server 192.168.174.21 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_timeout 3 connect_port 80 } } } # 启动Keepalived(主备均启动) [root@lvs-keepalived-master ~]# systemctl enable --now keepalived [root@lvs-keepalived-backup ~]# systemctl enable --now keepalived [root@lvs-keepalived-master ~]# 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.174.100:80 rr -> 192.168.174.20:80 Route 1 1 8 -> 192.168.174.21:80 Route 1 0 9 # 所有RS配置(nginx1,nginx2),配置好网站服务器,测试所有RS [root@real-server01 ~]# yum install -y nginx [root@real-server02 ~]# yum install -y nginx [root@real-server01 ~]# ip addr add dev lo 192.168.246.110/32 [root@real-server02 ~]# ip addr add dev lo 192.168.246.110/32 [root@real-server01 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播 [root@real-server01 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包 [root@real-server02 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播 [root@real-server02 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包 [root@real-server01 ~]# echo "web1..." >> /usr/share/nginx/html/index.html [root@real-server02 ~]# echo "web2..." >> /usr/share/nginx/html/index.html # 所有real-server节点启动nginx [root@real-server ~]# systemctl enable --now nginx LB集群测试 所有分发器和Real Server都正常 主分发器故障及恢复
###
vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.174.100/24 } } virtual_server 192.168.174.100 80 { delay_loop 3 lb_algo rr lb_kind DR nat_mask 255.255.255.0 protocol TCP real_server 192.168.174.20 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_port 80 connect_timeout 3 } } real_server 192.168.174.21 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_timeout 3 connect_port 80 } } }
Haproxy 基础
1、Haproxy介绍
HAProxy是一个高性能的开源负载均衡器和代理服务器,使用C语言编写,提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。其特别适用于负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy可以运行在当前的硬件上,支持数以万计的并发连接,并且能够很简单安全地整合进用户当前的架构中,同时保护web服务器不被暴露到网络上。
HAProxy的工作原理是,当客户端发起连接请求时,它将连接到HAProxy提供的IP地址和端口。HAProxy能够将传入的请求分发到多个后端服务器,并提供各种负载均衡算法,如轮询、加权轮询、最少连接等。同时,HAProxy具有高度可配置性和可定制性,适用于Web应用、数据库负载均衡、应用程序代理等场景,提供高可用性和可伸缩性。
软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。 负载均衡是通过OSI协议对应的 7层负载均衡:用的7层http协议, 4层负载均衡:用的是tcp协议加端口号做的负载均衡 ----------------------------------------------------------------------------------------- ha-proxy的特点 ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。 •支持tcp/http两种协议层的负载均衡,使得其负载均衡功能非常丰富。 •支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。 •性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。 •拥有一个功能出色的监控页面,实时了解系统的当前状况。 •功能强大的ACL支持,给用户极大的方便。 haproxy算法: 1.roundrobin 轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整. 2.static-rr 基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制 3.leastconn 新的连接请求被派发至具有最少连接数目的后端服务器.
2、Haproxy 实现七层负载
Keepalived + Haproxy ================================================================================= /etc/haproxy/haproxy.cfg global //关于进程的全局参数 log 127.0.0.1 local2 info #日志服务器 pidfile /var/run/haproxy.pid #pid文件 maxconn 4000 #最大连接数 user haproxy #用户 group haproxy #组 daemon #守护进程方式后台运行 nbproc 1 #工作进程数量 cpu内核是几就写几 defaults 段用于为其它配置段提供默认参数 listen是frontend和backend的结合体 frontend 虚拟服务VIrtual Server backend 真实服务器Real Server 调度器可以同时为多个站点调度,如果使用frontend、backend的方式: frontend1 backend1 frontend2 backend2 frontend3 backend3
Keepalived + Haproxy ================================================================================= 拓扑结构 [vip: 192.168.246.17] [LB1 Haproxy] [LB2 Haproxy] 192.168.246.169 192.168.246.161 [httpd] [httpd] 192.168.246.162 192.168.246.163 一、Haproxy实施步骤 1. 准备工作(集群中所有主机) [root@ha-proxy-master ~]# cat /etc/hosts 127.0.0.1 localhost 192.168.246.169 ha-proxy-master 192.168.246.161 ha-proxy-slave 192.168.246.162 test-nginx1 192.168.246.163 test-nginx2 2. RS配置 配置好网站服务器,测试所有RS,所有机器安装nginx [root@test-nginx1 ~]# yum install -y nginx [root@test-nginx1 ~]# systemctl start nginx [root@test-nginx1 ~]# echo "test-nginx1" >> /usr/share/nginx/html/index.html # 所有nginx服务器按顺序输入编号,方便区分。 3. 调度器配置Haproxy(主/备)都执行 [root@ha-proxy-master ~]# yum -y install haproxy [root@ha-proxy-master ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak} [root@ha-proxy-master ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg [root@ha-proxy-master ~]# vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 info pidfile /var/run/haproxy.pid maxconn 4000 #最大连接数 user haproxy group haproxy daemon #以后台形式运行ha-proxy nbproc 1 #工作进程数量 cpu内核是几就写几 defaults mode http #工作模式 http ,tcp 是 4 层,http是 7 层 log global retries 3 #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查 option redispatch #服务不可用后重定向到其他健康服务器。 maxconn 4000 # 最大连接数 contimeout 5000 #ha服务器与后端服务器连接超时时间,单位毫秒ms clitimeout 50000 #客户端超时 srvtimeout 50000 #后端服务器处理超时时间 listen stats bind *:81 stats enable stats uri /haproxy #使用浏览器访问 http://192.168.246.169:81/haproxy,可以看到服务器状态 stats auth qianfeng:123 #用户认证,客户端使用elinks浏览器的时候不生效 frontend web mode http bind *:80 #监听哪个ip和什么端口 option httplog #日志类别 http 日志格式 acl html url_reg -i \.html$ #1.访问控制列表名称html。规则要求访问以html结尾的url(可选) use_backend httpservers if html #2.如果满足acl html规则,则推送给后端服务器httpservers default_backend httpservers #默认使用的服务器组 backend httpservers #名字要与上面的名字必须一样 balance roundrobin #负载均衡的方式 server http1 192.168.246.162:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 server http2 192.168.246.163:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 # 参数解释: 192.168.246.163:80: 这是后端服务器的IP地址和端口号 maxconn 2000: 这表示该后端服务器最多可以处理2000个并发连接。如果尝试超过这个数量的连接,HAProxy可能会将请求路由到其他服务器(如果有的话)。 weight 1: 这定义了服务器的权重。权重决定了当负载均衡器选择服务器时,该服务器被选中的频率。 check: 这表示HAProxy将定期检查该服务器的健康状态。 inter 1s: 这定义了健康检查的间隔,这里是每秒检查一次。 rise 2: 这表示如果连续2次健康检查成功,则将该服务器标记为“健康”状态。 fall 2: 这表示如果连续2次健康检查失败,则将该服务器标记为“不健康”状态。 # 将配置文件拷贝到slave服务器 [root@ha-proxy-master ~]# scp /etc/haproxy/haproxy.cfg 192.168.246.161:/etc/haproxy/ 两台机器启动设置开机启动 [root@ha-proxy-master ~]# systemctl start haproxy [root@ha-proxy-master ~]# systemctl enable haproxy
4.测试主/备(浏览器访问)
主:
备:
页面主要参数解释 Queue Cur: current queued requests //当前的队列请求数量 Max:max queued requests //最大的队列请求数量 Limit: //队列限制数量 Errors Req:request errors //错误请求 Conn:connection errors //错误的连接 Server列表: Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态 LastChk: 持续检查后端服务器的时间 Wght: (weight) : 权重 ======================================================== 2.测试访问 通过访问haparoxy的ip地址访问到后端服务器 # curl http://192.168.246.169
如果出现bind失败的报错,执行下列命令 setsebool -P haproxy_connect_any=1
二、Keepalived实现调度器HA 注:主/备调度器均能够实现正常调度 1. 主/备调度器安装软件 [root@ha-proxy-master ~]# yum install -y keepalived [root@ha-proxy-slave ~]# yum install -y keepalived [root@ha-proxy-master ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@ha-proxy-master ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id director1 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.246.17/24 } } [root@ha-proxy-slave ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@ha-proxy-slave ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory2 } vrrp_instance VI_1 { state BACKUP interface ens33 nopreempt virtual_router_id 80 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.246.17/24 } } 3. 启动KeepAlived(主备均启动) [root@ha-proxy-master ~]# systemctl start keepalived [root@ha-proxy-master ~]# systemctl enable keepalived [root@ha-proxy-master ~]# ip a 4. 扩展对调度器Haproxy健康检查(可选) 思路:两台机器都做 让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived a. script [root@ha-proxy-master ~]# cat /etc/keepalived/check_haproxy_status.sh #!/bin/bash /usr/bin/curl -I http://localhost &>/dev/null if [ $? -ne 0 ];then # /etc/init.d/keepalived stop systemctl stop keepalived fi [root@ha-proxy-master ~]# chmod a+x /etc/keepalived/check_haproxy_status.sh b. keepalived使用script [root@ha-proxy-master keepalived]# cd /etc/keepalived/ [root@ha-proxy-master keepalived]# vim keepalived.conf ! Configuration File for keepalived global_defs { router_id director1 } vrrp_script check_haproxy { script "/etc/keepalived/check_haproxy_status.sh" interval 5 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.246.17/24 } track_script { check_haproxy } } [root@ha-proxy-slave keepalived]# vim keepalived.conf ! Configuration File for keepalived global_defs { router_id directory2 } vrrp_script check_haproxy { script "/etc/keepalived/check_haproxy_status.sh" interval 5 } vrrp_instance VI_1 { state BACKUP interface ens33 nopreempt virtual_router_id 80 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.246.17/24 } track_script { check_haproxy } } [root@ha-proxy-master keepalived]# systemctl restart keepalived [root@ha-proxy-slave keepalived]# systemctl restart keepalived 注:必须先启动haproxy,再启动keepalived 两台机器都配置haproxy的日志:需要打开注释并添加 [root@ha-proxy-master ~]# vim /etc/rsyslog.conf # Provides UDP syslog reception #由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听 $ModLoad imudp $UDPServerRun 514 找到 #### RULES #### 下面添加 local2.* /var/log/haproxy.log # 参数解释 $ModLoad imudp ModLoad:这是一个指令,用于加载指定的模块。 imudp:这是输入模块的名称,用于从 UDP 网络连接中接收日志消息。当你想要配置 rsyslog 或 syslog-ng 来监听 UDP 端口并接收日志时,你需要加载这个模块。 $UDPServerRun 514 $UDPServerRun:这是一个指令,用于配置 UDP 服务器并指定它应该监听的端口。 514:这是 UDP 端口号,也是传统上用于接收 syslog 消息的默认端口。这意味着 rsyslog 或 syslog-ng 将监听 UDP 的 514 端口以接收传入的日志消息。 [root@ha-proxy-master ~]# systemctl restart rsyslog [root@ha-proxy-master ~]# systemctl restart haproxy [root@ha-proxy-master ~]# tail -f /var/log/haproxy.log 2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56866 to 192.168.246.17:80 (web/HTTP) 2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56867 to 192.168.246.17:80 (web/HTTP) 2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56889 to 192.168.246.17:80 (stats/HTTP) 2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56890 to 192.168.246.17:80 (web/HTTP) 2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56895 to 192.168.246.17:80 (web/HTTP) 2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56896 to 192.168.246.17:80 (stats/HTTP)
3、Haproxy 实现四层负载均衡(了解)
# 两台real server安转mariadb mariadb-server [root@real-server ~]# yum install -y mariadb-server # 启动mariadb [root@real-server ~]# systemctl enable --now mariadb # 连接数据库 [root@real-server ~]# mysql -uroot -p MariaDB [(none)]> grant all privileges on *.* to root@'%' identified by '123456'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> exit; 两台haproxy配置文件: [root@ha-proxy-master ~]# cat /etc/haproxy/haproxy.cfg Haproxy L4 =================================================================================== global log 127.0.0.1 local2 pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon nbproc 1 defaults mode http log global option redispatch retries 3 maxconn 4000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen stats bind *:81 stats enable stats uri /haproxy stats auth qianfeng:123 frontend web mode http bind *:80 option httplog default_backend httpservers backend httpservers balance roundrobin server http1 192.168.246.162:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 server http2 192.168.246.163:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 # 添加已下字段 listen mysql bind *:3306 mode tcp balance roundrobin server mysql1 192.168.246.163:3306 weight 1 check inter 1s rise 2 fall 2 server mysql2 192.168.246.162:3306 weight 1 check inter 1s rise 2 fall 2
inter表示健康检查的间隔,单位为毫秒 可以用1s等,fall代表健康检查失败2回后放弃检查。rise代表连续健康检查成功2此后将认为服务器可用。默认的,haproxy认为服务时永远可用的,除非加上check让haproxy确认服务是否真的可用。
找一台机器做为客户端去测试,在测试的时候注意mysql的远程登录权限