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

# 先這樣,等空閑的時候補上這塊內容


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM