簡介:
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
一、安裝、啟動 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
# 先這樣,等空閑的時候補上這塊內容