gearman 簡介

附件  Gearman.docphp

 

1:介紹gearmanlinux

1.1 簡介

Gearman是一個用來把工做委派給其餘機器、分佈式的調用更適合作某項工做的機器、併發的作某項工做在多個調用間作負載均衡、或用來在調用其它語言的函數的系統服務器

     開源:Gearman免費而且開源並且有一個很是活躍的開源社區,若是你想來作一些貢獻,請點擊 。架構

     多語言支持:Gearman支持的語言種類很是豐富。讓咱們可以用一種語言來編寫Worker程序,可是用另一種語言編寫Client程序。併發

     靈活:沒必要拘泥於固定的形式。您能夠採用你但願的任何形式,例如 Map/Reduce。負載均衡

     快速:Gearman的協議很是簡單,而且有一個用C語言實現的,通過優化的服務器,保證應用的負載在很是低的水平。異步

     可植入:由於Gearman很是小巧、靈活。所以您能夠將他置入到現有的任何系統中。分佈式

     沒有單點:Gearman不只能夠幫助擴展系統,一樣能夠避免系統的失敗函數

但有弊端就是佔用系統資源較多,例如CPU、內存工具

 

 

1.2 使用場景

將任務分發到多臺服務器週期性的併發執

郵件短信發送

異步

跨語言相互調用(對於密集型計算的需求,能夠用C實現,PHP直接調用)

典型架構:

 

 

1.3 工做原理

 

 

 

 

一個Gearman請求的處理過程涉及三個角色:Client -> Job -> Worker。

Client:請求的發起者,能夠是 C,PHP,Perl,MySQL UDF 等等。

Job:請求的調度者,用來負責協調把 Client 發出的請求轉發給合適的 Worker。

Worker:請求的處理者,能夠是 C,PHP,Perl 等等。

由於 Client,Worker 並不限制用同樣的語言,因此有利於多語言多系統之間的集成。

甚至咱們經過增長更多的 Worker,能夠很方便的實現應用程序的分佈式負載均衡架構。

 

2:linux下安裝Gearman

2.1準備安裝軟件

Gearman: https://launchpad.net/gearmand/1.2/1.1.2

Php擴展:http://pecl.php.net/get/gearman

2.2編譯gearman

 

 

基本面

基本的編輯步奏,若是編譯有問題,按照

 

 

 

若是提示錯誤 按照提示相應的解決

 

編譯完成以後:

gearmand -d

啓動一個守護進程,gearmand –help 查看相關參數的用途

簡單說明:

-d 守護進程模式
-L 監聽 IP
-p 端口(7003爲舊版本的默認端口,如今已經改成4730)

2.3編譯gearman php擴展

       操做:

 

 

 

 

 

 

 

 

 

編譯後生成 .so 文件 加入到ph.ini中 reload service

extension="gearman.so"

 

phpinfo() 查看是否開啓該模塊

 

3:php 做爲worker  client 的基本使用

3.1Worker.php

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.2Client.php

 

 

 

 

 

 

 

 

 

 

 

 

Cli  下運行:

php worker.php&
phpclient.php

 

4. Gearman中的TCP消息機制

Gearman中Client和Job、Worker和Job之間的通信是經過TCP套接字數據包實現
Gearman中的消息是基於TCP的變長二進制消息:
請求和響應分別由Message Flag區分。這是一個4字節的結構。
Message Type目前共有36個,詳細的定義可見http://gearman.org/index.php?id=protocol。它是一個4字節的big-endian的整形。
Data length定義了消息體的長度。它也是一個4字節的big-endian的整形。
消息體可由0-N個argument構成,argument間以’\0’分隔。長度是Data Length

 

5. Gearman中的Job異步和同步的區別

不管是不是哪一種類型的 job,worker的工做流程都是同樣的:

1.Worker經過CAN_DO消息,註冊到Job server上。

2.隨後發起GRAB_JOB,主動要求分派任務。

3.Job server若是沒有job可分配,就返回NO_JOB。

4.Worker收到NO_JOB後,進入空閒狀態,並給Job server返回PRE_SLEEP消息,告訴Job server:」若是有工做來的話,用NOOP請求我先。」

5.Job server收到worker的PRE_SLEEP消息後,明白了發送這條消息的worker已經進入了空閒態。

6.這時若是有job提交上來,Job server會給worker先發一個NOOP消息。

7.Worker收到NOOP消息後,發送GRAB_JOB向Job server請求任務。

8.Job server把工做派發給worker。

9.Worker幹活,完過後返回WORK_COMPLETE給Job server。

值得注意的是,第6步中,Job server會給每一個發送過PRE_SLEEP消息的worker都發送NOOP 消息,哪一個worker先進入到第7步,即哪一個worker發送的GRAB_JOB最早被Job server收到,那麼這個job就被派發到哪一個worker。這一點能夠在worker端實現時利用起來,以控制任務的派發策略。也就是說,咱們能夠經過自定義worker端的請求策略的方式來達到自定義job分派策略的目的

 

同步調用碰到的缺點:

• 每啓動一個Work,Job服務器會自動建立一個Pid文件,這意味着他會佔用文件打開句柄數 

•當Client個數超過Worker個數的時候會出現排隊現象,排隊時會加長處理時間

•彌補方式,啓動多個Woker迚程,如併發要求300那麼啓動150個Work 

•形成後果,Worker空閒會致使閒置佔用資源 

•補救方式, –worker-wakeup 參數,指定喚醒多少個 Worker 進行處理。

•忽然發現個工具GearmanManager, 能夠搞定上面事情~只要簡單的使用便可   

•傳遞的參數必須序列化 

• Work佔用必定內存和cpu,打開過多會佔用不少資源非服務羣使用效果不明顯

 

異步調用的缺點:

 •多個work處理log記錄時,容易出現個別log亂序 

 •Work啓動太少且工做時間太長會致使任務堆積,Job服務器佔內存過多

•Work內調用的工做函數錯誤沒法處理或通知,只能經過log查看結果 

• 若是worker異常,沒有接任務的worker很難發現,只能觀察Job的持久服務器內的數據量

 

6. Gearman服務監控

7. Gearman的線程模型

8. Task和Job的區別

9.使用MySQL做爲持久隊列

10.GearmanJob自動故障轉移

鑑於Gearman官網中說到,能夠啓動多個job服務器實例來保證job的自動故障轉移功能,這樣當一個job down後能夠由另外一個job來處理,保證不間斷的進行服務。我這裏進行了測試,發現Gearman的確實現了自動故障轉移功能,我這裏的測試以下
1:啓動兩個虛擬機,分別爲:
A:安裝了PHP環境、Gearman job、Gearman PHP擴展;IP地址:192.168.213.184
B:只須要安裝Gearman job;IP地址:192.168.213.185
2:兩個虛擬機同時啓動Gearman的Job服務器,以下:>./gearmand -d
3:在A虛擬機中編寫worker.php,並運行worker實例,以下:
 
 

 

在以上的基礎上,我使用kill -9命令隨意關閉掉A、B虛擬機中的任意一個Job服務器,client.php都能正確運行,
說明當一臺Job down時,服務仍然能繼續進行,而且down的服務器重啓後,就能夠立刻繼續服務,不須要任何額外的配置。
相關文章
相關標籤/搜索