负载均衡02

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)协议,通过以下方式确保高可用性:

  1. 角色分配:在Keepalived配置的集群中,节点被指定为Master或Backup角色。Master节点负责处理所有客户端请求,而Backup节点则处于待命状态,准备在必要时接管服务。

  2. 健康检查:Keepalived能够执行健康检查,这包括使用ICMP协议发送数据包来检测节点是否存活(类似于ping命令)。如果一个节点没有响应,Keepalived会认为该节点故障,并采取相应的措施。

  3. 故障切换:当Master节点发生故障时,Backup节点会根据预设的规则和优先级选举出一个新的Master节点,接管虚拟IP地址(VIP),继续提供服务。

  4. 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 的 相关模块

  1. Core模块:这是Keepalived的核心模块,负责主进程的启动和维护,以及全局配置文件的加载和解析。它是Keepalived工作的基础,确保其他模块能够正常运行。

  2. Check模块:这个模块负责健康检查,包括多种检查方式,如Layer3、Layer4和Layer7的检测,分别工作在IP/TCP协议栈的IP层、TCP层和应用层。通过这些层次的检查,Keepalived能够全面监控服务器的运行状态,并在检测到故障时进行隔离。

  3. VRRP模块:实现VRRP(Virtual Router Redundancy Protocol)协议的功能,是高可用性集群中实现故障转移的关键。结合LVS负载均衡软件,Keepalived可以部署高性能的负载均衡集群。

1.5 脑裂介绍

"脑裂"是一个网络术语,指的是在高可用性集群中,由于网络通信故障或配置不当,导致两个节点同时认为自己是主节点的情况。这种情况会引起服务的中断或不稳定。Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,就是脑裂。

1.6 脑裂的解决方法

  1. 添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少"裂脑"发生机会。(治标不治本,只是提高了检测到的概率);

  2. 做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失;

  3. 爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信;

  4. 引入仲裁机制:如果集群中存在多个主备节点,可以引入仲裁机制来解决脑裂问题。仲裁机制可以由一个独立的节点或服务来判断哪个节点是主节点,从而避免两个节点同时认为自己是主节点的情况。

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

1568643540153

 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的远程登录权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值