Gearman分布式远程过程处理框架简单研究

Gearman介绍
Gearman 系统用来把工作委派给其他机器,分布式的调用更适合做某项工作的机器,并发的做某项工作,在多个调用间做负载均衡,或用来在调用其它语言的函数。
  通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用 WebService 的方式来处理此类集成问题,但不管采用何种风格的 WebService,如 RPC 风格,或者 REST 风格,其本身都有一定的复杂性。相比之下,Gearman 也能实现类似的作用,而且更简单易用。
  一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
  Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
  Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。
  Worker:请求的处理者,可以是 C,PHP,Perl 等等。
  因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。
  甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。
  通过 gearman 你可以实现并行的工作,负载均衡处理,调用其他语言的函数。它可以应用在多种场合,从高可用性的 web 服务到数据库复制,换句话说,它是分布式处理的中枢神经。

Gearman应用场景
gearman可以用在各个方面,最简单就是在不同语言之间架起一座桥梁。比如你可能希望你的php程序调用一个c 函数,那么用gearman就可以实现了,当然了实际你可以通过写一个php扩展来实现同样的工作,但是比如你要php调用java,perl,或者python,那么gearman就非常棒了。

gearman另一个应用方面是负载均衡,你可以将worker放在不同的服务器(或者一系列服务器)上,比如你的php程序需要图片转换,但是不希望本地服务器有太多的这样图片转换的进程,那么你可以建立一系列服务器,在上面加载worker处理图片转换。这样你的web服务器将不受图片转换的影响,同时你得到了负载均衡的功能,因为job server会在请求到来的时候,将这个请求发给空闲的worker.同样对于多核的服务器,你可以在同一机器上创建同样数目的worker. 你可能担心,job server处于一个中心,那么这会是一个单点的瓶颈,如果死了,会怎么样?对于这样的情况,你可以运行多个job server。这样如果一个job server down了,client和worker会自动迁移到另一台job server上。

谁在用Gearman
Digg.com
   http://highscalability.com/digg-architecture
金山逍遥网
   http://blog.s135.com/dips/

安装 Gearman Server

PHP代码
  1. wget http://launchpad.net/gearmand/trunk/0.8/+download/gearmand-0.8.tar.gz   
  2. tar zxf gearmand-0.8.tar.gz   
  3. cd gearmand-0.8   
  4. ./configure   
  5. make   
  6. make install  


安装Gearman PHP extension 

PHP代码
  1. wget http://pecl.php.net/get/gearman-0.4.0.tgz   
  2. tar zxf gearman-0.4.0.tgz   
  3. cd gearman-0.4.0   
  4. phpize   
  5. ./configure   
  6. make   
  7. make install   
  8.   
  9. 编辑php.ini配置文件加载相应模块并使之生效:   
  10. extension = "gearman.so"   

 

启动Job 

PHP代码
  1. gearmand -d  

如果当前用户是root的话,则需要这样操作:

PHP代码
  1. gearmand -d -u root  

缺省会使用4730端口。

注意:如果找不到gearmand命令的路径,别忘了用whereis gearmand确认。

编写Worker 

PHP代码
  1. <?php   
  2. $workernew GearmanWorker();   
  3. $worker->addServer('127.0.0.1', 4730);   
  4. $worker->addFunction('reverse''my_reverse_function');   
  5. while ($worker->work());   
  6.   
  7. function my_reverse_function($job){   
  8.    return strrev($job->workload());   
  9. }   
  10. ?>    

设置后台运行work:

 

编写Client  运行client:

PHP代码
  1. <?php   
  2. $clientnew GearmanClient();   
  3. $client->addServer('127.0.0.1', 4730);   
  4. echo $client->do('reverse''Hello World!');   
  5. ?>  

 

PHP代码
  1. php client.php  

输出:!dlroW olleH

出于方便的考虑,Worker,Client使用的都是PHP,但这并不影响演示,实际应用中,你完全可以通过Gearman集成不同语言实现的Worker,Client。或许此时你还想了解前面提到的负载均衡功能:很简单,只要增加多个Worker即可,你可以按照worker.php的样子多写几个类似的文件,并设置不同的返回值用以识别演示效果。然后依次启动这几个Worker文件,并多次使用client.php去请求,你就会发现Job会把Client请求转发给不同的Worker。

命令行工具
如果你觉得安装PHP之类的东西太麻烦的话,你也可以仅仅通过命令行工具来体验Gearman的功能:

启动Worker:

PHP代码
  1. gearman -w -f wc -- wc -l   

运行Client:

PHP代码
  1. gearman -f wc < /etc/passwd  

 

参考资料
http://gearman.org/?id=getting_started
http://www.percona.com/ppc2009/PPC2009_Gearman.pdf

PHP代码
  1. php worker.php    

Tags: gearman

« 上一篇 | 下一篇 »

信息推荐

发表评论