Haproxy原理部署及配置使用

  • 1. Haproxy概念
  • 2. Haproxy优点与原理
  • 2.1 Haproxy优点
  • 2.2 Haproxy原理
  • 3. Haproxy安装部署
  • 3.1 安装环境
  • 3.2 安装步骤
  • 3.3 配置调整
  • 3.4 相关命令
  • 4. Haproxy配置
  • 4.1 配置组成
  • 4.2 配置样本及说明
  • 5. 参考文献


在代理服务以及负载均衡方面经常使用nginx,考虑到是否可以对数据库访问做负载均衡时,nginx不再适用,此时查找资料,Haproxy可以实现。本文在查阅相关资料文献的基础之上,搭建部署一套Haproxy服务,调整相关配置文件,实现Haproxy反向代理以及负载均衡的功能。在此进行整理总结记录,以便后续持续深入学习,以及为后来者提供借鉴,文中不免疏漏之处,望读者给予指正,感激之至!

1. Haproxy概念

Haproxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
Haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。Haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

2. Haproxy优点与原理

haproxy如何分发策略 haproxy部署_nginx

2.1 Haproxy优点

1. Haproxy支持两种代理模式 TCP(四层)和HTTP(七层),也是支持虚拟主机的。
2. Haproxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
3. Haproxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲Haproxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
4. Haproxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,大家可以用LVS+Keepalived对MySQL主从做负载均衡。
5. HAProxy负载均衡策略非常多:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)。

2.2 Haproxy原理

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。
事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。
此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作

3. Haproxy安装部署

3.1 安装环境

linux系统:CentOS Linux release 7.2.1511 (Core)
haproxy版本:haproxy-2.3.14.tar.gz

3.2 安装步骤

1. 下载安装包
wget https://www.haproxy.org/download/2.3/src/haproxy-2.3.14.tar.gz

2. 依赖安装更新
yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget gtk2-devel binutils-devel systemd-devel

3. 解压以及路径处理
tar -zvxf haproxy-2.3.14.tar.gz
mv haproxy-2.3.14 /usr/local/
cd /usr/local/haproxy-2.3.14/

4. 编译
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy  #编译并指定开启的参数
USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src LUA_LIB=/usr/local/src/lua-5.3.5/src  # 使用lua脚本,需安装lua

ARCH=x86_64  #CPU架构,arch命令查看
TARGET=linux-glibc  #通用linux内核
USE_PCRE=1  #PCRE支持正则表达式,用于用户请求的uri
USE_OPENSSL=1   #https,证书
USE_ZLIB=1   #开启压缩
USE_SYSTEMD=1   #使用systemd启动haproxy主进程
USE_CPU_AFFINITY=1  #CPU亲和性,让haproxy指定的进程工作在指定的CPU核心上
USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src LUA_LIB=/usr/local/src/lua-5.3.5/src   #开启lua,及lua和lua库所在路径
PREFIX=/usr/local/haproxy   #指定安装路径

5. 安装
make install PREFIX=/usr/local/haproxy

3.3 配置调整

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     #默认最大连接数
    timeout connect            5000  #ha服务器与后端服务器连接超时时间,单位毫秒ms
    timeout client             50000 #客户端超时
    timeout server             50000 #后端服务器超时
    
listen stats
    bind            *:81
    stats                   enable
    stats uri               /haproxy  #使用浏览器访问 http://192.168.65.158/haproxy,可以看到服务器状态
    stats auth              haccount:hapwd  #用户认证,客户端使用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.65.158:8081 maxconn 2000 weight 1  check inter 1s rise 2 fall 2
    server  http2 192.168.65.159:8081 maxconn 2000 weight 1  check inter 1s rise 2 fall 2

3.4 相关命令

1. 检查配置文件语法
haproxy -c -f /usr/local/haproxy/conf/haproxy.cfg

2. 启动调试功能,将显示所有连接和处理信息在屏幕
haproxy -d -f /usr/local/haproxy/conf/haproxy.cfg

3. restart。需要使用 st 选项指定pid列表
haproxy -f /usr/local/haproxy/conf/haproxy.cfg [-p /var/run/haproxy.pid] -st `cat /var/run/haproxy.pid`

4. graceful restart,即reload。需要使用 sf 选项指定pid列表
haproxy -f /usr/local/haproxy/conf/haproxy.cfg [-p /var/run/haproxy.pid] -sf `cat /var/run/haproxy.pid`

5. 显示haproxy编译和启动信息
haproxy -vv

说明:
restart会直接关掉旧进程并建立新进程,所以会丢弃大量已建立的连接,而reload会启动新进程,但旧进程会先处理完当前已建立连接然后再关闭。但是,reload仍然会丢弃极少量的连接;完全不丢弃连接的无损重启,可考虑在haproxy启动命令中加入-x选项,同时要求haproxy配置文件的"stats socket"配置中加入expose-fd listeners,比如:
stats socket /var/run/haproxy.sock mode 600 expose-fd listeners level user
使用-x选项以及expose-fd listeners之后,reload haproxy的时候,会将已建立TCP连接(TCP套接字)转移到Unix Domain状态套接字中进行处理。

haproxy如何分发策略 haproxy部署_负载均衡_02

4. Haproxy配置

4.1 配置组成

Haproxy配置文件根据功能和用途,主要有5个部分组成,但有些部分并不是必须的,可以根据需要选择相应的部分进行配置。

(1)global部分
用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
(2)defaults部分
默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的frontend、backend和listen部分中,因此,如果某些参数属于公用的配置,只需在defaults部分添加一次即可。
而如果在frontend、backend和listen部分中也配置了与defaults部分一样的参数,那么defaults部分参数对应的值自动被覆盖。
(3)frontend部分
此部分用于设置接收用户请求的前端虚拟节点。frontend是在HAProxy1.3版本之后才引入的一个组件,同时引入的还有backend组件。
通过引入这些组件,在很大程度上简化了HAProxy配置文件的复杂性。frontend可以根据ACL规则直接指定要使用的后端backend。
(4)backend部分
此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。
添加的真实服务器类似于LVS中的real server节点。
(5)listen部分
此部分是frontend部分和backend部分的结合体。在HAProxy1.3版本之前,HAProxy的所有配置选项都在这个部分中设置。
为了保持兼容性,HAProxy新的版本仍然保留了listen组件的配置方式。目前在HAProxy中,两种配置方式任选其一即可。

4.2 配置样本及说明

# 全局参数,属于进程级的配置,通常和操作系统配置有关
 global
         log 127.0.0.1 local3        #定义haproxy日志输出设置
         log 127.0.0.1   local1 notice        
         #log loghost    local0 info #定义haproxy 日志级别
         ulimit-n 82000              #设置每个进程的可用的最大文件描述符
         maxconn 20480               #默认最大连接数
         chroot /usr/local/haproxy   #chroot运行路径
         uid 99                      #运行haproxy 用户 UID
         gid 99                      #运行haproxy 用户组gid
         daemon                      #以后台形式运行harpoxy
         nbproc 1                    #设置进程数量
         pidfile /usr/local/haproxy/run/haproxy.pid  #haproxy 进程PID文件
         #debug                      #haproxy调试级别,建议只在开启单进程的时候调试
         #quiet

# 配置默认参数
defaults
         log    global         #引入global定义的日志格式
         mode    http          #所处理的类别(7层代理http,4层代理tcp)
         maxconn 50000         #最大连接数
         option  httplog       #日志类别为http日志格式
         option  httpclose     #每次请求完毕后主动关闭http通道
         option  dontlognull   #不记录健康检查日志信息
         option  forwardfor    #如果后端服务器需要获得客户端的真实ip,需要配置的参数,可以从http header 中获取客户端的IP
         retries 3             #3次连接失败就认为服务器不可用,也可以通过后面设置
         option redispatch  
         stats refresh 30       #设置统计页面刷新时间间隔
         option abortonclose    #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
         balance roundrobin     #设置默认负载均衡方式,轮询方式
         timeout http-request    10s  #默认http请求超时时间
         timeout queue           1m   #默认队列超时时间
         timeout connect         10s  #默认连接超时时间
         timeout client          1m   #默认客户端超时时间
         timeout server          1m   #默认服务器超时时间
         timeout http-keep-alive 10s  #默认持久连接超时时间
         timeout check           10s  #设置心跳检查超时时间

# 状态页面监控
listen  admin_status           #Frontend和Backend的组合体,监控组的名称,按需自定义名称 
         bind 0.0.0.0:8888              #监听端口 
         mode http                      #http的7层模式 
         log 127.0.0.1 local3 err       #错误日志记录 
         stats refresh 5s               #每隔5秒自动刷新监控页面 
         stats uri /admin?stats         #监控页面的url访问路径 
         stats realm itnihao\ welcome   #监控页面的提示信息 
         stats auth admin:admin         #监控页面的用户和密码admin,可以设置多个用户名 
         stats auth admin1:admin1       #监控页面的用户和密码admin1 
         stats hide-version             #隐藏统计页面上的HAproxy版本信息  
         stats admin if TRUE            #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)

# frontend配置
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通道,HAproxy不支持keep-alive模式     
     	option forwardfor  #如果后端服务器需要获得客户端的真实IP需要配置此参数,将可以从HttpHeader中获得客户端IP
     	default_backend wwwpool   #设置请求默认转发的后端服务池

# backend 后端服务集群的配置
backend wwwpool      #定义wwwpool服务器组。
  		mode http           #http的7层模式
  		option  redispatch
  		option  abortonclose
  		balance source      #负载均衡的方式,源哈希算法
  		cookie  SERVERID    #允许插入serverid到cookie中,serverid后面可以定义
  		option  httpchk GET /test.html   #心跳检测
  		server web1 10.1.1.2:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 maxconn 8

5. 参考文献

[1] https://www.haproxy.org/