HAProxy简介

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy甚至还支持Mysql的均衡负载。
它专门是一款的用于均衡负载的应用代理,其自身并不能提供http服务,而Nginx,ApacheProxy,lighttpd,Cheroke也是带反向代理均衡负载的产品,但它们同时也是WEB服务器。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。

HAProxy配置主要有五部分:

global
参数是进程级的,通常和操作系统(OS)相关,这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改

defaults
配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件

frontend
接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择)。

backend
后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。

listen
Frontend和Backend的组合体。

安装简单配置

https://src.fedoraproject.org/repo/pkgs/haproxy/ 软件包下载

HAProxy安装配置详解

[[email protected] yum.repos.d]# cd /var/www/html/ #配置web1
[[email protected] html]# ll
total 0
[[email protected] html]# echo "node1" >index.html

[[email protected] yum.repos.d]# cd /var/www/html/
[[email protected] html]# ll
total 0
[[email protected] html]# echo "node2">index.html  #配置web2
[[email protected] html]# curl "http://192.168.23.102:80"  #正常访问web2
node2
[[email protected] html]# curl "http://192.168.23.101:80" #正常访问web1
node1
[[email protected] html]#

[[email protected] haproxy]# tar -xvf haproxy-2.1.3.tar.gz  #解压软件包
[[email protected] haproxy]# ls -lrt
total 2620
-rw-r--r--  1 zhaiky zhaiky 2675529 Feb 12 02:41 haproxy-2.1.3.tar.gz
drwxrwxr-x 12 root   root      4096 Feb 12  2020 haproxy-2.1.3
[[email protected] haproxy]# ln -s haproxy-2.1.3 haproxy  #建立软链接
[[email protected] haproxy]# ls -lrt
total 2620
-rw-r--r--  1 zhaiky zhaiky 2675529 Feb 12 02:41 haproxy-2.1.3.tar.gz
lrwxrwxrwx  1 root   root        13 Feb 12 02:52 haproxy -> haproxy-2.1.3
drwxrwxr-x 12 root   root      4096 Feb 12  2020 haproxy-2.1.3
[[email protected] haproxy]# cd haproxy
[[email protected] haproxy]# pwd
/data/haproxy/haproxy
[[email protected] haproxy]# make TARGET=generic PREFIX=/data/haproxyinstall   #T编译 ARGET variable :
  - linux22     for Linux 2.2
  - linux24     for Linux 2.4 and above (default)
  - linux24e    for Linux 2.4 with support for a working epoll (> 0.21)
  - linux26     for Linux 2.6 and above
  - linux2628   for Linux 2.6.28, 3.x, and above (enables splice and tproxy)
  - solaris     for Solaris 8 or 10 (others untested)
  - freebsd     for FreeBSD 5 to 10 (others untested)
  - netbsd      for NetBSD
  - osx         for Mac OS/X
  - openbsd     for OpenBSD 3.1 and above
  - aix51       for AIX 5.1
  - aix52       for AIX 5.2
  - cygwin      for Cygwin
  - generic     for any other OS or version.
  - custom      to manually adjust every setting

  CC      src/ev_poll.o
  CC      src/mux_h2.o
  CC      src/stream.o
  CC      src/mux_fcgi.o
  CC      src/cfgparse-listen.o
  CC      src/http_ana.o
  CC      src/stats.o
  CC      src/mux_h1.o
  CC      src/flt_spoe.o
  CC      src/server.o
  CC      src/cfgparse.o
  CC      src/checks.o
  CC      src/backend.o
  CC      src/log.o
  CC      src/peers.o
  CC      src/cli.o
  CC      src/haproxy.o
  CC      src/stick_table.o
  CC      src/standard.o
  CC      src/sample.o
  CC      src/proxy.o
  CC      src/stream_interface.o
  CC      src/pattern.o
  CC      src/dns.o
  CC      src/proto_tcp.o
  CC      src/listener.o
  CC      src/cfgparse-global.o
  CC      src/h1.o
  CC      src/http_rules.o
  CC      src/http_fetch.o
  CC      src/cache.o
  CC      src/session.o
  CC      src/fcgi-app.o
  CC      src/connection.o
  CC      src/tcp_rules.o
  CC      src/filters.o
  CC      src/task.o
  CC      src/mworker.o
  CC      src/map.o
  CC      src/h1_htx.o
  CC      src/trace.o
  CC      src/flt_trace.o
  CC      src/acl.o
  CC      src/http_htx.o
  CC      src/flt_http_comp.o
  CC      src/payload.o
  CC      src/vars.o
  CC      src/debug.o
  CC      src/mux_pt.o
  CC      src/http_act.o
  CC      src/h2.o
  CC      src/queue.o
  CC      src/fd.o
  CC      src/proto_uxst.o
  CC      src/lb_chash.o
  CC      src/ring.o
  CC      src/frontend.o
  CC      src/raw_sock.o
  CC      src/xprt_handshake.o
  CC      src/htx.o
  CC      src/memory.o
  CC      src/applet.o
  CC      src/channel.o
  CC      src/signal.o
  CC      src/lb_fwrr.o
  CC      src/ev_select.o
  CC      src/sink.o
  CC      src/http_conv.o
  CC      src/proto_sockpair.o
  CC      src/mworker-prog.o
  CC      src/activity.o
  CC      src/lb_fwlc.o
  CC      src/http.o
  CC      src/lb_fas.o
  CC      src/uri_auth.o
  CC      src/hathreads.o
  CC      src/regex.o
  CC      src/auth.o
  CC      src/buffer.o
  CC      src/compression.o
  CC      src/proto_udp.o
  CC      src/lb_map.o
  CC      src/chunk.o
  CC      src/wdt.o
  CC      src/hpack-dec.o
  CC      src/action.o
  CC      src/xxhash.o
  CC      src/pipe.o
  CC      src/shctx.o
  CC      src/hpack-tbl.o
  CC      src/http_acl.o
  CC      src/sha1.o
  CC      src/time.o
  CC      src/hpack-enc.o
  CC      src/fcgi.o
  CC      src/arg.o
  CC      src/base64.o
  CC      src/protocol.o
  CC      src/freq_ctr.o
  CC      src/lru.o
  CC      src/hpack-huff.o
  CC      src/dict.o
  CC      src/hash.o
  CC      src/mailers.o
  CC      src/version.o
  CC      ebtree/ebtree.o
  CC      ebtree/eb32sctree.o
  CC      ebtree/eb32tree.o
  CC      ebtree/eb64tree.o
  CC      ebtree/ebmbtree.o
  CC      ebtree/ebsttree.o
  CC      ebtree/ebimtree.o
  CC      ebtree/ebistree.o
  LD      haproxy
[[email protected] haproxy]#
[[email protected] haproxy]# make install PREFIX=/data/haproxyinstall  #安装PREFIX参数与编译要一致
install: creating directory ‘/data/haproxyinstall’
install: creating directory ‘/data/haproxyinstall/sbin’
‘haproxy’ -> ‘/data/haproxyinstall/sbin/haproxy’
install: creating directory ‘/data/haproxyinstall/share’
install: creating directory ‘/data/haproxyinstall/share/man’
install: creating directory ‘/data/haproxyinstall/share/man/man1’
‘doc/haproxy.1’ -> ‘/data/haproxyinstall/share/man/man1/haproxy.1’
install: creating directory ‘/data/haproxyinstall/doc’
install: creating directory ‘/data/haproxyinstall/doc/haproxy’
‘doc/configuration.txt’ -> ‘/data/haproxyinstall/doc/haproxy/configuration.txt’
‘doc/management.txt’ -> ‘/data/haproxyinstall/doc/haproxy/management.txt’
‘doc/seamless_reload.txt’ -> ‘/data/haproxyinstall/doc/haproxy/seamless_reload.txt’
‘doc/architecture.txt’ -> ‘/data/haproxyinstall/doc/haproxy/architecture.txt’
‘doc/peers-v2.0.txt’ -> ‘/data/haproxyinstall/doc/haproxy/peers-v2.0.txt’
‘doc/regression-testing.txt’ -> ‘/data/haproxyinstall/doc/haproxy/regression-testing.txt’
‘doc/cookie-options.txt’ -> ‘/data/haproxyinstall/doc/haproxy/cookie-options.txt’
‘doc/lua.txt’ -> ‘/data/haproxyinstall/doc/haproxy/lua.txt’
‘doc/WURFL-device-detection.txt’ -> ‘/data/haproxyinstall/doc/haproxy/WURFL-device-detection.txt’
‘doc/proxy-protocol.txt’ -> ‘/data/haproxyinstall/doc/haproxy/proxy-protocol.txt’
‘doc/linux-syn-cookies.txt’ -> ‘/data/haproxyinstall/doc/haproxy/linux-syn-cookies.txt’
‘doc/SOCKS4.protocol.txt’ -> ‘/data/haproxyinstall/doc/haproxy/SOCKS4.protocol.txt’
‘doc/network-namespaces.txt’ -> ‘/data/haproxyinstall/doc/haproxy/network-namespaces.txt’
‘doc/DeviceAtlas-device-detection.txt’ -> ‘/data/haproxyinstall/doc/haproxy/DeviceAtlas-device-detection.txt’
‘doc/51Degrees-device-detection.txt’ -> ‘/data/haproxyinstall/doc/haproxy/51Degrees-device-detection.txt’
‘doc/netscaler-client-ip-insertion-protocol.txt’ -> ‘/data/haproxyinstall/doc/haproxy/netscaler-client-ip-insertion-protocol.txt’
‘doc/peers.txt’ -> ‘/data/haproxyinstall/doc/haproxy/peers.txt’
‘doc/close-options.txt’ -> ‘/data/haproxyinstall/doc/haproxy/close-options.txt’
‘doc/SPOE.txt’ -> ‘/data/haproxyinstall/doc/haproxy/SPOE.txt’
‘doc/intro.txt’ -> ‘/data/haproxyinstall/doc/haproxy/intro.txt’
[[email protected] haproxy]#
[[email protected] haproxy]# cp /data/haproxyinstall/sbin/haproxy /usr/sbin/  #建立软链接
[[email protected] haproxy]# haproxy -version 
HA-Proxy version 2.1.3 2020/02/12 - https://haproxy.org/
Status: stable branch - will stop receiving fixes around Q1 2021.
Known bugs: http://www.haproxy.org/bugs/bugs-2.1.3.html
[[email protected] haproxy]#

[[email protected] config]# pwd
/data/haproxyinstall/config
[[email protected] config]#
[[email protected] config]# more haproxy.cfg  #简单haproxy配置
global
 daemon
 maxconn 2048

defaults
 mode http
 timeout connect 5000ms
 timeout client 50000ms
 timeout server 50000ms

frontend web
 bind *:8888
 default_backend servers

backend servers
 server web1 192.168.23.101:80 maxconn 32
 server web2 192.168.23.102:80 maxconn 32

[[email protected] config]# haproxy -f /data/haproxyinstall/config/haproxy.cfg  #启动haproxy
[[email protected] config]# ps -ef|grep haproxy #查看haproxy进行
root     15149     1  0 03:24 ?        00:00:00 haproxy -f /data/haproxyinstall/config/haproxy.cfg
root     15151 13170  0 03:25 pts/2    00:00:00 grep --color=auto haproxy
[[email protected] config]# netstat -apn|grep 15149  #查看监听端口
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      15149/haproxy       
[[email protected] config]# curl "192.168.23.100:8888" #正常轮询负载
node1
[[email protected] config]# curl "192.168.23.100:8888"
node2
[[email protected] config]#

[[email protected] html]# systemctl stop httpd #停止web1服务

[[email protected] config]# curl "192.168.23.100:8888"  #由于没有加check检查,不好的服务不会驱除
<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>

 

负载均衡算法

1)roundrobin,表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法。该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
2)static-rr,表示根据权重,建议关注;每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权限是无效的。另外,它对服务器的数量没有限制。
3)leastconn,新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;
4)source,将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;
5)uri,表示根据请求的URI;表示根据请求的URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一个服务器。 一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端;该算法一般用于后端是缓存服务器; 该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
6)url_param,通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
7)hdr(name),对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.magedu.com来说,仅计算magedu字符串的hash值)以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
8)rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。为每个进来的TCP请求查询并哈希RDP cookie<name>; 该机制用于退化的持久模式,可以使同一个用户或者同一个会话ID总是发送给同一台服务器。 如果没有cookie,则使用roundrobin算法代替; 该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。

#其实这些算法各有各的用法,我们平时应用得比较多的应该是roundrobin、source和lestconn。

配置说明

[[email protected] config]# more haproxy.cfg
###########全局配置#########
global
 log 127.0.0.1 local3 
 daemon #以后台形式运行harpoxy
 nbproc 1 #设置进程数量
 maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
 #user haproxy #运行haproxy的用户
 #group haproxy #运行haproxy的用户所在的组
 #pidfile /var/run/haproxy.pid #haproxy 进程PID文件
 #ulimit-n 819200 #ulimit 的数量限制
 #chroot /usr/share/haproxy #chroot运行路径
 #debug #haproxy 调试级别,建议只在开启单进程的时候调试
 #quiet


########默认配置############
defaults
 log global        #全局日志
 mode http
 option dontlognull #不记录健康检查日志信息
 retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
 #option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
 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 #设置默认负载均衡方式,最小连接数

########统计页面配置########
listen stats
 bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
 mode http #http的7层模式
 maxconn 10 #默认的最大连接数
 stats refresh 30s #统计页面自动刷新时间
 stats uri /stats #统计页面url
 stats realm XingCloud\ Haproxy #统计页面密码框上提示文本
 stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
 stats hide-version #隐藏统计页面上HAProxy的版本信息
 stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)

########frontend前端配置##############
frontend web
 bind *:80
 option httplog    #启用http的log 
 option forwardfor  except 127.0.0.1  #启用X-Forwarded-Fo,except来自于127.0.0.1不记录
 acl node1 hdr(host) -i node1.com  #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.node1.com这个域名,就
触发node1规则
 acl node2 hdr(host) -i node2.com  #如果访问img.node2.com这个域名,就触发node2规则
 use_backend node1server if node1   #如果上面定义的node1规则被触发,即访问node1.com,就将请求分发到node1server这个作用域。
 use_backend node2server if node2   #如果上面定义的node2规则被触发,即访问node2.com,就将请求分发到node2server这个作用域。
 default_backend dynamic #不满足则响应backend的默认页面

########backend后端配置##############
backend dynamic
 mode http
#option httpchk get /index.html
 balance roundrobin
 server web1 192.168.23.101:80 maxconn 32 weight 5 check inter 2000 rise 2 fall 3
 server web2 192.168.23.102:80 maxconn 32 weight 3 check inter 2000 rise 2 fall 3
 #check inter 1500 是检测心跳频率 
 ##rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

backend node1server
 mode http
#option httpchk get /index.html
 balance roundrobin 
 server web1 192.168.23.101:80 maxconn 32 check inter 2000 rise 2 fall 3

backend node2server
 mode http
#option httpchk get /index.html
 balance roundrobin 
 server web2 192.168.23.102:80 maxconn 32 check inter 2000 rise 2 fall 3
[[email protected] config]#

[[email protected] config]# more /etc/hosts  #设置hosts,进行域名访问
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 k8smaster
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.23.100 k8smaster
192.168.23.101 k8snode01
192.168.23.102 k8snode02

192.168.23.100 node1.com
192.168.23.100 node2.com

[[email protected] config]# curl "node1.com" #正常访问到node1
node1
[[email protected] config]# curl "node1.com"
node1
[[email protected] config]# curl "node2.com" curl "node1.com" #正常访问到node2
node2
[[email protected] config]# curl "node2.com"
node2
[[email protected] config]# curl "192.168.23.100"
node2
[[email protected] config]# curl "192.168.23.100"
node1
[[email protected] config]#

http://192.168.23.100:1080/stats

HAProxy安装配置详解

 

相关文章:

  • 2021-11-19
  • 2021-05-11
  • 2021-04-01
  • 2021-11-24
  • 2021-12-19
  • 2021-11-19
猜你喜欢
  • 2021-07-18
  • 2021-08-25
  • 2021-04-10
  • 2021-08-05
  • 2018-12-21
  • 2021-11-14
  • 2021-11-20
相关资源
相似解决方案