资讯专栏INFORMATION COLUMN

Gearman的安装和使用

U2FsdGVkX1x / 2640人阅读

摘要:启动和如下信息则表示成功查看版本安装扩展从下载最新扩展需下载最新源码包,并解压缩安装安装成功后信息然后,配置文件增加内容重启后,出现如下信息则表示安装扩展成功。

首发于 樊浩柏科学院

Gearman 是一个分布式任务分发系统,通过程序调用(API,跨语言)分布式地把工作委派给更适合做某项工作的机器,且这些机器可以以并发的、负载均衡的形式来共同完成某项工作。当计算密集型场景时,适合在后台使用 Gearman 异步地运行工作任务。

认识Gearman

Gearman 只是一个分布式程序调用框架,其主要由三部分组成,并通过暴露给使用方的 API 来完成任务委派和执行。

组成角色

Gearman 中存在三个重要的角色,分别为 Client、Job Server、Worker。

Client:任务的发起者(可以是 C、PHP、Java、Perl、MySQL 等);

Job Server:任务调度者,负责将 Client 委派的任务转发给相应的 Worker(gearmand 进程管理);

Worker:任务的实际执行者(可以是 C、PHP、Java、Perl 等);

Client、Job Server、Worker 典型的部署方案,如下图:

那么,Gearman 是如何利用这三者进行任务的调度呢?

可以看出,在实际使用时,我们只需调用 Gearman 已经实现了 Client 和 Worker 的 API,委派和注册执行的任务,而无需关心任务的分发和机器的负载均衡问题。

外部API

到目前为止,Gearman 已经提供了 C、Shell、Prel、 Nodejs、PHP、Python、Java、C#、Go、MySQL 等版本的 Client、Worker API,详细信息见 这里。本文只以 PHP 版为例,列举 Gearman 常用的 API 。

Client 端常用 API 列表:

功能描述 方法(GearmanClient 类中)
注册一个 Client addServer(),单个
addServers(),多个
发起 Job 任务 doNormal(),阻塞会等待
doBackground(),非阻塞
doLow(),低优先级任务
doHigh(),高优先级任务
添加 Tash(一组 Job) addTask()、addTaskBackground()
addTaskHigh()、addTaskHighBackground()
addTaskLow()、addTaskLowBackground()
发起 Tash 任务 runTasks()
获取最新操作的结果 returnCode()
注册事件回调 setCompleteCallback()、setFailCallback()
说明:Job 是单个任务,每个任务只会在一个 Worker 上执行,而 Task 是一组 Job,其多个子任务会分配到多个 Worker 上并行执行。

Worker 端常用 API 列表:

功能描述 方法(GearmanWorker 类中)
注册一个 Worker addServer(),单个
addServers(),多个
注册处理任务回调 addFunction()
等待和执行任务 work()
获取最新操作的结果 returnCode()

Job 端也提供了 API,其常用列表为:

功能描述 方法(GearmanJob 类中)
获取任务携带的序列化数据 workload()
workloadSize(),获取数据大小
向运行的任务发送数据 sendData()
说明:Gearman 各端之间数据交互时,数据需要进行序列化处理。
安装Gearman

本文安装 Gearman 需要两步,第一步安装守护程序(gearmand)的 Job,第二步安装 PHP 扩展。

安装gearmand

首先,下载 Gearman 守护程序 gearmand 的 最新源码,并解压缩源码包:

cd /usr/src
$ wget https://github.com/gearman/gearmand/releases/download/1.1.17/gearmand-1.1.17.tar.gz
$ tar zxvf gearmand-1.1.17.tar.gz

接着,安装 gearmand 的依赖包,并编译源码安装 gearmand:

$ yum install boost-devel gperf libuuid-devel libevent-devel
$ cd ./gearmand-1.1.17.tar.gz
$ ./configure
$ make && make install
# 安装成功信息
Libraries have been installed in:
   /usr/local/lib
   - have your system administrator add LIBDIR to "/etc/ld.so.conf"

修改/etc/ld.so.conf配置文件,添加 MySQL 动态链接库地址:

# /usr/local/mysql/lib为MySQL动态链接库libmysqlclient.so的目录
$ echo "/usr/local/mysql/lib" >>/etc/ld.so.conf
# 使其生效
$ /sbin/ldconfig

然后,如果出现如下信息则表示安装 gearmand 成功。

# 启动Client和Worker
$ gearman
# 如下信息则表示成功
gearman    Error in usage(No Functions were provided).
Client mode: gearman [options] []

# 查看gearmand版本
$ gearmand -V
gearmand 1.1.17
安装PHP扩展

从 PECL 下载最新 gearman 扩展(php7 需下载 最新源码包),并解压缩安装:

$ cd /usr/src
$ wget http://pecl.php.net/get/gearman-1.1.2.tgz
$ tar zxvf gearman-1.1.2.tgz
$ cd gearman-1.1.2
$ /usr/local/php/bin/phpize
$ ./configure --with-php-config=/usr/local/php/bin/php-config
$ make && make install
# 安装成功后信息
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

然后,配置 php.ini 文件:

$ php --ini
Loaded Configuration File:         /usr/local/php/lib/php.ini
$ vim /usr/local/php/lib/php.ini
#增加内容
extension=gearman.so

重启 php-fpm 后,出现如下信息则表示安装扩展成功。

$ php --info | grep "gearman"
gearman support => enabled
libgearman version => 1.1.17
运行Gearman

运行 Gearman ,实际上我们需要使用到 Client、 Job、Worker 这三个角色。gearman 端实现了 Client 和 Worker 角色的功能 ,使用 PHP 时以扩展形式存在,gearmand 端则实现了 Job 角色的功能。

启动Job
# 先创建日志目录
$ gearmand -d --log-file=/var/log/gearmand.log
如果启动时出现 Address family not supported by protocol 错误,需要增加-L 0.0.0.0参数。

查看启动信息:

$ ps -ef | grep gearman
root     6048     1  0 19:56 ?        00:00:00 gearmand -d
# 监听端口
$ netstat -tunpl | grep "gearmand"
tcp  0  0 0.0.0.0:4730  0.0.0.0:*   LISTEN  6048/gearmand

gearmand 命令的一些参数说明:

-b –backlog:监听连接数量

-d –daemon:后台运行

-f –file-descriptors:文件描述符的数量

-j –job-retries:移除不可用 Job 之前运行的次数

-l –log-file:日志文件存放位置(默认记录最简单日志)

-L –listen:监听的 IP

-p –port:指定监听端口

-q –queue-type:指定持久化队列

-t –threads:使用的 I/O 线程数量

-u –user:启动后,切换到指定用户

--mysql-host:--mysql 系列为 MySQL 持久化连接信息

为了方便管理 gearmand,可以将 gearmand 注册为一个 service 服务。
启动Client和Worker

通过 gearman 命令启动 Client 和 Worker 并不是必须的,这里仅仅是为了在命令行下测试工具。

首先,启动一个 Worker,用于列出某个目录的内容:

$ gearman -w -f ls -- ls -lh

然后,创建一个 Client,用于查找请求的一个作业:

$ gearman -f ls < /dev/null
total 4.0K
drwxr-xr-x. 21 www www 4.0K Jun 21 23:52 www
PHP使用Gearman

当启动 Job 服务后,PHP 就可以通过 Gearman 扩展,创建任务和绑定任务处理回调了。PHP 调用 Gearman 的 API 见 外部 API 部分,更多官方示例见 这里。

同步

Client 工作在同步阻塞模式,Client 发起任务后会等待至 Worker 执行任务结束。

Client 端

//Client.php
$client= new GearmanClient();
$client->addServer();

$msg = "Hello World!";
echo "Sending $msg
";
echo "Success: ", $client->doNormal("reverse", $msg), "
";

Worker 端

//Worker.php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "reverse_fn");
echo "Waiting for job...
";
while ($worker->work());

function reverse_fn($job) {
    $workload = $job->workload();
    echo "Workload: $workload
";
    $result = strrev($workload);
    echo "Result: $result
";
    return $result;
}

输出结果为:

//Client
Sending Hello World!
Success: !dlroW olleH

//Worker
Waiting for job...
Workload: Hello World!
Result: !dlroW olleH

三端的交互流程图,如下:

异步

异步方式时,Client 端不会产生 IO 阻塞,能实现异步执行,在实际应用中可以结合 fastcgi_finish_request() 函数或者 MQ 来异步使用。

Client 端

$client= new GearmanClient();
$client->addServer();
$client->setDataCallback("reverse_data");

$msg = "Hello World!";
echo "Sending $msg
";
$task = $client->addTaskBackground("reverse", $msg);
$msg = "I am Gearman!";
echo "Sending $msg
";
$task = $client->addTaskBackground("reverse", $msg);
$client->runTasks();

function reverse_data($task) {
    echo "Data: " . $task->data() . "
";
}

Worker 端

$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "reverse_fn");
echo "Waiting for job...
";
while ($worker->work());

function reverse_fn($job)
{
    $workload = $job->workload();
    echo "Workload: $workload
";
    $result = strrev($workload);
    $job->sendData($result);
    echo "Result: $result
";
    return $result;
}

输出结果为:

//Client
Sending Hello World!
Data: !dlroW olleH
//Worker1
Waiting for job...
Workload: Hello World!
Result: !dlroW olleH
//Worker2
Waiting for job...
Workload: I am Gearman!
Result: !namraeG ma I
Gearman的管理工具

Gearman 可以使用 GearmanManager 作为管理工具,命令行下可以使用 gearadmin 命令来进行简易的管理。

$ gearadmin --show-jobs
32 ::7866:86a6:d87f:0%32 - : reserve

$ gearadmin --show-jobs
H:fhb:79    0    1    0
H:fhb:86    0    1    0

$ gearadmin --status
reverse    1    0    0
ls        0    0    0
总结

虽然 Gearman 出现的比较早,但是其支持跨语言调用特性,以及负载均衡的方式委派任务,在分布式系统下,可以更加合理高效地利用系统资源。在一些大型的密集型、异步后台系统也已有成功部署的案例(数据抓取,库存数据更新、邮件和短信服务等),另 PHP 借助 Gearman 也能实现多任务处理方案。

推荐:用 Gearman 分发 PHP 应用程序的工作负载

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29791.html

相关文章

  • JAVA通过Gearman实现MySQL到Redis数据同步(异步复制)

    摘要:但是这需要对文件以及有非常深入的理解,同时由于存在多种形式,分析实现同步的工作量是非常大的。因此这里选择了一种开发成本更加低廉的方式,借用已经比较成熟的,将数据首先放入中,然后通过一个自己编写的,将数据同步到。此类连接远程的。 MySQL到Redis数据复制方案 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Sl...

    doodlewind 评论0 收藏0
  • 利用 Gearman 实现系统错误报警功能

    摘要:文件分发针对用户上传的文件,进行多台服务器分发。系统报警当系统出现问题的时候,第一时间通知相关人。这篇文章主要讲解系统报警场景在开发系统的过程中,往往程序会出现这样,那样的问题。所以,使用实现短信,邮件的异步发送。也可以用来实现上面的需求。 Gearman 是什么? Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡...

    IntMain 评论0 收藏0
  • PHP异步操作(swoole, gearman)

    摘要:异步操作废话不说直接进入正题应用场景业务逻辑中经常会出现发送信息发送邮件记录日志等等这个时候用异步再好不过了用户直接的体验就是使用的贼流畅使用技术这个不仅仅支持了其他语言也支持有的扩展用起来更方便感觉上异步队列不同点有个队列专门用来存储发送 PHP异步操作 废话不说直接进入正题: 应用场景: 业务逻辑中经常会出现发送信息,发送邮件,记录日志等等,这个时候用异步再好不过...

    Fundebug 评论0 收藏0
  • Gearman 使用小知识

    摘要:目前项目采用的是来实现异步任务。关于介绍通俗的来说是一个分发任务的程序框架使用的应用通常有三部分组成一个一个一个任务服务器。的作用是提出一个任务交给任务服务器。请求的调度者,用来负责协调把发出的请求转发给合适的。 众所周知,PHP要实现异步任务一般都是通过 Gearman Beanstalkd 等第三方来实现的。目前项目采用的是 Gearman 来实现异步任务。 关于Gearman介绍...

    ideaa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<