SVN+Gearman构建异步式代码分布系统

默北 GearmanSVN+Gearman构建异步式代码分布系统已关闭评论7,968字数 2367阅读7分53秒阅读模式

1.场景说明

任何一种方法都是为了解决或改进现有的问题。随着SVN服务器版本库增多,代码量增多,随之而来的就面临着SVN服务器压力的问题。为了开发测试,一般在每个版本库的hooks下配置个钩子,来实现代码自动同步,如:https://www.ttlsa.com/html/1047.html文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

这种方案是客户端每一次commit操作触动post-commit脚本执行,将代码update到本地后,再rsync到测试环境下。这存在潜在的问题,如磁盘IO,客户端提交时间(监控改变的目录,仅仅对改变的目录进行update操作比对整个项目进行update操作快)。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

for dir in `svnlook dirs-changed /www/www.ttlsa.com`
 do
 svn update -N /www/project/$dir
 done

2.思路说明文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

将checkout/update操作转移到其他服务器上进行,比如测试环境下。客户端每一次commit操作仅仅是发送一次update操作命令,交由相关的服务器去完成你所要进行的操作。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

可以采用SVN+Gearman来实现上述功能,解决面临的问题。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

3.环境设置文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

a.SVN安装以及相关内容参见: https://www.ttlsa.com/html/category/os/web-application/svn文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

b.Gearman Server安装,PHP扩展以及相关内容参见: https://www.ttlsa.com/html/category/os/distributed-software-systems/distributed-processing-systems/gearman-distributed-processing-systems文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

c.Peal相关模块安装,如Gearman::Worker,Gearman::Client,JSON等等文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

4.实现步骤文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

a). Gearman Worker如下:(在测试服务器下运行)文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

#!/usr/bin/perl
#
############################
# author: www.ttlsa.com
# QQ群: 39514058
# E-mail: service@ttlsa.com
#############################
#
use JSON;
use strict;
use Gearman::Worker;
#
my $worker=new Gearman::Worker;
$worker->job_servers('192.168.1.111:4730');
$worker->register_function(work_SVNUPDATE_01=>\&svnupdate);
$worker->work while 1;
#
sub svnupdate{
my $job=shift;
my $json=JSON->new->allow_nonref;
my $hash_ref = $json->decode($job->arg);
my $repo=$$hash_ref{'repo'};
my $user=$$hash_ref{'user'};
my $password=$$hash_ref{'password'};
chdir "/www/web";
if ( -e -d "/www/web/$repo"){
system("svn up /www/web/$repo --username=$user --password=$password --no-auth-cache");
system("chown -R nobody.nobody /www/web/$repo");
}else{
system("svn co svn://192.168.1.222/web/$repo --username=$user --password=$password --no-auth-cache");
system("chown -R nobody.nobody /www/web/$repo");
}
}

b). Gearman Client如下:(每个项目hoods下)文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

/*
############################
# author: www.ttlsa.com
# QQ群: 39514058
# E-mail: service@ttlsa.com
#############################
*/
#!/usr/bin/php
<?php
$args=array('repo'=&gt;'www.ttlsa.com',
'user'=&gt;'root',
'password'=&gt;'www.ttlsa.com');
$arg=json_encode($args);
$gearman_client = new GearmanClient();
$gearman_client-&gt;setTimeout(1000);
$gearman_client-&gt;addServers('192.168.1.111:4730');
$gearman_client-&gt;addTaskBackground("work_SVNUPDATE_01", $arg);
$gearman_client-&gt;runTasks();
?>

注意:文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

a. Gearman Client是使用php来实现的。 Perl添加异步任务不成功,会一直等待worker响应。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

b. 要添加异步任务。如果添加同步任务的话,会阻塞的。文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/

文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/文章源自运维生存时间-https://www.ttlsa.com/gearman/svn-gearman/
weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
默北
  • 本文由 发表于 03/07/2012 14:33:18
  • 转载请务必保留本文链接:https://www.ttlsa.com/gearman/svn-gearman/
  • Gearman::Client
  • Gearman::Worker
  • json
  • svn