gearman简介及安装使用

Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能。它的任务分布非常简单,简单得可以只需要用脚本即可完成。Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面

Gearman分布式任务实现原理上只用到2个字段,function name和data。function name即任务名称,由client传给job server, job server根据function name选择合适的worker节点来执行。data通常为执行任务所需的自定义的内容,比如简单的做法可以把需要执行的脚本当成data即可(当然要注意其中的安全防范)。如果有多个worker可以处理同一个function name, 则job server会自动分配一个。当用于远程监控场景时,我们可以让每个worker注册成不同的业务名称,以达到方便控制每台worker节点的目的

Gearman能干什么?
通过上面可以看出,在Gearman ClientGearman Worker可以使用不同的编程语言,这给我们在不同语言通信提供了机会。比如客户端我们用的是PHP,在具体处理的Gearman Worker中,我们则可以使用C

另外,由于中间的Gearman Job Server,它可以把一个请求分发到众多worker中的一个,可以用来做负载均衡。
另外,Gearman在处理并发方面也是大大有用的。

安装gearman
最早的gearman是perl版的,由于国内开发人员对perl熟悉的不多,所以推荐安装C版本
http://gearman.org/index.php?id=download
解开后 ./configure; make; make install 即可


2. 启动 job server
cd sbin; ./gearmand -d


3. 到 worker 节点启动 worker


先按步骤1在worker机上安装 gearman, 然后创建一个执行worker的python脚本。


#!/usr/bin/env python
import os


def main():
    cmd = raw_input()
    print os.popen(cmd).read()


if __name__ == "__main__":
    main()
cd bin; ./gearman -w -h <job_server_ip> -f server1 — ./monitor.py


4. 通过远程 web 管理
JSP示例:


<%@ page language="java" import="java.util.*,java.util.concurrent.*,
org.gearman.client.*,org.gearman.common.*"%><%!
        private static String host = "192.168.1.1";
        private static int port = 4730;
        public String testGearman(String func, String data) {
                byte[] input = data.getBytes();
                String uniqueId = null;


                GearmanJobServerConnection conn =
                    new GearmanNIOJobServerConnection(host, port);
                GearmanClient client = new GearmanClientImpl();
                client.addJobServer(conn);
                GearmanJob job = GearmanJobImpl.createJob(func, input, uniqueId);
                Future<GearmanJobResult> f = client.submit(job);
                GearmanJobResult jr = null;
                String result = null;
                try {
                        jr = f.get(3, TimeUnit.SECONDS);
                        result = new String(jr.getResults());
                } catch (Exception e) {
                        result = e.getMessage();
                }


                client.shutdown();
                return result;
        }
%><%
out.println(testGearman("test", "netstat -nat | grep 80");
%>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值