IT技术博客大学习 共学习 共进步

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

Tim[后端技术] 2009-11-06 13:41:03 累计浏览 4,107 次

    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. Mysql监控指南 (累计阅读 21,108)
  2. 批量添加主机到cacti+nagios的监控报警系统中 (累计阅读 14,684)
  3. 我常用的主机监控shell脚本 (累计阅读 13,106)
  4. 7 天打造前端性能监控系统 (累计阅读 11,063)
  5. 如何监控HP服务器硬件状态 (累计阅读 10,506)
  6. Cacti 添加 Nginx 监控 (累计阅读 10,364)
  7. Linux下三种常用的流量监控软件对比 (累计阅读 9,987)
  8. Cacti 添加 Memcached 监控 (累计阅读 9,163)
  9. Cacti 添加 Apache 监控 (累计阅读 8,984)
  10. 你应该知道的16个Linux服务器监控命令 (累计阅读 8,410)