statsd原型

Perl用起来就是爽,今天很快就完成了statsd的原型设计.
statsd分为2个worker,开始我是spawn了3个进程,其中一个用于worker子进程的管理.做完了觉得没有必要,通过shell可以很简单的作monitor.

cgi-worker:

顾名思义,以FastCGI Server的方式运行,通过unix socket和nginx通讯. cgi-worker的工作是收到request,存储到内部的
待处理队列中进行缓冲.
这部分使用了CGI::Fast和FCGI实现fastcgi接口. 开始有些小问题,CGI::Fast中BEGIN是通过监测几个ENV来确定是否是
独立模式的Request,我根据perldoc中例子作了几个测试,都运行一次就退出了,用lighty的spawn-fcgi则可以正确运行.
于是看了下spawn-fcgi的源码,也没有发现什么特殊的,于是重新看CGI::Fast的代码,找到原因.
我想自己定义ENV变量, 修改了一下:

$worker = 'worker.cgi';

initialize();

$SIG{'TERM'} = \&shutdown_cgi_worker;

my $path = $ENV{STATSD_CGI_SOCKET};
my $backlog = $ENV{STATSD_CGI_BACKLOG};

my $socket = FCGI::OpenSocket( $path, $backlog );
$CGI::Fast::Ext_Request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR,\%ENV, $socket,1);

info("$worker connect FCGI socket to: $path");

Queue则用BerkeleyDB实现, 还是比较简单的.

Sync-worker:
这部分用于读取queue中的数据,将其处理后,插入到后端mysql数据库中.
由于我将bdb tying到一个@db_queue,所以实现非常简单,bdb没有涉及到什么数据库的读写.

2个worker可以独立运行,相互不影响. 尤其是sync-worker,可以灵活掌握.
cgi-worker由于用fastcgi方式,运行效率还是很高的.

用webbench在我的mbp上作了简单测试,基本上维持在1700 rps 左右.
由于我的mbp的限制,实际运行效果应该能比这个高几倍才对.
不过即便如此,现在也足以.
至于扩展方式, 可以修改一下cgi-worker,加入process manage功能,或者更简单的,
多派生几个worker, 在nginx中用fastcgi的负载均衡来实现,nginx用起来真是太棒了.

Comments

2 Responses to “statsd原型”

  1. Tim on May 8th, 2008 2:21 pm

    Perl也这么强大的
    bdb queue是基于disk io的,也可考虑直接insert mysql

  2. nightsailer on May 18th, 2008 12:33 am

    作这个主要的目的就是为了延迟操作Mysql.所以不能直接insert mysql.
    实际上我以前曾用jdbc的批量操作,可以插入的速度还是非常快的.虽然DBD没有这个接口,
    不过这些天看效果还是不错的.

Leave a Reply