Gearmand 任务分发系统

简介:

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.13.tar.gz
shell > cd gearmand-1.1.13
shell > ./configure; make; make install

shell > gearmand -V
gearmand: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory

解决方法:

shell > ln -s /usr/local/mysql-5.5.52/lib/libmysqlclient.so.18 /usr/lib64/

shell > gearmand -V
gearmand 1.1.13 - 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 默认 4370

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.8 - 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 2016/10/14

# 设置初始启动多少个 worker 进程,默认 10 个
worker_num=10
# 设置 worker 脚本文件路径
worker_file=‘/root/script/worker.php‘

start_worker(){
  i=0
  while [ $i -lt $worker_num ];do
    /usr/local/php/bin/php $worker_file &
    let i++
  done

  [ $? -eq 0 ] && status_worker || echo "Start falied"
}

stop_worker(){
  ps aux | grep -v grep | grep ‘worker.php‘ | awk ‘{print $2}‘ | xargs -i kill {}

  [ $? -eq 0 ] && 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(){
  $1
}

case $1 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‘,4370);
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

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

时间: 2024-08-24 04:33:21

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

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

一.命令 except 实例详解 介绍 expect 使用场景 二.构建文件分发系统 需求背景 实现思路 核心命令

centos shell编程4【分发系统】 第三十八节课

centos shell编程4[分发系统]  第三十八节课 http://www.cnblogs.com/MYSQLZOUQI/p/4811790.htmlmkpasswd 生成密码的工具,安装 expect包 yum install -y expect 上半节课 下半节课 f

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

第一部分:expect讲解expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令.但当不能使用密钥验证的时候,我们就没有办法了.所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令.使用expect之前,需要先安装expect:yum install -y expect 1. 自动远程登录,并执行命令,登陆另外一台机器,与机器交互的脚本,登陆自动输入密码首先来看一个登录后不退出

shell【分发系统】

第一部分:expect讲解 expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令.但当不能使用密钥验证的时候,我们就没有办法了.所以,这时间只知道对方机器的账号和密码可以通过expect脚本实现登录和远程命令. 使用expect之前,需要安装expect: yum install -y expect 1.自动远程登录,并执行命令 首先来看一个登录后不退出的脚本 vim 1.expect      #需使用e

2.2-构建简易文件分发系统

构建文件分发系统 1. 需求背景 对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台.所以,自动同步文件是至关重要的. 2. 实现思路 首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可.注意:环境必须一致,否则可能出现问题. 3. 核心命令 rsync -av --files-from=list.txt  /  [email protected]:/     这条语句用来批量

shell-编写分发系统

分发系统:用于多台服务器代码或者软件的同时分发执行 1.install –y expect   安装expect程序 用于自动登录远程服务器 2.编写自动登录脚本 vim hu.expect #!/usr/bin/expect set host "192.168.***.***" #定义host 是"192.168.***.***"这是expect定义变量的独有的方式 set passwd "123456" #定义密码是123456 spawn 

分发系统

第一部分:expect讲解expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令. 但当不能使用密钥验证的时候,我们就没有办法了.所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令.使用expect之前,需要先安装expect:yum install -y expect 自动远程登录,并执行命令首先来看一个登录后不退出的脚本: #! /usr/bin/expectset ho

20.31 expect脚本同步文件;20.32 expect脚本指定host和要同步的文件;20.33 构建文件分发系统;20.34

20.31 expect脚本同步文件 自动同步文件 1. 同步远程机器hao2上/tmp/12.txt文件 到本机/tmp/下: [[email protected] ~]# vim 4.expect 添加内容: #!/usr/bin/expect set passwd "admin" spawn rsync -av [email protected]192.168.211.129:/tmp/12.txt /tmp/ expect { "yes/no" { send

shell编程之【分发系统】

一.expect讲解 expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令.但当不能使用密钥验证的时候,我们就没有办法了.所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令. 1.安装expect [[email protected] ~]# yum install -y expect 2.自动远程登入脚本 自动远程登录,并执行命令,下面介绍几个脚本: 第一个:登陆后不退出