Haproxy

介绍

HAProxy是一个开源的、高性能的、基于TCP和HTTP应用的负载均衡软件,借助HAProxy可快速、可靠地提供基于TCP和HTTP应用的负载均衡解决方案
HAProxy的优点
1) 可靠性和稳定性非常好,可以与硬件的F5相媲美
2) 最高可以同时维护40000–50000个并发连接,单位时间内处理的最大请求数为20000个,最大数据处理能力可达10Gbps
3) 支持多于8种负载均衡算法 ,同时也支持session保持
4) 支持虚拟主机功能
5) 从HAProxy 1.3版本后开始支持连接拒绝、全透明代理等功能
6) HAProxy拥有一个功能强大的服务器状态监控页面
7) HAProxy拥有功能强大的ACL支持
HAProxy是借助于操作系统的技术特征来实现性能最大化的,因此,在使用HAProxy时,对操作系统进行性能调优是非常重要的。在业务系统方面,HAProxy非常适用于那些并发量特别大而且需要持久连接或四层和七层处理机制的web系统。另外,HAProxy也可以用于MySQL读操作的负载均衡

安装

编译安装
http://pkgs.fedoraproject.org/repo/pkgs/haproxy/
#解压
tar -zxvf haproxy-1.7.9.tar.gz
cd haproxy-1.7.9
#安装
[root@haproxy ~]# tar zxf haproxy-1.7.9.tar.gz 
[root@haproxy ~]# cd haproxy-1.7.9
[root@haproxy haproxy-1.7.9]# make TARGET=linux26 PREFIX=/usr/local/haproxy
[root@haproxy haproxy-1.7.9]# make install PREFIX=/usr/local/haproxy

[root@haproxy haproxy-1.7.9]# mkdir /usr/local/haproxy/conf
[root@haproxy haproxy-1.7.9]# 
cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
#参数说明
TARGET=linux31 #内核版本,使用uname -r查看内核
ARCH=x86_64 #系统位数
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy为haprpxy安装路径
复制脚本
[root@haproxy haproxy-1.7.9]# cp examples/haproxy.init /etc/init.d/haproxy
[root@haproxy haproxy-1.7.9]# chmod a+x /etc/init.d/haproxy
[root@haproxy haproxy-1.7.9]# chkconfig --add haproxy
[root@haproxy haproxy-1.7.9]# chkconfig haproxy on
[root@haproxy haproxy-1.7.9]# chkconfig --list haproxy
在线安装
安装yum install haproxy 
查看配置rpm -qc haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy

配置

根据功能、用途不同,其配置文件主要由5部分组成,分别为global部分,defaults部分,frontend部分、backend部分、listen部分

1)global部分
	用于设置全局配置参数,属于进程级的配置,通常用操作系统配置相关
###########全局配置#########
global
  log 127.0.0.1 local0 #全局的日志配置,local0是日志设备,info表示日志级别。其中日志级别有err, warning, info, debug 4种。这个配置表示使用127.0.0.1上的rsyslog服务中的local0日志设备,记录日志等级为info
  daemon #以后台形式运行harpoxy,推荐运行模式
  nbproc 1 #设置进程数量,默认只启动一个进程;建议该值设置时小于CPU核数
  maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
  #user haproxy #运行haproxy的用户
  #group haproxy #运行haproxy的用户所在的组
  pidfile /usr/local/haproxy/logs/haproxy.pid #haproxy 进程PID文件
  #ulimit-n 819200 #ulimit 的数量限制
  #chroot /usr/share/haproxy #chroot运行路径
  #debug #haproxy 调试级别,建议只在开启单进程的时候调试
  #quiet

2) defaults部分
	默认参数的配置部分。在些部分设置的参数,默认会自动引用到下面的frontend, backend和listen部分
########默认配置############
defaults
  log global
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK 
tcp模式:在此模式下,客户端和服务器端间将建立一个全双工的连接,不会对七层报文做任何检查,为默认的模式;经常用于SSL, SSH, SMTP等应用
	http模式:在此模式下,客户端请求在转发至后端服务器前将会被深度分析,所有不与RFC格式兼容的请求都会被拒绝
health模式:目前已经被废除
  option httplog #日志类别,采用httplog
  option dontlognull #不记录健康检查日志信息
  retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
  #option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip 【for httpd X-Forwarded-For】
  option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
  #option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持
  option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
  maxconn 4096 #默认的最大连接数
  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 #设置默认负载均衡方式,最小连接数

3) frontend部分
	用于设置接收用户请求的前端虚拟节点。frontend可以根据ACL规则直接指定要使用的后端backend
########frontend前端配置##############
frontend www #通过frontend关键字定义了一个名为"www"的前端虚拟节
  bind *:80 #此选项用于定义一个或者几个监听的套接字,只能在frontend和listen中定义
	格式如下: bind [<address>:[port_range]] [interface]; 
mode            http
        log             global #使用global段中定义的日志格式
        option          httplog # HAProxy日志是不记录HTTP请求的,此选项的作用是启用日志记录HTTP请求
        option          dontlognull
        option          nolinger
        option          http_proxy
        maxconn         8000
        timeout client  30s
option forwardfor     #此选项的作用是保证后端服务器可记录客户端真实的IP
# layer3: Valid users
	acl allow_host src 192.168.200.150/32
	http-request deny if !allow_host
	# layer7: prevent private network relaying
	acl forbidden_dst url_ip 192.168.0.0/24
	acl forbidden_dst url_ip 172.16.0.0/12
	acl forbidden_dst url_ip 10.0.0.0/8
	http-request deny if forbidden_dst
      default_backend test-proxy-srv #指定后端默认的服务器池

4) backend部分
	用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求
backend htmpool
	mode http 
	option redispatch #此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入cookie中,以保证会话的session持久性。而如果后端服务器出现故障,客户端的cookie是不会刷新的,这就会造成无法访问。此时,如果设置了此参数,就会将客户的请求强制定向到另外一台健康的后端服务器上,以保证服务正常
	option abortonclose #此参数可以在服务器负载很高的情况下,自动结束当前队列中处理时间比较长的连接
	balance roundrobin #指定负载均衡算法
roundrobin 基于权重进行轮叫调度的算法 			
static-rr基于权重进行轮叫调度的算法,不过此算法为静态算法,在运行时调整其服务器权重不会生效
source基于请求源IP的算法。此算法先对请求的源IP进行HASH运算,然后将结果与后端服务器的权重总数相除后转发至某台匹配的后端服务器。这种方式可以使同一个客户端IP的请求始终转发到某特定的后端服务器			
leastconn此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法 ,例如数据库负载均衡			
uri此算法会对部分或整个URI进行HASH运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上		
uri_param此算法会根据URL路径中的参数进行转发,这样可保证在后端真实服务器数据不变时,同一个用户的请求始终分发到同一台机器上			
hdr此算法根据HTTP头进行转发,如果指定的HTTP头名称不存在,则使用roundrobin算法 进行策略转发
	cookie SERVERID  #表示允许向cookie插入SERVERID,每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义
	option httpchk GET /index.php #此选项表示{不建议使用}
格式如下option httpchk <method> <uri> <version>
ethod表示HTTP请求的方式,常用的有OPTIONS,HEAD, GET几种方式。一般的健康检查可以采用HEAD方式进行,而不是采用GET方式,这是因为HEAD方式没有数据返回,仅检查响应报文的状态码是不是200.因此相对于GET, HEAD的方式更简单、更快
uri表示要检测的URL地址
version指定心跳检测时的HTTP的版本号
	server web1 10.1.1.1:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
	server web2 10.1.1.2:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3
# server用于定义多台后端真实服务器
server <name> <address>:[port] [param*]
name为后端真实服务器指定一个内部名称,随便定义一个即可
address:port指定后端服务器的IP地址及端口	
aram*参数  常用的参数:
	check 	表示启用对此后端服务器执行健康状态检查
	inter	设置健康状态检查的时间间隔,单位是毫秒
	rise 	检查多少次认为服务器可用
	fall	检查多少次认为服务器不可用
	weight 	设置服务器的权重,默认为1, 最大为256。 设置为0表示不参与负载均衡
	backup	设置备份服务器,用于所有后端服务器全部不可用时
	cookie	为指定的后端服务器设置cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中,其目的在于实现持久连接的功能	
backend用于定义一个名称为htmpool的后端服务器组,根据需要可以定义多个
5) listen用于配置HAProxy监控页面相关的参数
listen admin_status
	bind 0.0.0.0:9188
	mode http 
	log 127.0.0.1 local0 err
	stats refresh 30s #设置监控统计页面自动刷新的时间
	stats uri /haproxy-status		#监控页面访问的URI路径					
	stats realm Welcome login  #设置登录监控页面时,密码框上的提示信息
	stats auth admin:admin #设置登录监控页面的用户名,密码。用户密码用冒号隔开,可以设置多个,每行一个
	stats hide-version #在监控页面上隐藏HAProxy的版本号
	stats admin if TRUE #设置此选项,可在监控页面上启用、禁用后端服务器,仅在1.4.9版本以后生效
通过HAProxy的ACL规则实现智能负载均衡	
        # layer3: Valid users
        acl allow_host src 192.168.200.150/32
        http-request deny if !allow_host
        # layer7: prevent private network relaying
        acl forbidden_dst url_ip 192.168.0.0/24
        acl forbidden_dst url_ip 172.16.0.0/12
        acl forbidden_dst url_ip 10.0.0.0/8
        http-request deny if forbidden_dst

ACL规则主要完成如下两种功能:
1、通过设置的ACL规则检查客户端请求是否合法。如果符合ACl规则要求,那么将放行;如果不符合规则,则直接中断请求
2、符合ACL规则要求的请求将被转发到后端的指定backend服务器,进而实现基于ACL规则的负载均衡
HAProxy的ACL规则常定义在frontend段中,格式如下:
acl <acl名称> <acl方法> -i [匹配的路径或文件]
常用的acl方法:

hdr_reg(host)    #根据正则表达式匹配
hdr_dom(host)   #域名
hdr_beg(host)    #用什么开头
url_sub         #url包含什么字符
url_dir        #ull目录名
path_end   
path_beg
	
-i   表示不区分大小写
示例1:
acl www_policy		hdr_reg(host)  -i 	^(www.z.cn|z.cn)
acl bbs_policy		hdr_dom(host)  -i   bbs.z.cn 
acl url_policy      url_sub		   -i   buy_sid=
use_backend   server_www   if www_policy
use_backend   server_app   if bbs_policy
use_backend   server_bbs   if url_policy
default_backend server_cache 
示例2:
acl  url_static    path_end    .gif .png .jpg .css .js
acl  host_www 	   hdr_beg(host)   -i www 
acl  host_static   hdr_beg(host)   -i img. vedio. download. ftp.
use_backend  static   if host_static || host_www url_static
use_backend  www      if host_www
default_backend    server_cache

管理

(编译安装)
启动:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
查看HAProxy进程 
# ps aux | grep haproxy
查看端口
# netstat -antp | grep -e 80 -e 9188
重启haproxy 
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st `cat /var/run/haproxy.pid`  
停止haproxy 
# killall haproxy
(yum安装)
启动:
systemctl start haproxy
systemctl stop haproxy
systemctl restart haproxy

监控平台:
http://127.0.0.1:9188/haproxy-status admin/admin

log

在这里插入图片描述

参数文件
vim /etc/sysconfig/rsyslog 
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
# -c 2 linux6默认有 -r允许接收日志
SYSLOGD_OPTIONS="-c 2 -r"
# vim /etc/rsyslog.conf
# Provides UDP syslog reception
ModLoad imudp
UDPServerRun 514
# Provides TCP syslog reception
ModLoad imtcp
InputTCPServerRun 514
#添加
local0.*                    /var/log/haproxy.log
重启
systemctl restart rsyslog.service

调度web

#
# demo config for Proxy mode
# 

global
        maxconn         20000
	    ulimit-n	50000
        log             127.0.0.1 local0
        uid             200
        gid             200
        chroot          /var/empty
	    nbproc		1
        daemon
		pidfile /var/run/haproxy.pid
defaults
	mode http
	retries 3
	timeout connect 5s
	timeout client 10s
	timeout server 30s
	timeout check 2s
	
frontend test-proxy
	    bind		*:80
        mode            http
        log             global
        option          httplog
        option          dontlognull
        option          nolinger
        option          http_proxy
        maxconn         8000
        timeout client  30s
		#bind-process    2
        acl host_test hdr_dom(host) -i www.mysqlx.com

        use_backend server_test if host_test
		#直接使用ip是找不到服务的,就走默认的,完美解决IP访问
	    default_backend server_test

backend server_test
	mode            http
	option		redispatch
	option		abortonclose
	balance		roundrobin
	cookie		SERVERID
	#option	httpchk HEAD /status.html
	server test1 192.168.10.1:8080 cookie test1 weight 3 check inter 2000 rise 1 fall 2
	server test2 192.168.10.2:80 cookie test2 weight 3 check inter 2000 rise 1 fall 2


listen admin_status
	bind 0.0.0.0:9188
	mode http 
	log 127.0.0.1 local0 err
	stats refresh 30s
	stats uri /haproxy-status							
	stats realm Welcome login 
	stats auth admin:admin 
	stats hide-version 
	stats admin if TRUE

调度mysql

listen mysql
    bind *:3366
    mode tcp
    balance roundrobin
    server mysql1 192.168.122.40:3306 weight 1  check inter 1s rise 2 fall 2
server mysql2 192.168.122.50:3306 weight 1  check inter 1s rise 2 fall 2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值