设为首页 收藏本站
查看: 1159|回复: 0

[经验分享] haproxy (1)

[复制链接]

尚未签到

发表于 2019-1-1 11:51:54 | 显示全部楼层 |阅读模式
  HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
  

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

  ————百度百科
  

  Big O: 评判数据结构复杂度
  O(1):
  O(logN): 红黑树
  O(n)
  O(n^2)
  O(2^n)
  

  

  haproxy: 弹性二叉树
  数据结构:
  

  Remote Desktop Protocol
  Windows: 3389
  

  

  HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。
  

  HAProxy目前主要有两个版本:
  

  1.4——提供较好的弹性(负载):衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。
  客户端侧的长连接(client-side keep-alive)----
  TCP加速(TCP speedups)
  响应池(response buffering)----响应缓冲
  RDP协议----Remote Desktop Protocol  Windows: 3389;以windows的远程桌面做负载
  基于源的粘性(source-based stickiness)----同一IP只会到同一上级服务器
  更好的统计数据接口(a much better stats interfaces)----作访问控制
  更详细的健康状态检测机制(more verbose health checks)
  基于流量的健康评估机制(traffic-based health)
  支持HTTP认证
  服务器管理命令行接口(server management from the CLI)
  基于ACL的持久性(ACL-based persistence)
  日志分析器
  

  1.3——内容交换和超强负载:衍生于1.2版本,并提供了额外的新特性。
  内容交换(content switching):基于任何请求标准挑选服务器池;
  ACL:编写内容交换规则;
  负载均衡算法(load-balancing algorithms):更多的算法支持;
  内容探测(content inspection):阻止非授权协议;
  透明代理(transparent proxy):在Linux系统上允许使用客户端IP直接连入服务器;
  内核TCP拼接(kernel TCP splicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率;
  分层设计(layered design):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力;
  快速、公平调度器(fast and fair scheduler):为某些任务指定优先级可实现理好的QoS;
  会话速率限制(session rate limiting):适用于托管环境;
  

  

  支持的平台及OS:
  x86、x86_64、Alpha、SPARC、MIPS及PARISC平台上的Linux 2.4;
  x86、x86_64、ARM (ixp425)及PPC64平台上的Linux2.6
  UltraSPARC 2和3上的Sloaris 8/9;
  Opteron和UltraSPARC平台上的Solaris 10;
  x86平台上的FreeBSD 4.1-8;
  i386, amd64, macppc, alpha, sparc64和VAX平台上的OpenBSD 3.1-current;
  

  若要获得最高性能,需要在Linux 2.6或打了epoll补丁的Linux 2.4上运行haproxy 1.2.5以上的版本。haproxy 1.1l默认使用的polling系统为select(),其处理的文件数达数千个时性能便会急剧下降。1.2和1.3版本默认的为poll(),在有些操作系统上可会也会有性能方面的问题,但在Solaris上表现相当不错。HAProxy 1.3在Linux 2.6及打了epoll补丁的Linux 2.4上默认使用epoll,在FreeBSD上使用kqueue,这两种机制在任何负载上都能提供恒定的性能表现。
  

  在较新版本的Linux 2.6(>=2.6.27.19)上,HAProxy还能够使用splice()系统调用在接口间无复制地转发任何数据,这甚至可以达到10Gbps的性能。
  

  基于以上事实,在x86或x86_64平台上,要获取最好性能的负载均衡器,建议按顺序考虑以下方案。
  Linux 2.6.32及之后版本上运行HAProxy 1.4;
  打了epoll补丁的Linux 2.4上运行HAProxy 1.4;
  FreeBSD上运行HAProxy 1.4;
  Solaris 10上运行HAProxy 1.4;
  

  

  性能
  

  HAProxy借助于OS上几种常见的技术来实现性能的最大化。
  单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
  O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。
  在任何可用的情况下,单缓冲(从磁盘空间到内核空间额内存,直接调用,不要复制到用户进程空间)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;
  借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);
  内存分配器(每建立会话,会做内存空间保存会话的数据,内核申请内存,当内核申请较大,内存需要到(内存分配器),否则会产生内存碎片,影响性能)在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
  树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
  优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;
  精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
  

  所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。
  

  在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。
  

  可以从三个因素来评估负载均衡器的性能:
  会话率:会话创建能力,单位时间创建多少会话
  会话并发能力:负载均衡器上承受多少会话同时就行
  数据率:会话并发时数据交换能力
  

  LB解决方案

      硬件:
  F5:BIG IP
  Citrix: NetScaler
  A10: A10
  RedWare
  软件:
  4 layer:lvs;haproxy
  7 layer(http):httpd (tomcat);nginx;haproxy (http);ats(apache traffic server);apache
          mysql: mysql-porxy
  缓存:varnish, squid
  ats
  

  lvs: 400W
  haproxy: 3W
  
  
  

  http代理:
  正向代理:为客户端代为上网请求,内容缓存本地服务器,起到代理的作用。(代为客户端在互联网取数据)
  问题:(1)无法对上网加速

  (2)对于内容无法访问控制

  反向代理:Haproxy;nginx。代表某个服务器响应客户端请求,接受请求;一手托两家爱丽接受请求,从服务器封装给客户端。

  

  私有代理:为部分人代理
  公共代理:为所有人代理
  

  代理的作用:
  访问控制、web缓存(加速)、反向代理、内容路由(根据流量及内容类型等条件将请求转发至特定的服务器)、转码器
  

  在代理服务器上添加Via首部
   

  

  

  缓存的作用:
  减少冗余内容的传输;
  节省带宽、缓解网络瓶颈
  降低了对原始服务器的请求吃力
  降低了传输延迟
  

  HAProxy:只是http协议的反向代理,但支持tcp层对基于tcp的应用层做LB;
  

  HAPorxy:
  安装:
  CentOS 6.4+:
  yum install haproxy
  

  配置文件:/etc/haproxy/haproxy.cfg
  服务脚本:/etc/rc.d/init.d/haproxy
  主程序:/usr/sbin/haproxy
  

  nginx:
  upstream s1 {
  ip_hash
  server
  server
  }
  

  upstream s2 {
  

  }
  

  server {
  listen
  server_name
  proxy_pass
  

  }
  

  server {
  

  }
  

  haproxy:
  frontend
  backend
  listen(固定frontend;backend)
  default(公共配置)
  

  配置的组成部分:
  全局配置:
  global
  代理配置:
  defaults, frontend, backend, listen
  

  优先级:
  命令行参数、global、proxies
  


  [root@node200 ~]# yum info haproxy
  已加载插件:fastestmirror, refresh-packagekit, security
  Loading mirror speeds from cached hostfile
  * base: mirrors.aliyun.com
  * epel: mirror01.idc.hinet.net
  * extras: mirrors.163.com
  * updates: mirrors.aliyun.com
  可安装的软件包
  Name        : haproxy
  Arch        : x86_64
  Version     : 1.5.4
  Release     : 2.el6_7.1
  Size        : 792 k
  Repo        : updates
  Summary     : HAProxy is a TCP/HTTP reverse proxy for high availability
  : environments
  URL         : http://www.haproxy.org/
  License     : GPLv2+
  Description : HAProxy is a TCP/HTTP reverse proxy which is particularly suited
  : for high availability environments. Indeed, it can:
  :  - route HTTP requests depending on statically assigned cookies
  :  - spread load among several servers while assuring server
  :    persistence through the use of HTTP cookies
  :  - switch to backup servers in the event a main one fails
  :  - accept connections to special ports dedicated to service
  :    monitoring
  :  - stop accepting connections without breaking existing ones
  :  - add, modify, and delete HTTP headers in both directions
  :  - block requests matching particular patterns
  :  - persists clients to the correct application server depending
  :    on application cookies
  :  - report detailed status as HTML pages to authenticated users
  :    from a URI intercepted from the application
  [root@node200 ~]# yum install haproxy -y
  [root@node200 haproxy]# cp haproxy.cfg{,.bak}
  [root@node200 haproxy]# ls
  haproxy.cfg  haproxy.cfg.bak
  [root@node200 ~]# vim /etc/rsyslog.conf

  # Provides UDP syslog reception
  12 # Provides UDP syslog reception
  13 $ModLoad imudp
  14 $UDPServerRun 514
  61 local7.*                                                /var/log/boot.log
   63 local2.*                                                /var/log/haproxy.log

  [root@node200 ~]# service rsyslog restart
  关闭系统日志记录器:                                       [确定]
  启动系统日志记录器:                                       [确定]
  [root@node200 ~]# ss -uan
  State      Recv-Q Send-Q       Local Address:Port         Peer Address:Port
  UNCONN     0      0                        *:514                     *:*
  UNCONN     0      0                        *:631                     *:*
  UNCONN     0      0                       :::514                    :::*
  


  [root@node2 ~]# getenforce

  Enforcing
  [root@node2 ~]# setenforce 0
  [root@node2 ~]# iptables -F
  [root@node2 ~]# echo "node 2" > /var/www/html/index.html

  [root@node2 ~]# service httpd reload
  [root@node2 ~]# getenforce
  Enforcing
  [root@node2 ~]# setenforce 0
  [root@node2 ~]# iptables -F
  
  [root@node2 ~]# curl http://127.0.0.1
  node 2
  


  [root@node3 ~]# echo "node 3" > /var/www/html/index.html
  [root@node3 ~]# setenforce 0
  [root@node3 ~]# iptables -F
  [root@node3 ~]# service httpd reload
  重新载入 httpd:
  [root@node3 ~]# curl http://127.0.0.1
  node 3
  


  [root@node200 ~]# curl http://192.168.112.130
  node 2
  [root@node200 ~]# curl http://192.168.112.140
  node 3
[root@node200 haproxy]# vim haproxy.cfg
  63 frontend  main *:80
  64   #  acl url_static       path_beg       -i /static /images /javascript /s    tylesheets
  65    # acl url_static       path_end       -i .jpg .gif .png .css .js
  66
  67     #use_backend static          if url_static
  68     default_backend             appsrvs
  69
  70 #---------------------------------------------------------------------
  71 # static backend for serving up images, stylesheets and such
  72 #---------------------------------------------------------------------
  73 #backend static
  74  #   balance     roundrobin
  75   #  server      static 127.0.0.1:4331 check
  76
  77 #---------------------------------------------------------------------
  78 # round robin balancing between the various backends
  79 #---------------------------------------------------------------------
  80 backend appsrvs
  81     balance     roundrobin
  82     server  node2 192.168.112.130:80 check
  83     server  node3 192.168.112.140:80 check
  84 #    server  app3 127.0.0.1:5003 check
  85  #   server  app4 127.0.0.1:5004 check
  [root@node200 haproxy]# ss -tuanlp | grep 80
  udp    UNCONN     0      0                      *:514                   *:*      users:(("rsyslogd",30080,3))
  udp    UNCONN     0      0                     :::514                  :::*      users:(("rsyslogd",30080,4))
  tcp    LISTEN     0      128                    *:80                    *:*      users:(("haproxy",30120,5))
  [root@node200 haproxy]# firefox http://192.168.112.200






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-658236-1-1.html 上篇帖子: 如何把一个web集群由HTTP转换为HTTPS(LVS+HAProxy+SSL) 下篇帖子: haproxy(2)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表