Haproxy简介

Haproxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用

Haproxy工作原理

HAProxy由前端(frontend)和后端(backend),前端和后端都可以有多个。也可以只有一个listen块来同时实现前端和后端。这里主要讲一下frontend和backend工作模式。前端(frontend)区域可以根据HTTP请求的header信息来定义一些规则,然后将符合某规则的请求转发到相应后端(backend)进行处理

Haproxy参数配置详解

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

  • global:全局参数配置,属于进程级的配置
  • defaults:默认参数配置,这些参数可以在frontend,backend,listen中使用。设置的默认参数值,会自动引用到frontend、backend、listen中,如果frontend、backend、listen部分也配置了与defaults一样的参数,defaults部分参数对应的值自动被覆盖
  • Frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend
  • backend:后端服务集群的配置,一个Backend对应一个或者多个后端实体服务器
  • listen:Fronted和backend的组合体, 比如haproxy实例状态监控部分配置

global

global
    log 127.0.0.1 local0 /* 定义haproxy日志输出设置 */
    log 127.0.0.1 local1 notice
    maxconn 4096 /* 定义最大连接数 */
    user haproxy /* 运行haproxy的用户 */
    group haproxy /* 运行haproxy的组 */
    daemon /* 后台方式运行 */
pidfile /usr/local/haproxy/run/haproxy.pid /* haproxy进程pid文件 *

defaults

defaults
    log global /* 引入global定义的日志格式 */
    mode http /* 所处理的类别(http为7层,tcp为4层) */
    option tcplog /* 日志类别 [tcplog | httplog] */
    option dontlognull /* 不记录健康检查日志信息 */
    retries 3 /* 尝试连接3次,如果3次连接失败则认为该服务不可用 */
    option redispatch /* 节点异常时重定向至正常节点 */
    maxconn 2000 /* 最大连接数 */
option forwardfor except 127.0.0.0/8 /* 后端服务器获取真实的客户端IP */
stats refresh 30 /* 设置统计页面刷新时间间隔 */
balance leastconn /* 设置负载均衡方式 */
timeout http-request 30s /* 客户端发送http请求超时时间 */
timeout queue 5m /* 请求队列超时时间 */
timeout connect 10s /* ha与后端服务器连接超时时间 */
    timeout client 30m /* 客户端非活动连接超时时间 */
    timeout server 30m /* ha与后端服务器非活动连接超时时间 */
    timeout check 10s /* 心跳检查超时时间 */

frontend

frontend pxc-front                   /* 定义frontend名称 */
    bind *:3307 /* 设置监听端口 */
    mode tcp /* 定义为tcp模式 */
    default_backend pxc-back /* 设置后端服务器的backend */

backend

backend pxc-back                      /* 定义backend名称 */
    mode tcp /* 定义为tcp模式 */
    balance leastconn /* 这种均衡方式会把新连接发送到连接较少的节点 */
    #option httpchk GET /index.html /* 心跳检测 */
    server node157 10.240.204.157:33006 check port 9200 inter 12000 rise 3 fall 3 /* 定义后端服务器列表 */
    server node165 10.240.204.165:33006 check port 9200 inter 12000 rise 3 fall 3 /* 定义后端服务器列表 */
    server node149 10.240.204.149:33006 check port 9200 inter 12000 rise 3 fall 3 /* 定义后端服务器列表 */

listen

backend pxc-back                      /* 定义backend名称 */
    mode tcp /* 定义为tcp模式 */
    balance leastconn /* 这种均衡方式会把新连接发送到连接较少的节点 */
    #option httpchk GET /index.html /* 心跳检测 */
    server node157 10.240.204.157:33006 check port 9200 inter 12000 rise 3 fall 3 /* 定义后端服务器列表 */
    server node165 10.240.204.165:33006 check port 9200 inter 12000 rise 3 fall 3 /* 定义后端服务器列表 */
    server node149 10.240.204.149:33006 check port 9200 inter 12000 rise 3 fall 3 /* 定义后端服务器列表 */

均衡算法

  • roundrobin:基于权重进行的轮询算法
  • static-rr:静态方式的轮询算法,在运行时调整权重不生效
  • source:基于请求IP的算法,对请求IP进行hash运算。这种方法可以使一个客户端IP始终请求同一个后端服务器
  • leastconn:将请求发送到连接数最少的后端服务器,适用于数据库负载均衡
  • uri:此算法会对部分或整个URI进行hash运算,再经过与服务器的总权重要除,最后转发到某台匹配的后端服务器上。
  • uri_param:此算法会椐据URL路径中的参数时行转发,这样可以保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器
  • hdr:此算法根据httpd头时行转发,如果指定的httpd头名称不存在,则使用roundrobin算法进行策略转发。
  • rdp-cookie(name):示根据据cookie(name)来锁定并哈希每一次TCP请求

Tips:keepalived