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 配置可相同。

 

posted @ 2020-03-15 17:20  一窗明月半帘风  阅读(308)  评论(0编辑  收藏  举报