简介:

Gearmand 是一个用来把工作委派给其它机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来调用其它语言的函数的系统。

简单来讲,就是客户端程序把请求提交给 gearmand,gearmand 会把请求转发给合适的 worker 来处理这个请求,最后还通过 gearmand 返回结果。

运行流程:

Client --> Job --> Worker

1、Client 请求发起者,客户端程序可以是任何一种语言,C 、PHP 、Perl 、Python 等。
2、Job 请求调度者,负载协调把 Client 发出的请求转发给合适的 Worker。
3、Worker 请求处理者,处理 Job 分发来的请求,可以是任何一种语言。

下载地址:https://github.com/gearman/gearmand/releases

参考地址:http://wiki.phpboy.net/doku.php?id=2014-05:40-Gearman%E8%B0%83%E7%A0%94_%E6%B5%8B%E8%AF%95_%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md&do=

一、安装、启动 Gearmand

1、源码编译安装( 能够安装最新版本,需要自己解决依赖 )

shell > yum -y install boost-devel gperf libevent-devel libuuid-devel

shell > cd /usr/local/src
shell > tar zxf gearmand-1.1..tar.gz
shell > cd gearmand-1.1.
shell > ./configure; make; make install shell > gearmand -V
gearmand: error while loading shared libraries: libmysqlclient.so.: cannot open shared object file: No such file or directory 解决方法: shell > ln -s /usr/local/mysql-5.5./lib/libmysqlclient.so. /usr/lib64/ shell > gearmand -V
gearmand 1.1. - https://bugs.launchpad.net/gearmand shell > mkdir -p /usr/local/var/log
shell > touch /usr/local/var/log/gearmand.log shell > gearmand -L 0.0.0.0 -d # 启动 gearmand,-L 指定只监听 IPV4,-d 以守护进程的方式启动,-p port 默认 shell > killall gearmand # 停止 gearmand

2、yum 安装 gearmand( 简单、快捷,版本不是最新 )

shell > yum -y install gearmand

shell > /etc/init.d/gearmand start  # 启动 gearmand

shell > gearmand -V
gearmand 1.1. - https://bugs.launchpad.net/gearmand shell > vim /etc/sysconfig/gearmand # 指定 gearmand 启动参数
### Settings for gearmand
OPTIONS="-p 4370 -L 0.0.0.0" shell > /etc/init.d/gearmand restart # or stop

# 如果 gearmand 要向外提供服务,需要打开监听的 TCP 端口,默认 4370

二、PHP 安装 gearmand 扩展、启动 Worker

1、安装 gearmand 扩展

shell > /usr/local/php/bin/pecl install gearman
shell > echo 'extension=gearman.so' >> /usr/local/php/php.ini
shell > /usr/local/php/bin/php -m | grep gearman
gearman

2、编写 Worker ( Worker 进程可以启动在任意一台服务器上 )

shell > vim script/worker.php
<?php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "my_reverse_function");
while ($worker->work()); function my_reverse_function($job)
{
return strrev($job->workload());
}
?>

# 这是官网的一个测试例
# $worker->addServer(); 默认连接本机 gearmand,端口 4370,地址貌似是 IPV6,因为我指定 -L 0.0.0.0 启动 gearmand 时,Worker 提示连接失败
# $worker->addServer('192.168.1.30',4370); gearmand 不在本机或不是默认端口时,需要指定
# Worker 支持连接多个 gearmand,但并不是负载均衡,只是一个备机。

3、启动 Worker

shell > /usr/local/php/bin/php script/worker.php &  # Worker 进程可以启动多个,多次执行该命令即可

shell > ps aux | grep worker | grep -v grep | awk '{print $2}' | xargs -i kill {}  # 停止 Worker 进程

shell > pgrep php | xargs -i kill {}  # 这样也可以,或者直接 killall php,小心误杀哦

# Worker 进程管理脚本

shell > vim script/gearmand-worker.sh

#!/bin/bash
# author: Wang XiaoQiang // # 设置初始启动多少个 worker 进程,默认 个
worker_num=
# 设置 worker 脚本文件路径
worker_file='/root/script/worker.php' start_worker(){
i=
while [ $i -lt $worker_num ];do
/usr/local/php/bin/php $worker_file &
let i++
done [ $? -eq ] && status_worker || echo "Start falied"
} stop_worker(){
ps aux | grep -v grep | grep 'worker.php' | awk '{print $2}' | xargs -i kill {} [ $? -eq ] && echo "Worker process stoped" || echo "Stop falied"
} status_worker(){
line=`ps aux | grep -v grep | grep 'worker.php' | wc -l`
echo "Worker process number: $line"
} main(){
$
} case $ in
start)
main start_worker ;;
stop)
main stop_worker ;;
restart)
main stop_worker
main start_worker ;;
status)
main status_worker ;;
*)
echo "Usage: sh $0 [start|stop|restart|status]" ;;
esac # End

三、编写、执行 Client ( Client 可以在任意一台服务器上 )

shell > vim script/client.php
<?php
$client= new GearmanClient();
$client->addServer('192.168.1.30',);
print $client->do("reverse", "\nHello World!");
?>

# Client 连接 gearmand,192.168.1.30,端口 4370

shell > /usr/local/php/bin/php script/client.php
!dlroW olleH

# Gearmand 进程成功将 Client 请求转发到了 Worker,执行完成后返回结果

# Client 、Gearmand 、Worker 可以部署在同一台服务器,也可以分开部署。只要保证 Client 跟 Worker 都能连接到 Gearmand 即可。

四、Gearmand 监控

# 开源项目地址:https://github.com/yugene/Gearman-Monitor

# 脚本监控、加入 Zabbix

# 先这样,等空闲的时候补上这块内容

Gearmand 任务分发系统的更多相关文章

  1. 使用 expect 命令执行自动分发系统

    一.命令 except 实例详解 1. 介绍 expect 使用场景 expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动 ...

  2. 基于BT协议的文件分发系统

    基于BT协议的文件分发系统构成:    1.一个Web服务器:保存着种子文件    2.一个种子文件:保存共享文件的一些信息(文件名,文件大小    ,Tracker服务器地址,torrent为后缀) ...

  3. 任务分发系统gearman

    1 Gearman是什么 Gearman Job Server@http://gearman.org/. Gearman 是一个任务分发系统,它提供了一个分发框架,能够分发某类任务到更适合处理这类任务 ...

  4. Django之路由分发系统

    web的基本工作流程 首先,我们先来思考一下我们平常在上网浏览网页时候的场景,大致就是打开一个web浏览器,输入某一个网站的地址,然后转到该网址,在浏览器中得到该网址的页面.从这个场景中我们可以抽象出 ...

  5. 关于LT分发系统的设计构想

    git地址 https://github.com/cxyxd/LtDistribution 背景 对tomcat做集群,在多机多tomcat的情况下,如果要更新代码,只能手动的将代码复制,粘贴,然后下 ...

  6. 深度解读阿里巴巴云原生镜像分发系统 Dragonfly

    Dragonfly 是一个由阿里巴巴开源的云原生镜像分发系统,主要解决以 Kubernetes 为核心的分布式应用编排系统的镜像分发难题.随着企业数字化大潮的席卷,行业应用纷纷朝微服务架构演进,并通过 ...

  7. expect脚本同步文件 expect脚本指定host和要同步的文件 构建文件分发系统 批量远程执行命令

    自动同步文件 #!/usr/bin/expect set " spawn rsync -av root@.txt /tmp/ expect { "yes/no" { se ...

  8. centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课

    centos shell编程4[分发系统] 服务器标准化  mkpasswd 生成密码的工具  expect讲解   expect传递参数   expect自动同步文件  expect指定host和要 ...

  9. 第四部分shell编程5项目二分发系统

    第一部分:expect讲解expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令.但当不能使用密钥验证的时候,我 ...

随机推荐

  1. Uoj 441 保卫王国

    Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...

  2. BZOJ2705 SDOI2012 Longge的问题 【欧拉函数】

    BZOJ2705 SDOI2012 Longge的问题 Description Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, ...

  3. 使用 Task.Wait()?立刻死锁(deadlock)

    最近读到一篇异步转同步的文章,发现其中没有考虑到异步转同步过程中发生的死锁问题,所以特地在本文说说异步转同步过程中的死锁问题. 文章作者 林德熙 已经修复了描述: - win10 uwp 异步转同步 ...

  4. Paths中的几个重要元素

    Paths中的几个重要元素 Points void CGContextMoveToPoint (    CGContextRef c,    CGFloat x,    CGFloat y ); 指定 ...

  5. python3 scrapy main运行调式

    from scrapy.cmdline import execute import sys import os sys.path.append(os.path.dirname(os.path.absp ...

  6. RF自定义系统关键字

    如果您准备学习Python,船长在这里给大家推荐几个学习Python的好地方:   1.廖雪峰官网 http://www.liaoxuefeng.com/wiki/001374738125095c95 ...

  7. Asp.net Global 定时执行

    在复杂的业务应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件,定期处理用户状态信息,支付系统中定期同步异常账单等等,我们称之 ...

  8. nodejs之assert

    assert断言在nodejs中的用法: 1.引入assert模块 2.语法 assert('条件', '条件不成立时显示信息'); 例如:assert.js文件 const assert = req ...

  9. [深度学习]实现一个博弈型的AI,从五子棋开始

    好久没有写过博客了,多久,大概8年???最近重新把写作这事儿捡起来……最近在折腾AI,写个AI相关的给团队的小伙伴们看吧. 搞了这么多年的机器学习,从分类到聚类,从朴素贝叶斯到SVM,从神经网络到深度 ...

  10. Linux环境下搭建Git仓库

    1.安装Git $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum ...