haproxy

千万级高并发负载均衡软件HA PROXY
基于硬件的负载均衡设备:f5,big-ip等
基于软件的负载均衡产品:ha proxy,lvs,nginx等
在软件的负载均衡产品中,分为基于系统的软负载实现和基于第三方软件的软负载实现,LVS是基于系统实现的一种软负载。HA proxy是基于第三方应用实现的软负载均衡
1.haproxy简介
haproxy是一个开源的,高性能的,基于tcp第四层和http第七层应用的负载均衡软件
优点:可靠性和稳定性非常好
    最高可以同时维护40000-50000个并发连接。单位时间内处理最大的请求数为20000.最大数据处理能力可达10GBPS
    支持多于8种负载均衡算法,同时也支持session保持
    支持虚拟主机功能。
    支持连接拒绝,全透明代理等功能
    haproxy拥有一个功能强大的服务器状态监控页面
    haproxy 拥有强大的ACL支持
在业务系统方面。haproxy非常实用于那些并发量特别大而且需要持久连接或四层和七层处理机制的web系统,例如电商,另外haproxy也可用于mysql数据库(读操作)的负载均衡

2.四层和七层负载均衡的区别
四层负载均衡器也称为四层交换机,它主要是通过分析ip层及tcp/udp层的流量实现的基于ip+端口
tcp应用实例:负载均衡器在接收到第一个来自SYN请求时,会通过设定的负载均衡算法选择一台最佳的后端服务器,同时将报文中的目标ip修改为后端服务器ip,然后直接转发给该服务器。负载均衡器在这个过程中相当于一个路由器的作用
七层负载均衡器也称为7层交换机,位于iso应用层,支持多种应用协议,常见的HTTP,FTP,SMTP等。七层负载均衡器可以根据报文内容,再配合负载均衡算法来选择后端服务器。因此也称为“内容交换机”。七层负载均衡器在这个情况下类似于一个代理服务器。

3.haproxy与LVS的异同
两者都是软件负载均衡的产品。但是lvs基于系统,haproxy基于第三方应用
lvs是基于第四层的ip负载技术。haproxy是基于第四层和第七层,可提供tcp和http应用的负载均衡综合解决方案
LVS工作在iso模型第四层,状态监测功能单一。haproxy监测功能强大,可支持端口,url,脚本等多种检测方式
haproxy处理性能低于四层负载均衡模式的LVS

HAProxy常用的算法有如下8种:
balance roundrobin,表示简单的轮询,建议关注;
balance static-rr,表示根据权重,建议关注;
balance leastconn,表示最少连接者先处理,建议关注;
balance source,表示根据请求源IP,跟Nginx的ip_hash算法相似,建议关注;
balance uri,表示根据请求的URI;
balance url_param,表示根据请求的URl参数;
balance hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
balance rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。

日志配置:
日志的level: local0~local7 16~23保留为本地使用
emerg 0 系统不可用
alert 1 必须马上采取行动的事件
crit 2 关键的事件
err 3 错误事件
warning 4 警告事件
notice 5 普通但重要的事件
info 6 有用的信息
debug 7 调试信息

cat /etc/redhat-release
CentOS release 6.6 (Final)
uname -r
2.6.32-504.el6.x86_64
yum install pcre-devel openssl-devel -y
tar zxvf haproxy-1.4.26.tar.gz
cd haproxy-1.4.26
make TARGET=linux26 ARCH=x86_64
make PREFIX=/application/haproxy install


配置Haproxy
    Haproxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择作为配置。

    •global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改;
    •default:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件;
    •frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择);
    •backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器;
    •listen:Frontend和Backend的组合体。
vi /etc/sysctl.conf
加入下面内容
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1

sysctl -p


net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
net.ipv4.ip_nonlocal_bind = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

cd /application/haproxy/
mkdir -p bin conf logs var/run var/chroot

vim /application/haproxy/conf/haproxy.conf
global
        chroot /application/haproxy/var/chroot
        daemon
        group www
        user www
        log 127.0.0.1:514 local0 warning
        pidfile /application/haproxy/var/run/haproxy.pid
        maxconn 20000
        spread-checks 3
        nbproc 8

defaults
        log     global
        mode    http
        retries 3
        option redispatch
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen test
        bind 192.168.12.147:80
        mode http
        stats enable
        stats hide-version
        stats uri /haproxy
        stats auth admin:admin
        balance roundrobin
       option httpclose
       option forwardfor
       cookie SERVERID insert indirect
       timeout server  15s
       timeout connect 15s
      server ett-1-1 192.168.12.22:80 cookie ett-1-1 check port 80 inter 5000 fall 5
      server ett-1-2 192.168.12.25:80 cookie ett-1-1 check port 80 inter 5000 fall 5

增加IP

ifconfig eth1 add 192.168.12.147


配置启动脚本
vi /etc/rc.d/init.d/haproxy
#!/bin/bash
BASE="/application/haproxy"
PROG=$BASE/sbin/haproxy
PIDFILE=$BASE/var/run/haproxy.pid
CONFFILE=$BASE/conf/haproxy.conf

case "$1" in
start)
        $PROG -f $CONFFILE
        ;;
status)
        if [ ! -f $PIDFILE ]; then
                echo "pid not found"
                exit 1
        fi
        for pid in $(cat $PIDFILE); do
                kill -0 $pid
                RETVAL="$?"
                if [ ! "$RETVAL" = "0" ]; then
                        echo "process $pid died"
                        exit 1
                fi
        done
        echo "process is running"
        ;;
restart)
        $PROG -f $CONFFILE -sf $(cat $PIDFILE)
        ;;
stop)
        kill $(cat $PIDFILE)
        ;;
*)
        echo "USAGE: $0 start|restart|status|stop"
        exit 1
        ;;
esac

chmod +x /etc/rc.d/init.d/haproxy

vi /etc/rsyslog.conf
#增加如下行,记录日志到/var/log/haproxy.log 文件
local0.*                                      /var/log/haproxy.log   
第三步:
vi /etc/sysconfig/rsyslog
将SYSLOGD_OPTIONS="-m 0"
 改成
 SYSLOGD_OPTIONS="-c 2 -r -m 0"

service rsyslog restart

/etc/init.d/haproxy start

配置文件详解:

global
  log     127.0.0.1:514 local0 warning  # 定义全局日志服务器
  chroot   /application/haproxy/var/chroot  # 修改haproxy的工作目录到制定的目录,提高安全性
  pidfile   /application/haproxy/var/run/haproxy.pid # pid文件位置
  maxconn   20000      # 最大连接数
  user    www     # 服务运行时的身份,也可以用uid来表示
  group   www     # 服务运行时的身份所属的组,可以用gid来表示
  Daemon          # 服务以守护进程的身份运行
  nbproc  8       #进程数,(这个自己定义,如果启动haproxy报警告错误就改小一点)


**********************默认配置*********************************

defaults
  mode  http      # 为http服务代理,http为7层协议,tcp4层
  log   global     # 全局日志
  option httplog      # 是否允许重新分配在session 失败后
  option dontlognull   # 不记录健康查询的日志
  contimeout      5000 #连接超时时间
  clitimeout      50000#客户端超时
  srvtimeout      50000#server处理超时

***********************后端服务器配置*****************************
listen test
        bind 192.168.12.147:80  监听端口
        mode http   http的7层模式,默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
 监控统计的账号和密码
        stats enable
        stats hide-version
        stats uri /haproxy  网页登陆地址
        stats auth admin:admin  登陆账号密码
        balance roundrobin   负载均衡模式
       option httpclose
       option forwardfor
       cookie SERVERID insert indirect
       timeout server  15s
       timeout connect 15s
      server web-1-1 192.168.12.22:80 cookie web-1-1 check port 80 inter 5000 fall 5
      server web-1-2 192.168.12.25:80 cookie web-1-1 check port 80 inter 5000 fall 5
 

###############################################################

acl访问控制


frontend web
  bind *:8080
  default_backend static
  acl abc src 172.16.1.100
redirect prefix http://172.16.1.6/def if abc

当客户端ip为172.16.5.100时,重定向到http://172.16.5.16/def


acl要和redirect prefix或者redirect location搭配使用

官方实例,将用户登录后的url重定向到https安全连接。


acl clear   dst_port 80
acl secure   dst_port 8080
acl login_page url_beg  /login
acl logout   url_beg  /logout
acl uid_given url_reg  /login?userid=[^&]+
acl cookie_set hdr_sub(cookie) SEEN=1
redirect prefix  https://mysite.com set-cookie SEEN=1 if !cookie_set
redirect prefix  https://mysite.com      if login_page !secure
redirect prefix  http://mysite.com drop-query if login_page !uid_given
redirect location http://mysite.com/      if !login_page secure
redirect location / clear-cookie USERID=    if logout

访问阻止

frontend web
  bind *:8080
  default_backend static
  acl abc src 172.16.5.100
  block if abc  # 阻止访问

原文地址:https://www.cnblogs.com/zclzhao/p/5017257.html