spread还是半年前的时候偶然看到的,一直没有试过。前段时间用gearman收集集群日志时,发现gearman的方式,worker不会知道client来自哪里,一条job只会一个worker来做,比较适合做分布式计算,但相比我最初设想的实时系统管理需求,还是有一定距离。于是重新翻出来spread,感觉可以根据应用系统设置不同的group,然后统一再由一个回收结果的group即可。于是有了如下试验:

  • spread安装配置:

bashwget http://www.spread.org/download/spread-src-4.1.0.tar.gz tar zxvf spread-src-4.1.0.tar.gz cd spread-src-4.1.0 ./configure --prefix=/usr/local/spread && make && make install cat > /usr/local/spread/etc/spread.conf << EOF Spread_Segment 10.1.171.255:4804 { ct-142 10.1.168.142 ct-94 10.1.168.94 ct-241 10.1.168.241 ct-156 10.1.168.156 ct-70 10.1.170.70 cnc-64 10.1.169.64 cnc-80 10.1.169.80 cnc-72 10.1.169.72 cnc-58 10.1.169.58 } EOF groupadd spread useradd -g spread spread mkdir -p /var/run/spread chown spread:spread /var/run/spread echo '/usr/local/spread/lib' > /etc/ld.conf.d/spread.conf && ldconfig #必须用-n指定配置文件中定义好了的servername; #奇怪的是网上别的文章都指出这些配置要同时写入hosts,但我没写也一样用了 /usr/local/spread/sbin/spread -c /usr/local/spread/etc/spread.conf -n ct-156 &

  • perl的spread使用

CPAN上有很多关于spread的模块,试了几个后,选中了Spread::Messaging::Content。使用如下: ```perl#!/usr/bin/perl -w use Spread::Messaging::Content; use Event;

$spread = Spread::Messaging::Content->new( -port => “4804”, -timeout => “10”, -host => “10.1.168.156”, ); $spread->join_group(“test”); #当spread的group存在了filedescriptor后,执行子函数; #$spread->fd来自Spread::Messaging::Transport,这个module是Spread::Messaging::Content自动加载调用的 Event->io(fd => $spread->fd, cb => \&put_output); Event::loop();

sub put_output { $spread->recv(); printf(“Sender : %s\n”, $spread->sender); printf(“Groups : %s\n”, join(‘,’, @{$spread->group})); printf(“Message : %s\n”, ref($spread->message) eq “ARRAY” ? join(‘,’, @{$spread->message}) : $spread->message); } perl#!/usr/bin/perl -w use Spread::Messaging::Content; $spread = Spread::Messaging::Content->new( -port => “4804”, -timeout => “10”, -host => “10.1.168.156”, );

$spread->group(“test2”); $spread->type(“0”); $spread->message(“cooking with fire”); $spread->send();```

  • spread自带的spuser使用

bash/usr/local/spread/bin/spuser -s 4804 j test m test