Haproxy 入门、监控和 statsd 打点指北

作为一个奇奇怪怪的前端码畜,偶尔就会和一些奇奇怪怪的事情打交道,前一阵子也算是挺忙的了(尽管只是个没有更新博客,连续跳票的借口)。

这次使用 haproxy,是因为他作为负载均衡和反向代理而言配置起来比 Nginx 简单,并且自己就提供了监听页面。

我们来看一个完整的配置文件就知道了:

global
    daemon
    maxconn 500
    ulimit-n 8000
    user daemon
    group deamon
    chroot /var/empty
    pidfile /var/run/haproxy.pid
    log localhost local0 notice

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

frontend http-front
    bind *:80
    option httpclose
    maxconn 100

    reqirep ^Host:\\ www.abc.com Host:\\ abc.com

    acl host_abc_com hdr(host)      -i abc.com
    acl host_cn      hdr_end(host)  -i .cn
    acl host_xyz     hdr_beg(host)  -i xzy.
    acl url_xxx      url_reg        -i ^/xxx

    use_backend host-abc-com if host_abc_com
    use_backend host-cn      if host_cn
    use_backend host-xyz-url-xxx if host_xyz url_xxx
    default_backend default-servers

backend default-servers
    server default-servers1 127.0.0.1:8000 maxconn 32

backend host-abc-com
    balance roundrobin
    option httpcheck
    option forwardfor
    option httpclose
    option redispatch
    retries 3
    server abc-com1 192.168.1.100:80 check inter 2000 rise 2 fall 3 maxconn 32
    server abc-com2 192.168.1.101:80 check inter 2000 rise 2 fall 3 maxconn 32

backend host-cn
    balance roundrobin
    option httpcheck
    option forwardfor
    option httpclose
    option redispatch
    retries 3
    server abc-com1 192.168.1.100:80 check inter 2000 rise 2 fall 3 maxconn 32
    server abc-com2 192.168.1.101:80 check inter 2000 rise 2 fall 3 maxconn 32
    server abc-com3 192.168.1.102:80 check inter 2000 rise 2 fall 3 maxconn 32 backup

backend host-xyz-url-xxx
    balance roundrobin
    option httpcheck
    option forwardfor
    option httpclose
    option redispatch
    retries 3
    server abc-com1 192.168.1.100:80 check inter 2000 rise 2 fall 3 maxconn 32
    server abc-com2 192.168.1.101:80 check inter 2000 rise 2 fall 3 maxconn 32 

相比起 Nginx 来说,可读性应该来说是很强的了,于是我写了一个配置生成器,就能够实现动态的配置生成了,由于这是我们的内部代码,不方便公开啦,不过可以看到,这一切都是非常简单就能实现的。

关于配置文件,只要通过看一下文档就可以知道怎么写了。

启动:

haproxy -D -f haproxy.cnf -p haproxy.pid -sf $(cat haproxy.pid)

Haproxy 自带了分析与监控(统计),这样可以设定一个页面来查看各个服务的健康状况。

要设置健康检查和健康检查的条件,只要在 backend 中设置:

  option httpchk GET /ping
  http-check expect ! rstatus ^5

以上条件的意思是:检查是否有 /ping,如果不是 5xx 则代表健康检查通过。

统计设置:

listen stats
  bind :9000
  mode http
  stats enable
  stats hide-version
  stats realm Haproxy Statistics
  stats uri /haproxy_stats
  stats auth test:test

通过 url 来设置页面路径,通过 auth 来设置用户名和密码。所以我们访问 localhost:9000/haproxy_stats 就能访问统计面板。

之后老板又多了新需求,需要打点,这里用到了 Grafana,一个开源的统计和监控程序,Haproxy 中的统计数据通过 ;csv 可以输出纯数据版用以给程序使用。

我们用过 Haproxy 的统计数据达到 statsd。

这里用到了一个开源的 Python 程序,可以简单用 supervisor 跑起来:https://github.com/softlayer/haproxy-statsd,把配置文件写好之后即可使用:

[haproxy-statsd]
haproxy_url = http://127.0.0.1:1936/;csv
haproxy_user =
haproxy_password =
statsd_host = 127.0.0.1
statsd_port = 8125
statsd_namespace = haproxy.(HOSTNAME)
interval = 5

然后在 Grafana 中可以用以下路径访问:stats.gauges.[namespace].[pxname].[svname].[statname]

之后,我们通过配置 Grafana 就可以实现监控,具体的不多说,看文档:http://docs.grafana.org/features/datasources/graphite/


后记:由于这是十月份开的坑,我十二月才……Emmm,所以……有的东西有点忘了,以后再用了在补充。

如果您觉得文章不错,可以通过赞助支持我

标签: 知识, 语法, 命令, 使用

添加新评论