zoukankan      html  css  js  c++  java
  • 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  # 阻止访问

  • 相关阅读:
    [日常] Go语言圣经--示例: 并发的Echo服务
    [日常] Go语言圣经--示例: 并发的Clock服务习题
    [日常] Go语言圣经--接口约定习题2
    [日常] Go语言圣经--接口约定习题
    [日常] Linux下的docker实践
    [日常] Go语言圣经-指针对象的方法-bit数组习题2
    [日常] Go语言圣经-指针对象的方法-bit数组习题
    [日常] Go语言圣经-Panic异常,Recover捕获异常习题
    [日常] Go语言圣经-Deferred函数
    [日常] Go语言圣经-可变参数习题
  • 原文地址:https://www.cnblogs.com/zclzhao/p/5017257.html
Copyright © 2011-2022 走看看