互联网架构路途高可用

Linux之HAProxy

2016-03-07  本文已影响1509人  魏镇坪

互联网架构基础知识

一、网站常见架构

二、运维法则

三、网站灰度发布的步骤

四、web常见术语

衡量一个网站的稳定性和承载能力,一般比较好的网站每个UV平均15个PV

连接状态为Established,一般情况下,使用日PV/18(小时),可以计算一个粗略的活动连接数,在短链的情况下,活动连接数与QPS比较接近

连接状态为:time_wait close_wait,是NEW的请求

测量一个网站的重要指标,架构设计承载需要是最高并发峰值的5到10倍

代理的基础知识

代理的作用

以提供加速

以提高安全性和流量分发

根据流量及内容类型等将请求转发至特定服务器

后端到代理服务器没有压缩,代理到客户端进行压缩

代理的重要性能指标

每秒建立新的连接速率

数据传输率

LB实现方式

KV数据的常用算法

对K进行hash计算,有几台cache服务器就取模多少数值,可以将每次的请求分散至不同的服务器
* 缺点
添加和删除服务器,都会带来全部缓存失效

事先虚拟一个环,环上从零开始计数,到232个数值结束,其使用32位二进制表示,把每个服务器按照特定的方式计算(如IP地址进行hash计算),其hash的结果一定会在环上的0到232之间,服务器计算的结果就分散在此环之上。缓存数据时,对key进行hash计算,按顺时针找到离的最近的一个节点存放数据。如果其中一台cache server档机,只会影响此服务器上缓存的数据,不会让缓存全部失效
* 缺点:
hash环的偏斜(多个节点计算后,节点都在环上较近位置且在环的一侧位置),可以使用虚拟服务器方法解决(将一个节点虚拟成多个节点,再分散到环上)

Linux之HAProxy

一、HAProxy简介

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

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

二、HAProxy主要版本:

1.4版本

其衍生于1.2版本,并提供额外的新特性,其中大多数是期待已久的

1.3版本

其衍生于1.2版本,并提供了额外的新特性

三、支持的平台及OS

若要获得最高性能,需要在Linux2.6或打了epoll补丁的Linux2.4上运行haproxy 1.2.5以上的版本,haproxy1.1l默认使用了polling系统为select(),其处理的文件数达数千个时性能便会急剧下降,1.2和1.3版本默认为poll(),在有些操作系统上可能会有性能方面的问题,但在Solaris上表现相当不错,HAProxy1.3在Linux2.6及打了epoll补丁的Linux 2.4上默认使用了epoll,在FreeBSD上使用Kqueue,这两种机制在任何负载上都能提供恒定的性能表现,在较新版本的Linux2.6(>=2.6.27.19)上,HAProxy还能够使用splice()系统调用在接口间无复制地转发任何数据,这甚至可达到10Gbps性能

HAProxy常规版本选择建议

四、HAProxy实现高性能的方法

显著降低了上下文切换的开销及内存占用

允许其在高并发连接中对任何连接的任何事件实现即时探测

以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽

在2.6(>=2.6.27.19)Haproxy可以实现零复制转发(zero-copy forwarding),在Linux3.5及以上的OS中还可以实现零复制启动(zero-starting)

内存分配器在固定大小的内存池中实现即时内存分配,能够显著减少创建一个会话的时长

侧重于使用作者多年前开发的弹性二叉树算法,实现了以O(log(N))的低开销来保持启动计时器命令、保持运行队列命令及管理轮询及最少连接队列

优化的首部分析功能避免了HTTP首部分析过程中重读任何区域

大部分工作在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等

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

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

配置HAProxy

安装haproxy
配置程序及配置文件

/etc/haproxy/haproxy.cfg

配置文件格式

用于设定全局配置参数

如defaults,listen,frontend和backend

时间格式

一此包含了值的参数表示时间,如超时时长,这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀

示例:

global
    daemon
    maxconn 25600
defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
frontend http-in
    bind *:80
    default_backend servers
backend servers
    server server1 127.0.0.1:8080 maxconn 32
    
配置了一个监听在所有接口的80端口上HTTP proxy服务,它转发所有的请求至后端监听在127.0.0.1:8000上的"server"
全局配置

global配置中的参数为进程级别的参数,且通常与运行的OS相关

代理

代理相关的配置可以有如下配置段

所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。

配置文件中的关键字参考

1、balance
支持的算法类型:
调度算法
示例1:
backend app
    balance     hdr(User-Agent)
    server  srv1 172.16.36.70:80 check
    server  srv2 172.16.36.71:80 check
    server  srv3 172.16.36.60:80 check
    server  srv4 172.16.36.61:80 check
    
示例2:
backend app
    balance     uri
    hash-type consistent
    server  srv1 172.16.36.70:80 check
2、bind
frontend  main
    bind *:80
    bind *:8080
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
3、mode

tcp:实例运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查;此为默认模式,通常用于SSL、SSH、SMTP等应用;
http:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝;
health:实例工作于health模式,其对入站请求仅响应“OK”信息并关闭连接,且不会记录任何日志信息;此模式将用于响应外部组件的健康状态检查请求;目前业讲,此模式已经废弃,因为tcp或http模式中的monitor关键字可完成类似功能

4、hash-type

map-based:hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。
consistent:hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。

backend app
    balance     uri
    hash-type consistent
    server  srv1 172.16.36.70:80 check
    server  srv2 172.16.36.71:80 check
    server  srv3 172.16.36.60:80 check
    server  srv4 172.16.36.61:80 check
frontend main *:80
    acl url_static path_beg -i /static /images /javascript /stylesheets
    acl url_static path_end -j .jpg .gif .png .css .js
    use_backend static if url_static
    default_backend app
backend https_relay
    mode tcp
    option check OPTIONS * HTTP/1.1\r\nHost:\ www.zhenping.me
    server apache1 172.16.36.70 check prot 80

对server172.16.36.70使用option check定义的方法进行检测,但可以使用80端口进行健康状态检测

需要留意的是,这两个关键字都会返回302状态码,这将使得客户端使用同样的HTTP方法获取指定的URL,对于非GET方法的场景(如POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其它方法的。如果的确有这种问题,可以使用errorloc303来返回303状态码给客户端

backend webserver
    server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie serv01
    server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie serv02
    errorfile 403 /etc/haproxy/errorpages/sorry.htm
    errorfile 503 /etc/haproxy/errorpages/sorry.htm
配置案例

http服务器配置示例

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 30000

listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE


frontend http-in
    bind *:80
    mode http
    log global
    option httpclose
    option logasap
    option dontlognull
    capture request  header Host len 20
    capture request  header Referer len 60
    default_backend servers

frontend healthcheck
    bind :1099
    mode http
    option httpclose
    option forwardfor
    default_backend servers

backend servers
  balance roundrobin
    server websrv1 192.168.10.11:80 check maxconn 2000
    server websrv2 192.168.10.12:80 check maxconn 2000
    


负载均衡MySQL服务的配置示例

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

defaults
    mode                    tcp
    log                     global
    option                  httplog
    option                  dontlognull
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 600

listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE


frontend mysql
    bind *:3306
    mode tcp
    log global
    default_backend mysqlservers

backend mysqlservers
    balance leastconn
    server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
    server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300

ACL

Haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息做出转发决策,这大大增加了其配置弹性,其配置法则通常分为两步,首先先定义ACL,即定义一个测试条件,而后在条件得到满足时执行特定的动作,如阻止请求或转发至某特定的后端

同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:“与”(默认即为与操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)

总结

balance的算法:
acl creterion的方法
动静分离示例:

global
   log         127.0.0.1 local2

   chroot      /var/lib/haproxy
   pidfile     /var/run/haproxy.pid
   maxconn     4000
   user        haproxy
   group       haproxy
   daemon

   # turn on stats unix socket
   stats socket /var/lib/haproxy/stats

defaults
   mode                    http
   log                     global
   option                  httplog
   option                  dontlognull
   option http-server-close
   option forwardfor       except 127.0.0.0/8
   option                  redispatch
   retries                 3
   timeout http-request    10s
   timeout queue           1m
   timeout connect         10s
   timeout client          1m
   timeout server          1m
   timeout http-keep-alive 10s
   timeout check           10s
   maxconn                 30000

listen stats
   mode http
   bind 0.0.0.0:1080
   stats enable
   stats hide-version
   stats uri     /haproxyadmin?stats
   stats realm   Haproxy\ Statistics
   stats auth    admin:admin
   stats admin if TRUE


frontend http-in
   bind *:80
   mode http
   log global
   option httpclose
   option logasap
   option dontlognull
   capture request  header Host len 20
   capture request  header Referer len 60
   acl url_static       path_beg       -i /static /images /javascript /stylesheets
   acl url_static       path_end       -i .jpg .jpeg .gif .png .css .js

   use_backend static_servers          if url_static
   default_backend dynamic_servers

backend static_servers
   balance roundrobin
   server imgsrv1 172.16.200.7:80 check maxconn 6000
   server imgsrv2 172.16.200.8:80 check maxconn 6000

backend dynamic_servers
     cookie srv insert nocache
   balance roundrobin
   server websrv1 172.16.200.7:80 check maxconn 1000 cookie websrv1
   server websrv2 172.16.200.8:80 check maxconn 1000 cookie websrv2
   server websrv3 172.16.200.9:80 check maxconn 1000 cookie websrv3
上一篇下一篇

猜你喜欢

热点阅读