Haproxy

一、Haproxy简介

  • 1.haproxy是法国人Willy Tarreau开发的一款可应对客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡器。由于其丰富强大的功能在国内备受推崇,是目前主流的负载均衡器。Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备、虚拟主机、基于TCP和HTTP应用代理等功能。其配置简单,而且拥有很好的对服务器节点的健康检查功能(相当于keepalived 健康检查),当其代理的后端服务器出现故障时,Haproxy会自动的将该故障服务器摘除,当服务器的故障恢复后haproxy还会自动重新添加回服务器主机。
  • 2、Haproxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么必须对其进行优化以使每个CPU时间片(Cycle)做更多的工作。
  • 3、HAProxy提供高可用、负载均衡以及基于TCP(第四层)和HTTP(第七层)的应用的代理,支持虚拟主机,他是免费、快速并且可靠的一种解决方案。Haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进当前架构中,同时可以保护web服务器不被暴露到网络上。
  • 4、Haproxy软件引入了frontend,backend的功能,frontend(acl规则匹配)可以根据任意HTTP请求头做规则匹配,然后把请求定向到相关的backend(server pools等待前端把请求转过来的服务器组)。通过frontend和backend,可以很容易的实现Haproxy的7层负载均衡代理功能。
  • 5、HAProxy是一种高效、可靠、免费的高可用及负载均衡解决方案,非常适合于高负载站点的七层数据请求。客户端通过HAProxy代理服务器获得站点页面,而代理服务器收到客户请求后根据负载均衡的规则将请求数据转发给后端真实服务器。同一客户端访问服务器,HAProxy保持会话的三种方案:
    • (1)HAProxy将客户端IP进行Hash计算并保存,由此确保相同IP来访问时被转发到同一台真实服务器上。
    • (2)HAProxy依靠真实服务器发送给客户端的cookie信息进行会话保持。
    • (3)HAProxy保存真实服务器的session及服务器标识,实现会话保持功能

haproxy官方帮助文档
haproxy源码包下载地址

二、负载均衡

  • 二层负载均衡(mac)
    用于虚拟mac地址方式,外部对虚拟mac地址请求,负载均衡接收后分配给后端实际的mac地址响应。
  • 三层负载均衡(ip)
    一般用于虚拟ip地址的方式,外部对虚拟ip地址请求,负载均衡接收后分配给后端实际的ip地址响应。
  • 四层负载均衡(tcp)
    在三层负载均衡的基础上,用ip+port接收请求,在转发到对应的机器上。
    产品大概有:F5,lvs,nginx,haproxy…
  • 七层负载均衡(http)
    根据虚拟的url或者ip,主机名接收请求,在转发到相应的处理服务器上。
    产品大概有:haproxy,nginx,apache,mysql proxy…

三、Haproxy的配置文件

haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen

  • global: 全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关。
  • default: 配置默认参数,这些参数可以被用到frontend,backend,Listen组件。
  • frontend:接收请求的前端虚拟节点,frontend可以指定具体使用后端的backend。
  • backend : 后端服务集群的配置,真实服务器,一个backend对应一个或者多个实体服务器。
  • listen: fronted和backend的组合体,比如haproxy实例状态监控部分配置。Haproxy1.3之前的唯一配置方式。

时间格式

一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀

  • us: 微秒(microseconds),即1/1000000秒;
  • ms: 毫秒(milliseconds),即1/1000秒;
  • s: 秒(seconds);
  • m: 分钟(minutes);
  • h:小时(hours);
  • d: 天(days);

全局global配置

global
    log 127.0.0.1 local0  info		//定义haproxy日志输出设置
    log loghost local0 info		//定义haproxy日志级别
    maxconn 20480			//定义最大连接数
    chroot /usr/local/haproxy		//chroot运行路径
    pidfile /var/run/haproxy.pid	//haproxy进程PID文件   
    user haproxy			//运行haproxy用户,可用uid代替
    group haproxy			//运行haproxy用户组,可用gid代替
    daemon				//以后台形式运行haproxy
级别代码描述
energ0系统不可用
alert1必须马上采取行动的事件
crit2关键的事件
err3错误事件
warning4警告事件
notice5普通但重要的事件
info6有用的信息
debug7调试信息

配置日志信息

[root@wangxuanhui ~]# vim /etc/rsyslog.conf 
local0.*        /var/log/haproxy.log
[root@wangxuanhui ~]# systemctl restart rsyslog.service 

defaults配置

  • 用于设置配置默认参数,这些参数可以被用到frontend,backend,listen组件。
    在此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中。如果某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参数,defaults部分参数对应的值自动被覆盖。
  • mode http:设置haproxy的运行模式,有三种{http|tcp|health}。注意:如果haproxy中还要使用4层的应用(mode tcp)的话,不建议在此定义haproxy的运行模式。
    • tcp模式:在此模式下,客户端和服务器端之前将建立一个全双工的连接,不会对七层报文做任何检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。
    • http模式:在此模式下,客户端请求在转发至后端服务器之前将会被深度分板,所有不与RFC格式兼容的请求都会被拒绝。
    • health:已基本不用了。
defaults
    mode http		//所处理的类别(7层代理http,4层代理tcp)
    log global		//引入global定义的日志格式
    option dontlognull	//不记录健康检查日志信息
    option httpclose	//每次请求完毕后主动关闭http通道,haproxy不支持keep-alive模式
    option httplog	//日志类别为http日志格式
    option forwardfor	//如果后端服务器需要获取客户端的真是ip,需要配置的参数,可以从http header中获取客户端的ip
    option redispatch
    balance roundrobin	//设置默认负载均衡方式,轮询方式
    timeout connect 10s	//默认连接超时时间
    timeout client 10s	//默认客户端超时时间
    timeout server 10s	//默认服务器超时时间
    timeout check 10s	//设置超时检查超时时间 
    maxconn 60000	//最大连接数
    retries 3		//3次连接失败就认为服务器不可用,也可以通过后面设置

frontend配置

  • frontend是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。forntend可以根据ACL规则直接指定要使用的后端backend。
    如:
frontend http_80_in 
bind 0.0.0.0:80   //设置侦听端口,即haproxy提供的web服务端口,和lvs的vip类似
mode http	
log  global   
    option httpclose  
    option httplog  
option forwardfor
default_backend  wwwpool  //设置请求默认转发的后端服务池

backend配置

用来定义后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器

backend  wwwpool    //定义wwwpool服务器组
mode  http
option  redispath
option  abortonclose
balancer  source   //负载均衡的方式,源哈希算法
cookie  SERVERID  //允许插入serverid到cookie中,serverid后面可以定义
option  httpdchk  GET  /test.html    //心跳测试
server  web1  10.1.1.2:80  cookie  2 weight  3  check  inter 2000  rise 2 fall 3 maconn 8

listen配置

常常用于状态页面监控,以及后端server检查,是Fronted和backend的组合体。

listen admin_stats	//frontend和backend的组合体,监控组的名称,按需自定义名称
    bind 0.0.0.0:8189	//侦听端口
    stats enable	//开启监控
    mode http
    log global
    stats uri /haproxy_stats    //监控页面的url访问路径
    stats realm Haproxy\ Statistics  //监控页面的提示信息
    stats auth admin:admin  //监控页面的用户和密码
    #stats hide-version   //隐藏统计页面上的haproxy版本信息
    stats admin if TRUE  //手工启用/禁用,后端服务器haproxy
    stats refresh 30s   //每个30秒自动刷新监控页面

四、Haproxy搭建http负载均衡

环境说明:

主机名ip地址需要安装应用系统版本
localhost(负载均衡服务器)192.168.48.137haproxycentos8
RS1(web服务器)192.168.48.138httpdcentos8
RS2(web服务器)192.168.48.141httpdcentos8
client(客户端)192.168.48. 134无需安装应用centos8

R1配置

//关闭selinux和防火墙
[root@RS1 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS1 ~]# setenforce 0
[root@RS1 ~]# systemctl disable --now firewalld.service 
 
//部署web站点
[root@RS1 ~]# dnf -y install httpd
[root@RS1 ~]# echo "RS1" > /var/www/html/index.html
[root@RS1 ~]# systemctl enable --now httpd

R2配置

//关闭selinux和防火墙
[root@RS2 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@RS2 ~]# setenforce 0
[root@RS2 ~]# systemctl disable --now firewalld.service 
 
//部署web站点
[root@RS2 ~]# dnf -y install httpd
[root@RS2 ~]# echo "RS2" > /var/www/html/index.html
[root@RS2 ~]# systemctl enable --now httpd
 

负载均衡服务器配置

//关闭selinux和防火墙
[root@wangxuanhui ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@wangxuanhui ~]# setenforce 0
[root@wangxuanhui ~]# systemctl disable --now firewalld.service 
 
//创建用户
[root@wangxuanhui ~]# useradd -rMs /sbin/nologin haproxy
 
//下载依赖包
[root@wangxuanhui ~]# dnf -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel
 
//下载haproxy压缩包
[root@wangxuanhui ~]# wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-2.6.0.tar.gz/sha512/7bb70bfb5606bbdac61d712bc510c5e8d5a5126ed8827d699b14a2f4562b3bd57f8f21344d955041cee0812c661350cca8082078afe2f277ff1399e461ddb7bb/haproxy-2.6.0.tar.gz
 
//解压并安装
[root@wangxuanhui ~]# tar -xf haproxy-2.6.0.tar.gz 
[root@wangxuanhui ~]# cd haproxy-2.6.0/
[root@wangxuanhui haproxy-2.6.0]# make -j $(grep 'processor' /proc/cpuinfo |wc -l)  \
> TARGET=linux-glibc  \
> USE_OPENSSL=1  \
> USE_ZLIB=1  \
> USE_PCRE=1  \
> USE_SYSTEMD=1
 
[root@wangxuanhui haproxy-2.6.0]# make install PREFIX=/usr/local/haproxy
 
//复制命令到/usr/sbin目录下
[root@wangxuanhui haproxy-2.6.0]# ls
addons     CONTRIBUTING  haproxy  MAINTAINERS  scripts  VERDATE
admin      dev           include  Makefile     src      VERSION
BRANCHES   doc           INSTALL  README       SUBVERS
CHANGELOG  examples      LICENSE  reg-tests    tests
[root@wangxuanhui haproxy-2.6.0]# cp haproxy /usr/sbin/
[root@wangxuanhui haproxy-2.6.0]# cd
 
//修改内核参数
[root@wangxuanhui ~]# vim /etc/sysctl.conf 
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
 
[root@wangxuanhui ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
 
//修改配置文件
[root@wangxuanhui ~]# mkdir /etc/haproxy
[root@wangxuanhui ~]# vim /etc/haproxy/haproxy.cfg
global
    daemon
    maxconn 256
 
defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
 
frontend http-in
    bind *:80
    default_backend servers
 
backend servers
    server web01 192.168.202.138:80
    server web02 192.168.202.141:80
 
//编写service文件
[root@wangxuanhui ~]# vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
 
[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg   -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg  -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
 
[Install]
WantedBy=multi-user.target
 
[root@wangxuanhui ~]# systemctl daemon-reload 
[root@wangxuanhui ~]# systemctl enable --now haproxy.service 
 
[root@wangxuanhui ~]# ss -anlt
State               Recv-Q              Send-Q                           Local Address:Port                           Peer Address:Port              Process              
LISTEN              0                   128                                    0.0.0.0:80                                  0.0.0.0:*                                      
LISTEN              0                   128                                    0.0.0.0:22                                  0.0.0.0:*                                      
LISTEN              0                   128                                       [::]:22                                     [::]:*       

客户端进行访问

[root@client ~]# curl 192.168.202.137
RS1
[root@client ~]# curl 192.168.202.137
RS2
[root@client ~]# curl 192.168.202.137
RS1
[root@client ~]# curl 192.168.202.137
RS2

使用WEB网页访问测试

[root@dnp ~]# vim /etc/haproxy/haproxy.cfg 
global
    log 127.0.0.1 local0  info
    maxconn 20480
    pidfile /var/run/haproxy.pid
    user haproxy
    group haproxy
    daemon
 
defaults
    mode http
    log global
    option dontlognull
    option httpclose
    option httplog
    option redispatch
    balance roundrobin
    timeout connect 10s
    timeout client 10s
    timeout server 10s
    timeout check 10s
    maxconn 60000
    retries 3
#--------------统计页面配置------------------
listen admin_stats
    bind 0.0.0.0:8189
    stats enable
    mode http
    log global
    stats uri /admin        //访问网页后缀URL
    stats realm Haproxy\ Statistics
    stats auth dnp:123456              //用户名和密码
    stats admin if TRUE
    stats refresh 30s
#---------------web设置-----------------------
listen webcluster
    bind 0.0.0.0:80
    mode http
    log global
    maxconn 3000
    balance roundrobin
    cookie SESSION_COOKIE insert indirect nocache
    server web01 192.168.202.138:80
    server web02 192.168.202.141:80
    
[root@dnp ~]# vim /etc/rsyslog.conf 
local0.*        /var/log/haproxy.log
[root@dnp ~]# systemctl restart rsyslog.service 
[root@dnp ~]# systemctl restart haproxy.service 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值