1、简介

      gearman是一个分布式开发框架,适合处理一些必须处理但是不影响主流程的操作,比如保存日志、发送邮件、缩略图片等。最早是基于perl语言的,2008年发布的时候改为C++语言开发,其开发接口支持多种语言,如PHP、Java、Python、Ruby等等语言。其优点是部署轻便,并且有负载均衡和持久化的功能,除了一些大型场景需要消息队列来处理,一般的问题可以通过gearman来处理。在php官方网站有相应的api文档,gearman的主站也有一些相应的信息。
     gearman的架构主要分为3个角色: client、job server、worker,大致如下:
     1)client: 服务的发起方,请求个gearman处理某个操作,可以是PHP、Java、Python和Ruby等
     2)job server: 服务的调度方,有两个作用,接受worker的请求,注册worker的处理函数,接受client的请求,将处理转向相应的worker。
     3)worker: 服务的处理方,向job server注册本身提供的服务,并接受Job server转发过来的请求,进行处理,可以用PHP、Java、Python、Ruby实现。
     图示如下
   
     可以看出gearman的架构是个非常简单轻量,job server只负责转发,worker只负责处理,你可以启动多个相同的worker,job server会自动把请求在这些worker中均衡分配,并且它们都是通过网络访问,可以分布到不同的机器上,所以可以大大提高系统的性能和扩展性。默认情况下,gearman将接收的job保存到内存中,速度非常快,但是在意外宕机的情况下,就会丢失一些job,这可以通过持久化来解决,gearman支持的持久化策略有很多,常见的有mysql、sqllite、postgresql这些关系数据库,还支持memcached。需要注意的是,持久化会降低gearman的处理速度,所以较好的方法是用memcached做持久化,当然持久化必须部署在不同的机器上,否则没有任何意义。不过memcached宕机了也什么都没有,如果对Job要求非常高,可以使用关系数据库,速度要稍微慢一些。
2、环境
     老式的平板,8核cpu,32G内存,CentOS 7
3、安装
     1)预先准备
     $ yum install gcc gcc-c++ php php-devel boost-devel libevent-devel gperf libuuid-devel   
     //安装mysql
     $ yum install mariadb-*
     //安装memcached
     $  tar xvf memcached-1.4.25.tar.gz
     $ ./configure
     $ make
     $ make install
     //安装libmemcached
     $  tar xvf libmemcached-1.0.18.tar.gz
     $ cd libmemcached-1.0.18
     $ ./configure
     $ make
     $ make install
     2)gearman
     $  tar xvf gearmand-1.1.12.tar.gz
     $  cd gearmand-1.1.12
     $  ./configure
     $ make 
     $ make install
     要注意./configure的输出,按照上面的安装应该不会有什么问题,如果有,直接yum安装就可以了
     其输入最后是
   * CPP Flags:                  -fvisibility=hidden
   * LIBS:
   * LDFLAGS Flags:
   * Assertions enabled:        no
   * Debug enabled:             no
   * Warnings as failure:       no
   * Building with libsqlite3   no
   * Building with libdrizzle   yes
   * Building with libmemcached yes
   * Building with libpq        no
   * Building with tokyocabinet no
   * Building with libmysql     yes
   * SSL enabled:               no
   * cyassl found:              no
   * openssl found:             yes
   * make -j:                   3
   * VCS checkout:              no
   * sphinx-build:              :

需要注意后面的yes或者no,可以看出目前是支持libmemcached, libmysql,意味着持久化策略可以选择memcached和mysql

   //安装php扩展
   $ cd gearman-1.1.2
   $ phpize
   $ ./configure
   $ make && make install
   $ vim /etc/php.ini
   [gearman]
   extension=gearman.so
   $ systemctl restart php-fpm
4、使用
   1)启动job server
   $ gearmand -d
   2)命令
   $ gearman -w -f wc -- wc -l
    //-w 代表启动worker模式, -f 代表函数,这里的名称是wc, --代表对应的函数为wc -l
   $ gearman -f wc </etc/passwd
    // 代表请求wc函数,参数是/etc/passwd的内容
   这里会返回/etc/passwd的行数,在97上是49
   这个命令其实和wc -l < /etc/passwd是一样的
   3)PHP使用
       来一个简单的例子,照搬官方文档
        //worker.php
<?php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "my_reverse_function");
while ($worker->work());
 
function my_reverse_function($job)
{
  $result = strrev($job->workload());
  echo $result."\n";
  return strrev($result);
}
?>
//client.php
<?php
$client= new GearmanClient();
$client->addServer();
print $client->doNormal("reverse", "Hello World!");
print "\n";
?>
先运行worker.php,然后运行client.php,显示结果如下
$ php worker.php
!dlroW olleH
$ php client.php
Hello World!
代码很容易看懂,在http://php.net/manual/zh/book.gearman.php有非常详细的解释,只简单说一下
GearmanWorker有个addServer和addServers方法,可以增加本worker关联的job server,无参数时是127.0.0.1:4730,可以手工指定,增加多个,同样GearmanClient也是一样,有这样的两个方法,也是一样的参数。
GearmanClient有doNormal和doBackground方法,前者会有返回值,后者是后台执行的,返回的是job handle,可以通过这个查询job的执行状态 。原理上前者是因为执行时client一直和job server保持了连接,后者在将要执行的服务增加到job server之后就断开了,不等待结果。
      这都是每次执行一个任务的方法,还有批量执行的方法,如下
      addTask()
      addTaskBackground()
      runTask();
      可以增加很多task,然后一直执行,增加task的方法较多,主要是区分优先级,具体可以参考官方文档。
5、压力测试和持久化存储
     gearman的使用很简单,基本已经说完了,其他的查查文档就可以了。
     测试程序
     //client1.php
<?php
$start = microtime(true);
echo "starting...", $start , "\n";
$gmc = new GearmanClient();
$gmc->addServer("127.0.0.1", 4730);
for ($i = 0; $i < 100000; $i++) {
     $gmc->addTaskBackground("reserve", "just test it", null, $i);
}
$gmc->runTasks();
$end =  microtime(true);
echo "end...", $end, "\n";
echo $end-$start,"\n";
//worker1.php
<?php
$gmw = new GearmanWorker();
$gmw->addServer("127.0.0.1", 4730);
$gmw->addFunction("reserve", function($job) {
     if ($job->unique() == 99999) {
          echo microtime(true), "\n";
     }
     return strrev($job->workload());
});
while($gmw->work());
     1)无持久化
      $php worker1.php
      $php client1.php
      多次运行之后,可以看出提交10万个任务,大约需要1.2秒,即每秒8.5万次,还可以看出worker反应要慢一些,因为他要执行之后才会有返回。
    2)memcached持久化
       $ memcached -d -u root
       $ pkill gearmand
       $ gearmand -d -q libmemcached --libmemcached-servers=127.0.0.1:11211
       $ php worker1.php
       $ php client1.php

多次运行之后,发现运行的很不稳定,从2秒到6秒都有,不过运行10次以上基本稳定在1.5秒到2秒之间,可以看出确实持久化会影响稳定性,对速度也有一定的影响。

   3)mysql持久化
       mysql> create database gearman;
       mysql> use gearman; 
       mysql> create table `gearman_queue` ( `unique_key` varchar(64) NOT NULL, `function_name` varchar(255) NOT NULL, `priority` int(11) NOT NULL, `data` LONGBLOB NOT NULL, `when_to_run` INT, PRIMARY KEY  (`unique_key`) );
       $ pkill gearmand
       $ gearmand -d -q MySQL --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=YoTs97 --mysql-db=gearman --mysql-table=gearman_queue --verbose=INFO
       $ php worker1.php
       $ php client1.php
       多次运行之后,发现时间在2.7-3秒之间,每秒3-4万条,不过不稳定,运行一段时间之后,时间在20秒上下,每秒只有5000条,相当的慢,如果在不是很繁忙的情况下,考虑到持久化带来的好处,可以考虑用mysql做持久化。
    需要注意一下,gearmand只是在启动时检查持久化存储中的队列,如果持久化存储问题了,gearmand不会重新连接,会直接报错,所以需要密切关注持久化存储的状态。
6、较好的部署方式
   job server最好进行持久化,较好的选择是另一台机器上的memcache,worker可以分布到不同的机器上,可以针对worker的繁重程度,启动多个worker,job Server会自动将请求分配到不同的worker上。为避免单点问题,可以启动多个job server,woker同时多个job server上注册,可以通过失败转移的方式,及时切换到另外的Job server上,如果还有性能问题,可以考虑互相隔离的job server或者启用消息队列来处理。
7、supervisor解决进程意外中断,自动重启的问题
     可以看出在这个场景中,worker、job server、和memcached以及mysql都可能会出现问题,但是其功能很单一,只要重启就可以解决问题,可以用supervisor来解决。
     supervisor是一个python程序,也有nodejs版的,nodejs版主要是为了解决nodejs单线程模型出现问题则整个服务就中断的问题,这里的应用比较简单,用supervisor足矣。
     $ yum install python-setuptools
     $ easy_install supervisor
     $ echo_supervisord_conf > /etc/supervisord.conf
     在/etc/supervisord.conf最后增加如下内容
[program:memcached]
command=memcached -u root
user=root
autostart=true
autorestart=true
startsecs=1
[program:gearmand]
command=gearmand
user=root
autostart=true
autorestart=true
startsecs=1
[program:worker]
command=php /data/html/worker.php
user=root
autostart=true
autorestart=true
startsecs=1
[program:worker1]
command=php /data/html/worker.php
user=root
autostart=true
autorestart=true
startsecs=1
 
$ supervisord
$ supervisorctl status
gearmand                         RUNNING   pid 14124, uptime 0:00:05
memcached                        RUNNING   pid 14126, uptime 0:00:05
worker                           RUNNING   pid 14123, uptime 0:00:05
worker1                          RUNNING   pid 14125, uptime 0:00:05
为了让supervisord开机启动,在/etc/rc.local增加一行
/usr/bin/supervisord
 
需要注意的是,supervisord无法监控守护进程,会出现错误。

8、监控gearman: 使用Gearman Monitor

     下载文件到web服务器根目录,解压,composer安装模块,具体如下
     $ unzip master.zip
     $ mv Gearman-Monitor-master/ gmm

     $ cd gmm
     $ composer install 
     浏览器访问:http://172.16.8.97:800/gmm,可以看到worker,client,queue的信息
 
 

gearman学习笔记1的更多相关文章

  1. 【Gearman学习笔记】分布式处理入门

    1.首先,确保你已经安装了gearmand环境并且语言绑定(language binding)已经生效. 2.涉及到的各个部分: ServerThe server, gearmand, will co ...

  2. gearman学习笔记

    <?php 搭建描述: . 在实际使用时应该是运行gearmand -d 的 server 一台. [要装gearmand,运行gearmand] . 处理worker的机器若干[要装gearm ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

随机推荐

  1. 【O】VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空

    问题: VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空: 解决方式: 在vss的客户端的tools-option中,file type选项卡里,在binary file文本框中,加入 ...

  2. 从零开始搭建ELK+GPE监控预警系统

    前言 本文可能不会详细记录每一步实现的过程,但一定程度上可以引领小伙伴走向更开阔的视野,串联每个环节,呈现予你不一样的效果. 业务规模 8个平台 100+台服务器 10+个集群分组 微服务600+ 用 ...

  3. SUCTF--WEB

    题目:flag 在哪? 介绍:网址(http://23.106.143.230/a_real_babyweb.php) 1,打开网址,抓包可以发现在 HTTP 头里面有 Cookie:suctf{Th ...

  4. 基于docker+reveal.js搭建一个属于自己的在线ppt网站

    前言 最近热衷于Docker,由于这段时间使用Docker来折腾自己的服务器,越来越感觉这是一种及其被应该推广的技术,因此想在公司内部也做一次技术分享.当然,如果只是做的PPT,我就不写这文章了.既然 ...

  5. Winform远程更新代码

    本软件具备以下形: 1.通过http形式在客户端更新winform代码文件 2.在服务端通过软件生成xml配置文件,客户端通过比对xml配置文件来更新代码文件. 服务端: 在服务器上建立一个IIS发布 ...

  6. spring boot自定义log4j2日志文件

    背景:因为从 spring boot 1.4开始的版本就要用log4j2 了,支持的格式有json和xml两种格式,此次实践主要使用的是xml的格式定义日志说明. spring boot 1.5.8. ...

  7. CSS常见布局解决方案

    最近要准备移动端项目,大半年没好好写过CSS了,今天恶补了一下CSS的一些布局,下面做一些分享. 水平居中布局 1.margin + 定宽 <div class="parent&quo ...

  8. 十五、Hadoop学习笔记————Zookeeper客户端的使用

    timeout表示会话超时时间,zookeeper靠与客户的心跳来判断会话是否有效(单位毫秒), -r为只读,表示zookeeper如果与半数以上服务器失去连接则会停止服务,如果有-r参数,则会继续保 ...

  9. 自学python笔记(二)

    一:在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍.所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个文件,这样 ...

  10. 并行设计模式(二)-- Master-Worker模式

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Mast ...