预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://timyang.net/linux/gearman-monitor/"\o"PermanentLinkto利用Gearman来实现远程监控与管理"利用Gearman来实现远程监控与管理 Wednesday,Aug26th,2009byTim|Tags:HYPERLINK"http://timyang.net/tag/gearman/"gearman HYPERLINK"http://gearman.org/"Gearman是一个分发任务的程序框架,可以用在各种场合,与HYPERLINK"http://hadoop.apache.org/"Hadoop相比,Gearman更偏向于任务分发功能。它的任务分布非常简单,简单得可以只需要用脚本即可完成。Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。 Gearman分布式任务实现原理上只用到2个字段,functionname和data。functionname即任务名称,由client传给jobserver,jobserver根据functionname选择合适的worker节点来执行。data通常为执行任务所需的自定义的内容,比如简单的做法可以把需要执行的脚本当成data即可(当然要注意其中的安全防范)。如果有多个worker可以处理同一个functionname,则jobserver会自动分配一个。当用于远程监控场景时,我们可以让每个worker注册成不同的业务名称,以达到方便控制每台worker节点的目的。 下面介绍Gearman实践中可用于多服务器管理的一些小功能,如果你的服务器有多台,重复执行命令过于繁琐,那可以借助下面一些脚本来完成一些有趣的功能。比如要实时看到所有服务器上的netstat-nat|grep80,按下面步骤搭好环境之后,只需要几行脚本代码即可实现。 1.安装gearman最早的gearman是perl版的,由于国内开发人员对perl熟悉的不多,所以推荐安装C版本HYPERLINK"http://gearman.org/index.php?id=download"http://gearman.org/index.php?id=download解开后./configure;make;makeinstall即可 2.启动jobservercdsbin;./gearmand-d 3.到worker节点启动worker 先按步骤1在worker机上安装gearman,然后创建一个执行worker的python脚本。 #!/usr/bin/envpython importos defmain(): cmd=raw_input() printos.popen(cmd).read() if__name__=="__main__": main() cdbin;./gearman-w-h<job_server_ip>-fserver1—./monitor.py 4.通过远程web管理JSP示例: <%@pagelanguage="java"import="java.util.*,java.util.concurrent.*, org.gearman.client.*,org.gearman.common.*"%><%! privatestaticStringhost="192.168.1.1"; privatestaticintport=4730; publicStringtestGearman(Stringfunc,Stringdata){ byte[]input=data.getBytes(); StringuniqueId=null; GearmanJobServerConnectionconn= newGearmanNIOJobServerConnection(host,port); GearmanClientclient=newGearmanClientImpl(); client.addJobServer(conn); GearmanJobjob=GearmanJobImpl.createJob(func,input,uniqueId); Future<GearmanJobResult>f=client.submit(job); GearmanJobResultjr=null; Stringresult=null; try{ jr=f.get(3,TimeUnit.SECONDS); result=newString(jr.getResults()); }catch(