[英]How should I handle a “too many connections” issue with mysql?
我正在工作的網絡創業公司的並發Web用戶數量從正常的5000個增加到周末的10,000個。 這個星期六的流量非常高,以至於我們開始間歇性地收到“連接過多”錯誤。 我們的CTO通過簡單地增加tatabase服務器上的max_connections值來解決此問題。 我想知道在這里使用一個持久連接是否是更好的解決方案?
即代替使用:
$db = new mysqli('db_server_ip', 'db_user', 'db_user_pass', 'db_name');
我們用:
$db = new mysqli('p:db_server_ip', 'db_user', 'db_user_pass', 'db_name');
我們已經在使用多個MySQL服務器和多個Web服務器(Apache + mod_php)。
您應該在多個Web請求之間共享數據庫連接。 在應用程序服務器上運行的每個進程都應該獲得自己的mysql連接,只要該進程正在運行,並且該連接對於進入的每個Web請求都可以重用。
從PHP文檔 :
如果創建到SQL Server的鏈接的開銷很大,則持久連接是好的。
和
但是請注意,如果您使用的數據庫具有持久子連接超出的連接限制,則這可能會有一些缺點。 如果您的數據庫限制了16個並發連接,並且在服務器會話繁忙的過程中,有17個子線程嘗試連接,那么一個子線程將無法連接。
持久連接不是解決問題的方法。 您的問題是突發使用超出了數據庫配置中設置的限制,甚至超出了基礎架構中設置的限制。 您的CTO所做的,增加連接限制,是一個很好的第一步。 現在,您需要監視數據庫服務器上的資源利用率,以確保它們可以處理來自其他連接的增加的負載。 如果可以的話,那很好。 如果開始發現數據庫服務器資源不足,則需要設置其他服務器來處理流量激增。
太多聯系
原因這是錯誤引起的
您已經執行了SHOW VARIABLES LIKE "max_connections";
並增加了價值。
永久連接
如果使用永久或持久數據庫連接 ,則必須始終考慮MySQL指令wait_timeout
。 關閉不起作用,但是您可以降低超時時間。 因此,使用過的資源將再次更快地可用。 利用netstat
找出完全按照此處描述的方式進行的操作https://serverfault.com/questions/355750/mysql-lowering-wait-timeout-value-to-lower-number-of-open-connections 。
不要忘記釋放結果集以減少數據庫服務器資源的浪費。
建議使用臨時的,短暫的連接,而不是持久連接。 在整個Web請求-響應流中,引入持久性非常重要,因為它是無狀態的。 您知道:1個pconnect請求,導致8小時持久性連接在db服務器上晃來晃去,等待下一個請求,但永遠不會到來。 用用戶數量乘以並查看您的資源。
臨時連接
如果使用mysql_connect()-不要忘記mysql_close()。 將new_link
設置為false並傳遞CLIENT_INTERACTIVE
標志。 您可能需要調整interactive_timeout
,這有助於阻止舊的連接阻塞工作。
如果問題仍然存在,請擴展
如果問題仍然存在,則決定擴展規模。 通過添加另一台數據庫服務器並在其前面放置一個代理(MySQL與HAProxy很好地配合使用),或切換到自動擴展的雲服務。
我真的懷疑您的資料配置正確。 當您已經在運行多個MySQL服務器以及多個Web服務器時,這怎么可能是一個問題? 請描述您的負載平衡設置。
聽起來像Apache 2.2 + mod_php + MySQL +未知的平衡器,對嗎?
也許嘗試
Apache 2.4 + mod_proxy_fcgi + PHP 5.5 / 5.6(php-fpm)+ MySQL(InnoDb)+ HAProxy或
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.