一、簡介php
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要求很是高,可使用關係數據庫,速度要稍微慢一些。
二、環境
老式的平板,8核cpu,32G內存,CentOS 7
三、安裝
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
四、使用
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!
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的方法較多,主要是區分優先級,具體能夠參考官方文檔。
五、壓力測試和持久化存儲
gearman的使用很簡單,基本已經說完了,其餘的查查文檔就能夠了。
測試程序
//client1.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);
echo "end...", $end, "\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不會從新鏈接,會直接報錯,因此須要密切關注持久化存儲的狀態。
六、較好的部署方式
job server最好進行持久化,較好的選擇是另外一臺機器上的memcache,worker能夠分佈到不一樣的機器上,能夠針對worker的繁重程度,啓動多個worker,job Server會自動將請求分配到不一樣的worker上。爲避免單點問題,能夠啓動多個job server,woker同時多個job server上註冊,能夠經過失敗轉移的方式,及時切換到另外的Job server上,若是還有性能問題,能夠考慮互相隔離的job server或者啓用消息隊列來處理。
七、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增長一行
須要注意的是,supervisord沒法監控守護進程,會出現錯誤。
八、監控gearman: 使用Gearman Monitorhtml
下載文件到web服務器根目錄,解壓,composer安裝模塊,具體以下
$ unzip master.zip
$ mv Gearman-Monitor-master/ gmm
$ cd gmm
$ composer install
瀏覽器訪問:http://172.16.8.97:800/gmm,能夠看到worker,client,queue的信息