使用 Gearman 實現分布式處理

分類:IT技術 時間:2017-10-04

        因為近來在研究 Mogilefs 的分布文件系統,在讀讀這個的源碼,別外,為公司新設計了一個下載的系統,所以更加要深入研究一下,因為這個好東西是 Perl 寫的,真不容易,在讀這個的時間發現了幾個好東西,其中一個就是我現在要提到的 Gearman ,這是個分布的任務分發的框架。使用 Perl 寫的。後來用 C 重寫了其中一些部分。作者 Brad Fitzpatrick 大神開發的 Gearman, 他原來是 livejournal 的成員,設計最初也是用於LiveJournal的圖片 resize 功能,目前是 Google 的成員.

        簡單的講, Gearman 就是一個用 Perl 寫的任務調度程序,它能提供一個服務器端進行任務調度,自己就不做其它任何事了。客戶端同時也提供了多種語言接口。Gearman 這個框架系統主要的工作是用來委派任務給其他機器,Mogilefs 的分布文件系統的核心就是用的這個。所以我們可以基於這個做一個自己的 Cluster 出來。

        這個軟件的應用場景可以很多,比如 Web 2.0 的項目中,比如常用的視頻網站的視頻處理,分布式日誌處理,電子郵件處理,文件同步處理,圖片處理等等,只要是可以放開,不影響體驗和響應的場景,需要並行進行大量計算和處理的程序,都是可以的。不要因為 Gearman 是 Perl 寫的而認為通用性就不行,因為設計時就是獨立於語言和平臺的。所以客戶端可以是任何語言,象 Perl,PHP,python,Ruby之類。就算是 Shell 也行

Gearman 的作者 Eric Day 介紹,Yahoo! 在 60 或更多的服務器上使用 Gearman 每天處理 600 萬個作業。新聞聚合器 Digg 也已構建了一個相同規模的 Gearman 網絡,每天可處理 400,000 個作業。Gearman 的一個出色例子可以在 Narada 這個開源搜索引擎中找到。

 

Gearman 的架構
一個連接客戶機和 Workerer 連接在 Gearman 上組成一個網絡,也就是 Gearman 請求的處理過程涉及三個部分:Client -> Job -> Worker。這種實際網絡中是非常常用的。然後我們的應用提交程序來做客戶端的程度,提交任務。到了 Job Server 的隊列中,由 Worker 的服務器來取下來,並處理這個任務。
如圖

 

Gearman 怎麽樣工作

Gearman 不但可以做為任務分發,還可以做為應用方面是負載均衡,我們可以讓 Workerer 放在不同的一堆服務器上,也可以啟動放在同一個 CPU 的多個核上,比如,以我們常用的應用視頻轉換程序,但是不希望 Web 的服務器來處理視頻的格式處理的過程,這時,我們就可以在這一堆服務器上進行任務分發,在上面加載 Workerer 處理視頻格式處理和轉換。這樣對外的 web 服務器將不會被視頻轉換的過程影響,同時也能很多的讓所有服務器負載均衡的工作來處理,也非常方便擴展,加一個機器到任務調度中心,註冊成 Workerer 就行,這時 Job Server 會在請求到來的時候,將這個請求發給空閑的這個 Workerer. 另外你還可以運行多個Job Server。可以組成一個 HA 的架構,如果一個Job Server 的進程 down了,client 和 Workerer 會自動遷移到另一臺Job Server上。
如圖

從上面可以看出來 Worker 是可擴展的.如果你有需要 Worker 是可以運行任意多個的.
另外,我們對 Application 是不用過多在意的。同樣也是可以多個的。 Application 的客戶只有一個任務,就是加入任務到 Gearman 中來.

 

安裝 Gearman 的環境
安裝 Gearman::Server 的 Job Server ,如果沒有安裝 Client 就需要 Client 和 Worker 都裝上。如果不會使用 cpanm 的話,參考我以前寫過的 使用CPANMinus 來安裝Perl 模塊

cpanm Gearman::Server
cpanm Gearman::Client
cpanm Gearman::Worker

 

使用 Gearman 的功能
Gearman 總體上來看看,分 4 大步的功能.
1. 啟動 Gearman 的 Job Server 的服務
2. 使用 Worker 加入和註冊一個可以使用的功能
3. Worker 等待功能任務被運行
4. Client 連接啟動任務和提供任務需要的參數

Gearman 的 Job Server 調度程序的使用

(1. 啟動Job:

gearmand -d -L 127.0.0.1 -p 7003

-d deamon
-L 監聽 IP
-p 端口(2. Gearman 的狀態查看

telnet localhost 7003
status
# telnet 127.0.0.1 7003
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
status
convertVideo    0     0     1
echo            1      0     0

 可以見到如上的輸出,分 4 個部分.
已知註冊的任務, 正在運行的任務, 隊列中的任務,可用的 Worker.
如 convertVideo 0 0 1 .這個部分,註冊的任務名為 convertVideo,0 個正常在運行,隊列為空,有一個可用的 Worker.

 

Gearman::Worker 的基本語法和使用

這個沒有什麽好講的,連接到主 Gearman 調度服務器。然後是通過內部的 register_function  函數來註冊一個功能,到 Gearman 的主調度服務器上去。好讓調度服務器知道這個 Worker 能處理的任務是什麽。

#!/usr/bin/perl
use strict;
use warnings;
use Gearman::Worker;
 
my $worker = Gearman::Worker->new;
$worker->job_servers('127.0.0.1');
 
# Worker 註冊可以使用的功能,如果視頻轉換...
$worker->register_function( convertVideo => \&convertVideo );  
 
# 等待連接的任務
$worker->work while 1;  
 
sub convertVideo{
    my $job = shift;
    # TODO 做你要實現的事情,任務
    return $job->arg;
}

 

Gearman::Client 的基本語法和使用

Gearman::Client  工作分同步和異步二種,默認我打開的是異步的功能,註掉的部分打開就是使用同步調用任務。

 

#!/usr/bin/perl
use strict;
use warnings;
use Gearman::Client;
 
my $client = Gearman::Client->new;
$client->job_servers('127.0.0.1');
 
# 設置異步任務
my $tasks = $client->new_task_set; 
$tasks->add_task(
        # 開始任務
        convertVideo    => 'new.flv', 
        # 註冊回調函數 
        { on_complete   => \&complete },  
        );  
# 等待任務結束
$tasks->wait;
 
sub complete{
    my $result = shift;
    print $$result ."\n";
} 
 
# 設置同步任務
#my $resultRef = $client->do_task( "convertVideo", "new.flv" );
#print "$$resultRef\n";
 
#$client->dispatch_background( "convertVideo","new.flv" );

 

 相關文檔 http://search.cpan.org/~dormando/Gearman-Server-1.11/


Tags: Gearman 處理 這個 可以 一個 因為

文章來源:


ads
ads

相關文章
ads

相關文章

ad