Gearman及python客戶端安裝和簡單試用
Gearman 簡介
Gearman是一個用來把工作委派給其他機器、分布式的調用更適合做某項工作的機器、并發的做某項工作在多個調用間做負載均衡、或用來在調用其它語言的函數的系統。
Gearman提供了一種通用的程序框架來將你的任務分發到不同的機器或者不同的進程當中。它提供了你進行并行工作的能力、負載均衡處理的能力,以及在不同程序語言之間溝通的能力。Gearman能夠應用的領域非常廣泛,從高可用的網站到數據庫的復制任務。總之,Gearman就是負責分發處理的中樞系統,它的優點包括:
- 開源:Gearman免費并且開源而且有一個非常活躍的開源社區,如果你想來做一些貢獻,請點擊 。
- 多語言支持:Gearman支持的語言種類非常豐富。讓我們能夠用一種語言來編寫Worker程序,但是用另外一種語言編寫Client程序。
- 靈活:不必拘泥于固定的形式。您可以采用你希望的任何形式,例如 Map/Reduce。
- 快速:Gearman的協議非常簡單,并且有一個用C語言實現的,經過優化的服務器,保證應用的負載在非常低的水平。
- 可植入:因為Gearman非常小巧、靈活。因此您可以將他置入到現有的任何系統中。
- 沒有單點:Gearman不僅可以幫助擴展系統,同樣可以避免系統的失敗。
Gearman的原理
[導言]Gearman最初在LiveJournal用于圖片resize功能,由于圖片resize需要消耗大量計算資源,因此需要調度到后端多臺服務器執行,完成任務之后返回前端再呈現到界面。Gearman分布式任務實現原理上只用到2個字段,function name和data。function name即任務名稱,由client傳給job server, job server根據function name選擇合適的worker節點來執行。
一個Gearman請求的處理流程:Client -> Job -> Worker。
Client:請求的發起者,可以是 C,Python,PHP,Perl,MySQL UDF 等等。
Job:請求的調度者,用來負責協調把 Client 發出的請求轉發給合適的 Work。
Worker:請求的處理者,可以是 C,Python,PHP,Perl 等等。
因為 Client,Worker 并不限制用一樣的語言,所以有利于多語言多系統之間的集成,甚至我們通過增加更多的 Worker,可以很方便的實現應用程序的分布式負載均衡架構。
# tar zxf gearmand-1.1.4.tar.gz // gearmand 安裝 # cd gearmand-1.1.4 # ./configure # make&& make install # tar zxf python-gearman-2.0.2.tar.gz // python-gearman Client&Worker APIs安裝 # cd python-gearman-2.0.2 # python setup.py install
啟動Job:
# gearmand -L 10.0.0.51 -p 4730 -u root -d // -d 以守護進程啟動(deamon) \ -L 表示要監聽IP \ -p 表示要監聽的端口 \ // 遇到問題:“gearmand: error while loading shared libraries: libpq.so.5 \ cannot open shared object file: No such file or directory” // 解決辦法: 因為我的測試環境裝有postgres,所以會提示找不到linpg共享庫,可如下解決 # echo "/usr/local/posgres/lib" >> /etc/ld.so.conf # ldconfig # ldconfig -v|grep libpg* 此時驗證應該就ok了好了,通過命令行工具來體驗 Gearman 的功能:
# gearman -h 10.0.0.51 -p 4730 -w -f task01 -- wc -l // -h 代表所要連接的Job server host \ -p 代表Job server的端口 \ -w 代表啟動的是worker \ -f task01 代表啟動一個task名字為task01 \ -- wc -l表示這個task是做wc -l 統計行數 # gearman -h 10.0.0.51 -p 4730 -f task01 < /etc/passwd // 調用名字為task01的worker,參數為"/etc/passwd",意思讓worker統計passwd文件的行數
Gearman 的狀態查看:
# telnet 10.0.0.51 4730 status task01 0 0 1 . ("ctrl+]" ---> "quit" 即可退出telnet) 可以見到如上的輸出,分 4 個部分. "已知注冊的任務" * "正在運行的任務" * "隊列中的任務" * "可用的 Worker". 如 "task01 0 0 1"這個部分,注冊的任務名為 task01,0 個正常在運行,隊列為空,有一個可用的 Worker.
Gearman的python客戶端簡單使用:
#!/usr/bin/python # -*- coding:utf-8 -*- # This is worker.py import os import gearman import math class CustomGearmanWorker(gearman.GearmanWorker): def on_job_execute(self, current_job): print "Job started" return super(CustomGearmanWorker, self).on_job_execute(current_job) def task_callback(gearman_worker, job): print job.data return job.data new_worker = CustomGearmanWorker(['10.0.0.51:4730']) new_worker.register_task("echo", task_callback) new_worker.work()
#!/usr/bin/python # -*- coding:utf-8 -*- # This is client.py from gearman import GearmanClient new_client = GearmanClient(['10.0.0.51:4730']) current_request = new_client.submit_job('echo', 'foo') new_result = current_request.result print new_result
注:我的本機IP是10.0.0.51,gearman server端默認開啟端口4730
啟動worker:
# python worker.py Job started foo啟動client,在另外一個終端:
# python client.py foo
Gearman 的高級特性:
在一個 Web 應用程序內可能有許多地方都會用到 Gearman。可以導入大量數據、發送許多電子郵件、編碼視頻文件、挖據數據并構建一個中央日志設施 — 所有這些均不會影響站點的體驗和響應性。可以并行地處理數據。而且,由于 Gearman 協議是獨立于語言和平臺的,所以您可以在解決方案中混合編程語言。比如,可以用 PHP 編寫一個 producer,用 C、Ruby 或其他任何支持 Gearman 庫的語言編寫 worker。
一個連接客戶機和 worker 的 Gearman 網絡實際上可以使用任何您能想象得到的結構。很多配置能夠運行多個代理并將 worker 分配到許多機器上。負載均衡是隱式的:每個可操作的可用 worker(可能是每個 worker 主機具有多個 worker)從隊列中拉出作業。一個作業能夠同步或異步運行并具有優先級。
Gearman 的最新版本已經將系統特性擴展到了包含持久的作業隊列和用一個新協議來通過 HTTP 提交工作請求。對于前者,Gearman 工作隊列保存在內存并在一個關系型數據庫內存有備份。這樣一來,如果 Gearman 守護程序故障,它就可以在重啟后重新創建這個工作隊列。另一個最新的改良通過一個 memcached 集群增加隊列持久性。memcached 存儲也依賴于內存,但被分散于幾個機器以避免單點故障。
Gearman 是一個剛剛起步卻很有實力的工作分發系統。據 Gearman 的作者 Eric Day 介紹,Yahoo! 在 60 或更多的服務器上使用 Gearman 每天處理 600 萬個作業。新聞聚合器 Digg 也已構建了一個相同規模的 Gearman 網絡,每天可處理 400,000 個作業。Gearman 的一個出色例子可以在 Narada 這個開源搜索引擎(參見 參考資料)中找到。
相關參考:
http://www.cnblogs.com/greatqn/archive/2011/11/07/2239337.html
http://blog.chinaunix.net/uid-9460004-id-2002456.html (gearman python 使用)
http://blog.chinaunix.net/uid-9460004-id-2002457.html (Nginx gearman 集群調度對)
http://timyang.net/linux/gearman-monitor/ (利用Gearman來實現遠程監控與管理)
http://www.kongch.com/2010/04/gearman-how-to/ (用Gearman進行分布式任務處理)
http://blog.csdn.net/jenkinslee/article/details/6554299 (Gearman協議)
http://gearman.org/manual
http://packages.python.org/gearman/worker.html#job-processing (python-gearman v2.0.2 documentation)
http://www.saltycrane.com/blog/2010/04/notes-using-gearman-with-python/ (Notes on using Gearman with Python)