zoukankan      html  css  js  c++  java
  • haproxy

    1. 简介

      Haproxy 提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机。

      haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。负载均衡LVS是基于四层。

      haproxy 高性能负载均衡优点如下:

      haproxy是支持虚拟主机的,可以工作在4/7层

      能够补充nginx 的一些缺点,比如 session 的保持、cookie 的引导等工作

      支持url 检测后端的服务器

      它跟lvs 一样,只是一款负载均衡软件,单纯从效率上来讲,haproxy 更会比nginx又更出色的负载均衡速度,在并发处理上也是优于nginx的

      haproxy可以对mysql 读进行负载均衡,对后端的MySQL节点进行 检测和负载均衡,haproxy 支持多种算法。

    haproxy+keepalived 企业高性能web 能够支持千万级并发网站。

    2. 安装配置

    2.1  安装

    下载网址:http://download.openpkg.org/components/cache/haproxy/

    # wget http://download.openpkg.org/components/cache/haproxy/haproxy-1.8.10.tar.gz
    # tar -xvf haproxy-1.8.10.tar.gz
    # cd haproxy-1.8.10
    # make TARGET=linux2628 PREFIX=/usr/local/haproxy/
    # 2.0以后 make TARGET=linux-glibc PREFIX=/usr/local/haproxy/
    # make install PREFIX=/usr/local/haproxy # /usr/local/haproxy/sbin/haproxy -v

    2.2 haproxy 配置文件详解

    ###########全局配置#########
    global
      log 127.0.0.1 local0       # 日志输出配置,所有日志都记录在本机,通过local0输出
      log 127.0.0.1 local1 notice   #定义haproxy 日志级别[error warring info debug]
      daemon               #以后台形式运行harpoxy
      nbproc 8              #进程数量(可设置多个进程提高性能)
      maxconn 4096            #默认最大连接数
      uid                 #运行haproxy的用户uid
      gid                 #运行haproxy的用户所属组的gid
      pidfile /var/run/haproxy.pid   #haproxy 进程PID文件
      ulimit-n 65535          #ulimit 的数量限制
      chroot /usr/share/haproxy    #chroot运行路径
      debug                #haproxy 调试级别,建议只在开启单进程的时候调试
      quiet
    
    ########默认配置############
    defaults
      log global
      mode http              #所处理的类别(7层http,四层tcp)
      maxconn  20480          #最大连接数
      option httplog           #日志类别http日志格式
      option httpclose         #每次请求完毕后主动关闭http通道   option dontlognull         #不记录健康检查的日志信息   retries
    3              #3次连接失败就认为是服务器不可用,也可以通过后面设置   option forwardfor         #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip   option redispatch         #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器   option abortonclose        #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接   timeout connect 5000ms      #连接超时   timeout client 30000ms      #客户端超时   timeout server 30000ms     #服务器超时   #timeout check 2000        #心跳检测超时   #timeout http-keep-alive10s   #默认持久连接超时时间   #timeout http-request 10s    #默认http请求超时时间   #timeout queue 1m       #默认队列超时时间   balance roundrobin        #设置默认负载均衡方式,轮询方式   #balance source          #设置默认负载均衡方式,类似于nginx的ip_hash   #balnace leastconn       #设置默认负载均衡方式,最小连接数 ########监控页面配置######## listen admin_stats         #Frontend和Backend的组合体,监控组的名称,按需自定义名称   bind 0.0.0.0:65535       # 监听端口   mode http             #http的7层模式   option httplog         #采用http日志格式   log 127.0.0.1 local3 err    #错误日志记录   maxconn 10            #默认的最大连接数   stats refresh 30s       #每个5s自动刷新监控页面   stats uri /stats         #监控页面url   stats realm Nanshan Haproxy #监控页面的提示信息   stats auth admin:admin     #设置监控页面的用户和密码:admin,可以设置多个用户名   stats auth wind:wind      #设置监控页面的用户和密码:wind   stats hide-version       #隐藏统计页面上HAProxy的版本信息   stats admin if TRUE       #设置手工启动/禁用,后端服务器
    ########监控haproxy 后端服务器状态
    listen site_status         
    bind 0.0.0.0:1081             #监听端口
    mode http                  #http7层模式
    log 127.0.0.1 local3 err         #[err warning info debug]
    monitor-uri /site_status         #网站健康监测URL,用了检测haproxy 管理的网站是否可用,正常返回200,不正常返回530
    acl site_dead nbsrv(server_web) lt 2  #定义网站down时的策略,当挂在负载均衡上的指定 backend 的有效机器数小于 1 台时返回true
    monitor fail if site_dead        #当满足策略时返回503
    monitor-net 192.168.80.130/32      #来自192.168.80.130 的日志信息不会被记录和转发
    monitor-net 192.168.80.131/32      #来自192.168.80.131 的日志信息不会被记录和转发
    ########设置haproxy 错误页面#####
    #errorfile 403 /usr/local/haproxy/errorfiles/403.http
    #errorfile 500 /usr/local/haproxy/errorfiles/500.http
    #errorfile 502 /usr/local/haproxy/errorfiles/502.http
    #errorfile 503 /usr/local/haproxy/errorfiles/503.http
    #errorfile 504 /usr/local/haproxy/errorfiles/504.http
    
    ########frontend配置##############
    frontend main
      bind *:80               #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
      acl abc hdr(host) -i www.abc.com  #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发abc规则,。
      acl bcd hdr(host) -i www.bcd.com  #如果访问www.bcd.com这个域名,就触发bcd规则。
      use_backend abcserver if abc   #如果上面定义的abc规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。
      use_backend bcdserver if bcd   #如果上面定义的bcd规则被触发,即访问www.bcd.com,就将请求分发到bcdserver这个作用域。
      default_backend dynamic     #不满足则响应backend的默认页面
    
    ########backend配置##############
    backend abcserver 
      mode http                  #http的7层模式
      balance roundrobin             #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
      option httpchk /index.html HTTP/1.0   #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
      server web1 192.168.80.133:80 cookie 1 weight 5 check inter 2000 rise 2 fall 3
      server web2 192.168.80.134:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3
      #cookie 1表示serverid为1,check inter 1500 是检测心跳频率 
      #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
    

    2.3 配置haproxy 服务

    # cd /usr/local/haproxy/
    # mkdir etc
    # touch /usr/local/haproxy/etc/haproxy.cfg

    2.4 配置文件内容

    global
            maxconn         2000
            log             127.0.0.1 local0
            uid             1000
            gid             1000
            chroot          /var/empty
        nbproc        4
            daemon
    defaults
            log global
            mode http
            maxconn 2000
            option httplog
            option dontlognull
            retries 3
            option redispatch
            timeout connect 5000
            timeout client 50000
            timeout server 50000
    frontend nginx
        bind        *:80
            mode            http
            log             global
            option          httplog
            option          dontlognull
            option          nolinger
            option          http_proxy
            maxconn         8000
            timeout client  30s
        acl abc hdr_end(host) -i www.abc.com
        acl bcd hdr_end(host) -i www.bcd.com
            use_backend abcserver if abc
            use_backend bcdserver if bcd
            default_backend abcserver
    backend abcserver
            balance roundrobin
            option httpchk /index.html HTTP/1.0
            server web1 192.168.80.131:80 cookie 1 check inter 2000 rise 2 fall 3 weight 4
    backend bcdserver
            balance roundrobin
            option httpchk /index.html HTTP/1.0
            server web1 192.168.80.134:80 cookie 1 check inter 2000 rise 2 fall 3 weight 1

    3. haproxy + keepalived

    环境准备

    nginx1:192.168.80.131
    nginx2:192.168.80.134
    keepalived+haproxy(master):192.168.80.133
    keepalived+haproxy(backup):192.168.80.132
    VIP:192.168.80.250

    3.1 安装keepalived

    # tar -zxvf keepalived-2.0.20.tar.gz
    # cd keepalived-2.0.20
    # ./configure --prefix=/usr/local/keepalived
    # make && make install
    # cp keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
    # cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    # mkdir -p /etc/keepalived
    # cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    # cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

    3.2 配置keepalived

    master

    ! Configuration File for keepalived
    
    global_defs {
       router_id haproxy1
    }
    vrrp_script check {
       script "/data/sh/check_haproxy.sh"
       interval 2
       weight 2
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.80.250
        }
        track_script {
        check
        }
    }

    backup

    ! Configuration File for keepalived
    
    global_defs {
       router_id haproxy1
    }
    vrrp_script check {
       script "/data/sh/check_haproxy.sh"
       interval 2
       weight 2
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 51
        priority 90
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.80.250
        }
        track_script {
        check
        }
    }

    3.3 创建检测脚本

    # cat /data/sh/check_haproxy.sh 
    #!/bin/bash
    #auto check haproxy process
    
    killall -0 haproxy
    if [[ $? -ne 0 ]];then
        /etc/init.d/keepalived stop
    fi

    3.4 haproxy 配置

    # cat /usr/local/haproxy/haproxy.cfg 
    global
            maxconn         8000
            log             127.0.0.1 local0
            uid             1000
            gid             1000
            chroot          /var/empty
            daemon
    defaults
            log global
            mode http
            maxconn 2000
            option httplog
            option dontlognull
            retries 3
            option redispatch
            timeout connect 5000
            timeout client 50000
            timeout server 50000
    frontend nginx
        bind        192.168.80.250:80
            mode            http
            log             global
            option          httplog
            option          dontlognull
            maxconn         8000
            stats uri /haproxy?stats
            default_backend abcserver
    backend abcserver
            balance roundrobin
            option forwardfor
            option httpchk GET /index.html 
            server web1 192.168.80.131:80 cookie 1 check inter 2000 rise 2 fall 3 weight 2
            server web2 192.168.80.134:80 cookie 2 check inter 2000 rise 2 fall 3 weight 1

    主备服务器上haproxy 配置可相同。

  • 相关阅读:
    golang语言中os/signal包的学习与使用
    golang语言中os/exec包的学习与使用
    go语言使用go-sciter创建桌面应用(七) view对象常用方法,文件选择,窗口弹出,请求
    go语言使用go-sciter创建桌面应用(六) Element元素操作和Event事件响应
    go语言使用go-sciter创建桌面应用(五) 加载元素资源
    go语言使用go-sciter创建桌面应用(四) 固定窗口大小
    go语言使用go-sciter创建桌面应用(三) 事件处理,函数与方法定义,go与tiscript之间相互调用
    go语言使用go-sciter创建桌面应用(二) ui元素查找,增加,删除,修改
    go语言使用go-sciter创建桌面应用(一) 简单的通过html,css写ui
    go语言net包rpc远程调用的使用
  • 原文地址:https://www.cnblogs.com/sswind/p/12498662.html
Copyright © 2011-2022 走看看