• 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", "
    Hello 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

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

  • 相关阅读:
    Python 操作Redis 转载篇
    Django运行SQL语句
    将博客搬至CSDN
    MySQL学习(三)函数
    MySQL学习(二)数据类型
    MySQL学习(一) 数据表基本操作
    Django聚合函数
    windows平台上编译mongdb-cxx-driver
    小程序登陆遇到 ERR_REQUEST_PARAM
    Opengrok服务器搭建step by step
  • 原文地址:https://www.cnblogs.com/wangxiaoqiangs/p/5961377.html
Copyright © 2020-2023  润新知