Administrator
Administrator
发布于 2024-08-28 / 4 阅读
0
0

haproxy

haproxy简介

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性负载均衡,以及基于TCPHTTP的应用程序代理

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。 负载均衡是通过OSI协议对应的 7层负载均衡:用的7层http协议, 4层负载均衡:用的是tcp协议加端口号做的负载均衡

HaProxy的核心功能
# 负载均衡:L4和L7两种模式,支持RR/静态RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash等丰富的负载均衡算法
​
# 健康检查:支持TCP和HTTP两种健康检查模式
​
# 会话保持:对于未实现会话共享的应用集群,可通过Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种Hash方式实现会话保持
​
# SSL:HAProxy可以解析HTTPS协议,并能够将请求解密为HTTP后向后端传输
​
# HTTP请求重写与重定向
​
# 监控与统计:HAProxy提供了基于Web的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控HAProxy的状态

HaProxy的关键特性

性能

1 . 采用单线程、事件驱动、非阻塞模型,减少上下文切换的消耗,能在1ms内处理数百个请求。并且每个会话只占用数KB的内存。

2 . 大量精细的性能优化,如O(1)复杂度的事件检查器、延迟更新技术、Single-buffereing、Zero-copy forwarding等等,这些技术使得HAProxy在中等负载下只占用极低的CPU资源。

3 . HAProxy大量利用操作系统本身的功能特性,使得其在处理请求时能发挥极高的性能,通常情况下,HAProxy自身只占用15%的处理时间,剩余的85%都是在系统内核层完成的。

4 . HAProxy作者在8年前(2009)年使用1.4版本进行了一次测试,单个HAProxy进程的处理能力突破了10万请求/秒,并轻松占满了10Gbps的网络带宽。

稳定性

作为建议以单进程模式运行的程序,HAProxy对稳定性的要求是十分严苛的。按照作者的说法,HAProxy在13年间从未出现过一个会导致其崩溃的BUG,HAProxy一旦成功启动,除非操作系统或硬件故障,否则就不会崩溃(我觉得可能多少还是有夸大的成分)。 在上文中提到过,HAProxy的大部分工作都是在操作系统内核完成的,所以HAProxy的稳定性主要依赖于操作系统,作者建议使用2.6或3.x的Linux内核,对sysctls参数进行精细的优化,并且确保主机有足够的内存。这样HAProxy就能够持续满负载稳定运行数年之久。

个人建议

1 . 使用3.x内核的Linux操作系统运行HAProxy

2 . 运行HAProxy的主机上不要部署其他的应用,确保HAProxy独占资源,同时避免其他应用引发操作系统或主机的故障

3 . 至少为HAProxy配备一台备机,以应对主机硬件故障、断电等突发情况(搭建双活HAProxy的方法在后文中有描述)

4 . sysctl的建议配置(并不是万用配置,仍然需要针对具体情况进行更精细的调整,但可以作为首次使用HAProxy的初始配置使用)

Haproxy服务器部署

  1. 关闭防火墙,将安装Haproxy所需软件包传到/opt目录下

systemctl stop firewalld
setenforce 0
​
wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
​
  1. 安装 Haproxy //编译安装

yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
​
tar zxvf haproxy-1.7.2.tar.gz
cd haproxy-1.7.2/
make TARGET=linux2628 PREFIX=/usr/local/haproxy 
make install PREFIX=/usr/local/haproxy
​

参数说明: TARGET=linux26 #内核版本, #使用uname -r查看内核,如:2.6.18-371.el5,此时该参数用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628


  1. Haproxy服务器配置

useradd -M -s /sbin/nologin haproxy
​
mkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf
​
​
//yum安装
yum install -y haproxy
​

HAProxy 的配置文件共有 5 个域:

  • global:用于配置全局参数

  • default:用于配置所有frontend和backend的默认属性

  • frontend:用于配置前端服务(即HAProxy自身提供的服务)实例

  • backend:用于配置后端服务(即HAProxy后面接的服务)实例组

  • listen:frontend + backend的组合配置,可以理解成更简洁的配置方法,frontend域和backend域中所有的配置都可以配置在listen域下

配置文件

########################  全局配置  ############################ 
####### 参数是进程级的,通常和操作系统(OS)相关
global 
    chroot /var/haproxy             # 锁定运行目录
    uid 99                          # 所属运行的用户uid 
    gid 99                          # 所属运行的用户组 
    daemon                          # 守护进程。以后台形式运行haproxy 
    nbproc 1                        # haproxy进程数,与CPU保持一致
    pidfile /var/run/haproxy.pid    # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 
    ulimit-n 65535                  # ulimit的数量限制
    maxconn 20480                   # 默认最大连接数 
    log 127.0.0.1 local0            # 日志输出配置,所有日志都记录在本机系统日志,通过 local0 输出
    log 127.0.0.1 local1 notice     # notice 为日志级别,通常有24个级别(error warring info debug)
    #########################  默认设置  ########################## 
## 这些参数可以被利用配置到 frontend,backend,listen组件
defaults 
    log global                      # 定义日志为global(全局)配置中的日志定义
    mode http                       # 所处理的类别 (网络七层协议中,tcp是第4层的会话层、http是第7层的应用层) 
    maxconn 20480                   # 最大连接数 
    option httplog                  # 日志类别http日志格式 
    option httpclose                # 每次请求完毕后主动关闭http通道 
    option dontlognull              # 不记录健康检查的日志信息 
    option forwardfor               # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
    option redispatch               # 当server Id对应的服务器挂掉后,强制定向到其他健康的服务器
    option abortonclose             # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 
    stats refresh 30                # 统计页面刷新间隔 
    retries 3                       # 检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
    balance roundrobin              # 默认的负载均衡的方式,轮询方式,上面的第4段8种负载均衡算法
    #balance source                 # 默认的负载均衡的方式,类似nginx的ip_hash 
    #balance leastconn              # 默认的负载均衡的方式,最小连接 
    contimeout 5000                 # 连接的超时时间
    clitimeout 50000                # 客户端的超时时间
    srvtimeout 50000                # 服务器的超时时间
    timeout check 2000              # 心跳检测的超时时间
​
    ####################  监控页面的设置   ####################### 
listen admin_status                # Frontend 和Backend 的组合体,监控组的名称,按需自定义名称 
    bind 0.0.0.0:65532             # 监听端口 
    mode http                      # http的7层网络模式 
    log 127.0.0.1 local3 err       # 错误日志记录 
    stats refresh 5s               # 每隔5秒自动刷新监控页面 
    stats uri /admin?stats         # 监控页面的url 
    stats realm itnihao\ itnihao   # 监控页面的提示信息是 it ni hao 
    stats auth admin:admin         # 监控页面的用户和密码admin。可以设置多个用户名,如下所示
    stats auth admin1:admin1       # 监控页面的用户和密码 admin1 
    stats hide-version             # 隐藏统计页面上的 HAproxy版本信息  
    stats admin if TRUE            # 手工启用/禁用,后端服务器(haproxy-1.4.9以后版本) 
    ####################### frontend配置 ################################ 
##### 注意,frontend 配置里面可以定义多个 acl 进行匹配操作
frontend http_80_in 
    bind 0.0.0.0:80      # 监听端口,即 haproxy 提供web服务的端口,和 lvs 的vip端口类似 
    mode http            # http的7层模式 
    log global           # 应用全局的日志配置 
    option httplog       # 启用http的log 
    option httpclose     # 每次请求完毕后主动关闭 http 通道,HA-Proxy不支持keep-alive模式 
    option forwardfor    # 如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从 Http Header 中获得客户端IP
    acl html url_reg -i \.html$ #1.访问控制列表名称html。规则要求访问以html结尾的url(可选)
    use_backend httpservers if html #2.如果满足acl html规则,则推送给后端服务器httpservers
    acl jsp url_reg -i \.jsp$ #1.访问控制列表名称jsp。规则要求访问以jsp结尾的url(可选)
    use_backend jspserver if jsp #2.如果满足acl jsp规则,则推送给后端服务器jspserver
    default_backend httpservers #不满足acl策略默认后端服务器组
    #########################  backend的设置   ######################## 
​
### 下面我将设置三组服务器 server_web,server_blog,server_bbs
############### backend server_web  ##############
backend server_web 
    mode http                         # http的7层模式 
    balance roundrobin                # 负载均衡的方式,roundrobin平均方式 
    cookie SERVERID                   # 允许插入serverid到cookie中,serverid后面可以定义 
    option httpchk GET /index.html    # 心跳检测的文件 
    server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1     
    server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2
    # server web2 192.168.16.3:80 表示 服务器定义,
    # cookie web2 表示 serverid为web2,
    # check inter 1500 表示 检测心跳频率,
    # rise 3 表示 3次正确认为服务器可用, 
    # fall 3 表示 3次失败认为服务器不可用,
    # weight 2 表示 权重
  1. 添加haproxy 系统服务

vim /etc/init.d/haproxy
#!/bin/bash
#chkconfig: 2345 90 30
#description: Haproxy Service Control Script
​
PROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/conf/$PROGNAME.cfg
PIDFILE=/var/run/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME
​
#Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
​
start()
{
    echo -e "Starting $DESC: $PROGNAME\n"
    $DAEMON -f $CONFIG
    echo "......"
}
​
stop()
{
    echo -e "Stopping $DESC: $PROGNAME\n"
    haproxy_pid="$(cat $PIDFILE)"
    kill $haproxy_pid
    echo "......"
}
​
restart()
{
    echo -e "Restarting $DESC: $PROGNAME\n"
    $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
    echo "......"
}
​
case "$1" in
start)
   start
   ;;
   
stop)
   stop
   ;;
   
restart)
    restart
    ;;
    
*)
    echo "Usage: $SCRIPTNAME {start|stop|restart}"
    exit 1
    ;;
esac
​
exit 0
​
​
cd /etc/init.d/
chmod +x haproxy
chkconfig --add /etc/init.d/haproxy
​
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
service haproxy start   或   /etc/init.d/haproxy start

修改配置文件

yum安装通过一下命令去掉注释

sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg
global
        log 127.0.0.1 local2 info
        pidfile /var/run/haproxy.pid
        maxconn 4000
        user haproxy
        group haproxy
        daemon
        nbproc 1
defaults
        mode http
        log global
        retries 3
        option httplog
        option httpclose
        option redispatch
        option abortonclose 
        maxconn 4000
        contimeout 5000
        clitimeout 50000
        srvtimeout 50000
listen stats
        bind *:82
        stats enable
        stats uri /haproxy
        stats auth lisi:123
frontend web
        mode http
        bind *:80
        option httplog
        acl html url_reg -i \.html$
        acl jsp url_reg -i \.jsp$
        use_backend jspserver if jsp
        use_backend httpservers if html
        default_backend httpservers
backend httpservers
        balance roundrobin
        server http1 192.168.10.11:81 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
        server http2 192.168.10.10:81 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
backend jspserver
        balance roundrobin
        server web1 192.168.10.13:8080 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
        server web2 192.168.10.11:8080 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
  • maxconn < maxconn>:当前server的最大并发连接数;

  • backlog < backlog>:当前server的连接数达到上限后的后援队列长度;

  • backup:设定当前server为备用服务器;和nginx里的sorry server 是一样的;

  • cookie < value>:为当前server指定其cookie值,用于实现基于cookie的会话黏性;

  • disabled:标记为不可用;相当于nginx里的down;

  • redir < prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL;

  • weight < weight>:权重,默认为1,最大值为256,0表示不参与负载均衡;

  • on-error < mode>:后端服务故障时采取的行动策略;策略有如下几种:

    • fastinter:表示缩短健康状态检测间的时长;

    • fail-check:表示即健康状态检测失败,也要检测;这是默认策略;

    • sudden-death:模拟一个致命前的失败的健康检查,一个失败的检查将标记服务器关闭,强制fastinter

    • mark-down:立即标记服务器不可用,并强制fastinter;

  • check:对当前server做健康状态检测;

    • addr :检测时使用的IP地址;

    • port :针对此端口进行检测;

    • inter < delay>:连续两次检测之间的时间间隔,默认为2000ms;

    • rise < count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2;

    • fall < count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3;

haproxy默认不开启日志记录,如果不更改配置,在/var/log/haproxy.log和/var/log/message配置文件都不会写入日志记录,为了方便更好排错,还是开启比较好。

日志级别:

日志的级别为local0~local7,另外16~23保留为本地使用:

级别

代码

描述

emerg

0

系统不可用

alert

1

必须马上采取行动的事件

crit

2

关键的事件

err

3

错误事件

warning

4

警告事件

notice

5

普通但重要的事件

info

6

有用的信息

debug

7

调试信息

配置:

1、vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 info
#local2是设备,对应于 /etc/rsyslog.conf中的配置,默认回收info的日志级别
2、编辑系统日志配置
vim /etc/rsyslog.conf
默认有下面的设置,会读取 /etc/rsyslog.d/*.conf目录下的配置文件
$IncludeConfig /etc/rsyslog.d/*.conf
为haproxy创建一个独立的配置文件
vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
#如果不加下面的的配置则除了在/var/log/haproxy.log中写入日志外,也会写入message文件
配置完成后重启haproxy和rsyslog服务
systemctl restart haproxy rsyslog 



评论