![gearman gearman](https://i-blog.csdnimg.cn/blog_migrate/b1a6f030073ee09d80e63fbd0568576b.png)
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 即可
最早的gearman是perl版的,由于国内开发人员对perl熟悉的不多,所以推荐安装C版本
http://gearman.org/index.php?id=download
解开后 ./configure; make; make install 即可
2. 启动 job server
cd sbin; ./gearmand -d
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示例:
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";
转自 http://timyang.net/linux/gearman-monitor/