2016-11-13 101 views
1

我在自定義Joomla應用程序中使用Gearman並使用Gearman UI來跟蹤活動的工作人員和作業編號。PHP Gearman太多的mysql連接

我正面臨着MYSQL的負載和連接數量的問題,我無法跟蹤這個問題,但我有幾個問題可以幫助我。

1- Gearman Workers是否爲每個作業啓動一個新的數據庫連接還是共享相同的連接?

2-如果Gearman每次運行作業都會啓動一個新連接,我如何更改該連接以使所有作業共享相同的連接?

3-如何平衡多臺服務器之間的負載?

4-是否有像MYSQL託管的「現收現付」軟件包?如果是,請提及它們。

非常感謝!

+0

我不知道您的應用程序運行的確切程度。 Gearman本身只使用持續隊列來寫入隊列並在重新啓動後從中讀取。所以Gearman只使用一個連接。我相信你的工作每次都會啓動一個新的mysql連接,因爲你的工作,齒輪工人無法幫到你。你必須在你的工人代碼中修復它。 http://php.net/manual/en/features.persistent-connections.php可能可以幫助這裏。 3)多數民衆贊成什麼齒輪的人?只有一個服務器和來自任何地方的多個客戶... gearman會處理它.. 4) - 抱歉,不知道:( –

+0

@ dominik.mank 3)我想運行在多臺服務器上的工作人員,而不是一臺服務器。這可能使用Gearman? –

+0

請查看經銷商http://gearman.org上的圖片http://gearman.org/img/cluster.png。是的,它可能,但不是我不能說你的應用程序如何完成它,因爲它取決於你如何使用gearman。 –

回答

0

在工作人員使用任何類型的工作隊列時,這通常是一個被忽視的問題。 100名工作人員將分別打開一個單獨的數據庫連接(它們是獨立的PHP進程)。如果MySQL配置了50個連接,工作人員將開始失敗。要回答你的問題:

1)每個worker每個在一個PHP進程內部運行,並且該進程將打開1個數據庫連接。工作人員不共享數據庫連接。

2)如果只有一個工作人員正在處理作業,則只會打開一個數據庫連接。如果您有50名員工正在運行,則需要50個數據庫連接。由於這些不是網絡請求,持續連接將不起作用,共享將無法工作。

3)您可以通過添加READ從站來平衡負載,並使用MySQL代理來分配負載。

4)我從來沒有見過即付即用MySQL託管解決方案。要求您的提供商增加您的連接數量。如果他們不願意,可能是時候運行你自己的服務器了。

此外,守隊員服務器進程本身將只使用一個數據庫連接來維護隊列(如果您已啓用mysql存儲)。

策略可以用來與數據庫很好的嘗試,並讓你的員工代碼玩法:

  1. 每次作業後,終止工作,並再次啓動。在收到新作業之前,不要打開新的數據庫連接。使用supervisor可讓您的員工始終保持正常運轉。

  2. 每次查詢後關閉數據庫連接。如果您看到大量連接在「睡眠」狀態下打開,這將有助於清理並保持較低的數據庫連接。每次查詢後嘗試$pdo = null;(如果使用PDO)。

  3. 緩存頻繁使用的查詢,其結果不會改變,以保持數據庫連接低。

  4. 確保您的表格已正確編制索引,以便查詢以儘可能快的速度運行。

  5. 確保在try/catch塊中捕獲數據庫異常。添加重試邏輯(while循環),其中工作人員在說出10次嘗試後將優雅地失敗。確保失敗後將作業放回隊列。

+0

謝謝@Kris我認爲這回答了我所有的問題。我現在只有一個問題。如何使用多臺服務器來運行Gearman工作人員?我應該在所有服務器上註冊工作人員並將文件複製到所有服務器上,並使用(addServer)函數,或者究竟是什麼? –

+0

是的,這是正確的,你將你的代碼複製到更多的服務器上,基本上克隆它們,並運行工作人員。隨着工作量的增加,這就是擴展的方式。 –

0

我認爲最重要的事情是在MySQL之前查看其他內容。這可能是你有一些非常沉重的查詢導致這個混亂。你有沒有檢查MySQL的慢查詢日誌?如果是的話,你發現了什麼?請注意,任何需要一秒以上才能執行的查詢是一個緩慢的查詢。

+0

嗯,我爲工作人員使用持久性存儲,這意味着要在數據庫中插入太多的序列化數組來管理作業隊列。我認爲這就是我所面對的這個很大的MYSQL負載背後的原因。目前,我正在嘗試尋找不同的解決方案,如會話或文件存儲。 –