IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

利用Gearman来实现远程监控与管理

Tim[后端技术] 2009-11-06 13:41:03 累计浏览 4,206 次
本机暂存

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

    gearman

    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实践中可用于多服务器管理的一些小功能,如果你的服务器有多台,重复执行命令过于繁琐,那可以借助下面一些脚本来完成一些有趣的功能。比如要实时看到所有服务器上的 netstat -nat | grep 80, 按下面步骤搭好环境之后,只需要几行脚本代码即可实现。

    1. 安装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");
%>

    PHP示例:

以下是代码片段:
# Create our client object.
$client= new GearmanClient();
# Add default server (localhost).
$client->addServer();
echo "Sending job\n";
# Send reverse job
$result = $client->do("server1", "netstat -nat | grep 80");
if ($result)
  echo "Success: $result\n";

Related posts:

  1. Python thread socket server 从网上参考了一些代码,实现了一个Python实现的基于线程的socket server, 用来实现各种服务系统的原型。放在这里供以后参考。 #!/usr/bin/env python import threading import SocketServer users...
  2. Thrift and Protocol Buffers performance in Java I’ve used Thrift for some log client in our system....

同分类推荐文章

  1. Vibe新开源项目 - Vaala AI Gateway (2026-05-17 02:10:19)
  2. SmartPerfetto 架构文章 Q&amp;A:8 个深度技术问答 (2026-04-10 11:00:00)
  3. 让 AI 把我的 PHP 博客重写成 Go (2026-03-27 18:33:54)

查看更多 后端 文章 →

建议继续学习

  1. Zookeeper工作原理 (累计阅读 12,076)
  2. 一致性哈希算法及其在分布式系统中的应用 (累计阅读 9,114)
  3. Storm:最火的流式处理框架 (累计阅读 7,381)
  4. 消息分发的同步均衡策略 (累计阅读 6,154)
  5. 各消息队列软件产品大比拼 (累计阅读 6,147)
  6. 如果用户在5分钟内重复上线,就给他发警告,问如何设计? (累计阅读 5,974)
  7. 进程运行于不同的 CPU 核 (累计阅读 5,909)
  8. Gearman Server 使用 MySQL UDFs 来管理和保持队列 (累计阅读 5,836)
  9. 解析Google集群资源管理系统Omega (累计阅读 5,827)
  10. 利用开源的Gearman框架构建分布式图片处理平台[原创] (累计阅读 5,274)