Gearman 简介
Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。
Gearman提供了一种通用的程序框架来将你的任务分发到不同的机器或者不同的进程当中。它提供了你进行并行工作的能力、负载均衡处理的能力,以及在不同程序语言之间沟通的能力。Gearman能够应用的领域非常广泛,从高可用的网站到数据库的复制任务。总之,Gearman就是负责分发处理的中枢系统,它的优点包括:
* 开源:Gearman免费并且开源而且有一个非常活跃的开源社区,如果你想来做一些贡献,请点击 。
* 多语言支持:Gearman支持的语言种类非常丰富。让我们能够用一种语言来编写Worker程序,但是用另外一种语言编写Client程序。
* 灵活:不必拘泥于固定的形式。您可以采用你希望的任何形式,例如 Map/Reduce。
* 快速:Gearman的协议非常简单,并且有一个用C语言实现的,经过优化的服务器,保证应用的负载在非常低的水平。
* 可植入:因为Gearman非常小巧、灵活。因此您可以将他置入到现有的任何系统中。
* 没有单点:Gearman不仅可以帮助扩展系统,同样可以避免系统的失败。
Gearman的原理
[导言]Gearman最初在LiveJournal用于图片resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。Gearman分布式任务实现原理上只用到2个字段,function name和data。function name即任务名称,由client传给job server, job server根据function name选择合适的worker节点来执行。
Gearman运行过程简述
一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
Client:请求的发起者,可以是 C,Python,PHP,Perl,MySQL UDF 等等。
Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。
Worker:请求的处理者,可以是 C,PHP,Perl 等等。
因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成,甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。
1
2
3
4
5
6
7
|
# tar zxf gearmand-
1.1
.
4
.tar.gz
// gearmand 安装
# cd gearmand-
1.1
.
4
# ./configure
# make&& make install
# tar zxf python-gearman-
2.0
.
2
.tar.gz
// python-gearman Client&Worker APIs安装
# cd python-gearman-
2.0
.
2
# python setup.py install
|
启动Job:
1
2
3
4
5
6
7
8
9
10
11
|
# gearmand -L
10.0
.
0.51
-p
4730
-u root -d
// -d 以守护进程启动(deamon) \
-L 表示要监听IP \
-p 表示要监听的端口 \
// 遇到问题:“gearmand: error while loading shared libraries: libpq.so.5 \
cannot open shared object file: No such file or directory”
// 解决办法: 因为我的测试环境装有postgres,所以会提示找不到linpg共享库,可如下解决
# echo
"/usr/local/posgres/lib"
>> /etc/ld.so.conf
# ldconfig
# ldconfig -v|grep libpg* 此时验证应该就ok了
|
好了,通过命令行工具来体验 Gearman 的功能:
1
2
3
4
5
6
7
8
9
|
# gearman -h
10.0
.
0.51
-p
4730
-w -f task01 -- wc -l
// -h 代表所要连接的Job server host \
-p 代表Job server的端口 \
-w 代表启动的是worker \
-f task01 代表启动一个task名字为task01 \
-- wc -l表示这个task是做wc -l 统计行数
# gearman -h
10.0
.
0.51
-p
4730
-f task01 < /etc/passwd
// 调用名字为task01的worker,参数为"/etc/passwd",意思让worker统计passwd文件的行数
|
Gearman 的状态查看:
1
2
3
4
5
6
7
8
9
|
# telnet
10.0
.
0.51
4730
status
task01
0
0
1
.
(
"ctrl+]"
--->
"quit"
即可退出telnet)
可以见到如上的输出,分
4
个部分.
"已知注册的任务"
*
"正在运行的任务"
*
"队列中的任务"
*
"可用的 Worker"
.
如 task01
0
0
1
.这个部分,注册的任务名为 task01,
0
个正常在运行,队列为空,有一个可用的 Worker.
|
Gearman的python客户端简单使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/usr/bin/python
# -*- coding:utf-8 -*-
# This is worker.py
import
os
import
gearman
import
math
class
CustomGearmanWorker(gearman.GearmanWorker):
def
on_job_execute(
self
, current_job):
print
"Job started"
return
super
(CustomGearmanWorker,
self
).on_job_execute(current_job)
def
task_callback(gearman_worker, job):
print
job.data
return
job.data
new_worker
=
CustomGearmanWorker([
'10.0.0.51:4730'
])
new_worker.register_task(
"echo"
, task_callback)
new_worker.work()
|
1
2
3
4
5
6
7
8
9
10
|
#!/usr/bin/python
# -*- coding:utf-8 -*-
# This is client.py
from
gearman
import
GearmanClient
new_client
=
GearmanClient([
'10.0.0.51:4730'
])
current_request
=
new_client.submit_job(
'echo'
,
'foo'
)
new_result
=
current_request.result
print
new_result
|
注:我的本机IP是10.0.0.51,gearman server端默认开启端口4730
启动worker:
1
2
3
|
# python worker.py
Job started
foo
|
启动client,在另外一个终端:
1
2
|
# python client.py
foo
|
Gearman 的高级特性:
在一个 Web 应用程序内可能有许多地方都会用到 Gearman。可以导入大量数据、发送许多电子邮件、编码视频文件、挖据数据并构建一个中央日志设施 — 所有这些均不会影响站点的体验和响应性。可以并行地处理数据。而且,由于 Gearman 协议是独立于语言和平台的,所以您可以在解决方案中混合编程语言。比如,可以用 PHP 编写一个 producer,用 C、Ruby 或其他任何支持 Gearman 库的语言编写 worker。
一个连接客户机和 worker 的 Gearman 网络实际上可以使用任何您能想象得到的结构。很多配置能够运行多个代理并将 worker 分配到许多机器上。负载均衡是隐式的:每个可操作的可用 worker(可能是每个 worker 主机具有多个 worker)从队列中拉出作业。一个作业能够同步或异步运行并具有优先级。
Gearman 的最新版本已经将系统特性扩展到了包含持久的作业队列和用一个新协议来通过 HTTP 提交工作请求。对于前者,Gearman 工作队列保存在内存并在一个关系型数据库内存有备份。这样一来,如果 Gearman 守护程序故障,它就可以在重启后重新创建这个工作队列。另一个最新的改良通过一个 memcached 集群增加队列持久性。memcached 存储也依赖于内存,但被分散于几个机器以避免单点故障。
Gearman 是一个刚刚起步却很有实力的工作分发系统。据 Gearman 的作者 Eric Day 介绍,Yahoo! 在 60 或更多的服务器上使用 Gearman 每天处理 600 万个作业。新闻聚合器 Digg 也已构建了一个相同规模的 Gearman 网络,每天可处理 400,000 个作业。Gearman 的一个出色例子可以在 Narada 这个开源搜索引擎(参见 参考资料)中找到。
相关参考:
http://www.cnblogs.com/greatqn/archive/2011/11/07/2239337.html
http://blog.chinaunix.net/uid-9460004-id-2002456.html (gearman python 使用)
http://blog.chinaunix.net/uid-9460004-id-2002457.html (Nginx gearman 集群调度对)
http://timyang.net/linux/gearman-monitor/ (利用Gearman来实现远程监控与管理)
http://www.kongch.com/2010/04/gearman-how-to/ (用Gearman进行分布式任务处理)
http://blog.csdn.net/jenkinslee/article/details/6554299 (Gearman协议)
http://gearman.org/index.php?id=protocol (Gearman Protocol)
http://gearman.org/manual
http://packages.python.org/gearman/worker.html#job-processing (python-gearman v2.0.2 documentation)
http://www.saltycrane.com/blog/2010/04/notes-using-gearman-with-python/ (Notes on using Gearman with Python)