發(fā)布于:2020-12-19 19:02:30
0
3068
0
是單個站點在MySQL服務(wù)器上造成了嚴(yán)重破壞嗎?
通過設(shè)置每個用戶的MySQL連接限制,可以保護服務(wù)器上的其他站點免受單個站點的影響,從而導(dǎo)致連接過載。
如果是,您并不孤單。
在我的MySQL優(yōu)化服務(wù)中,我經(jīng)??吹椒?wù)器上有幾個站點占用100%的可用MySQL連接。
您可能熟悉my.cnf中的max_connections設(shè)置;但是您知道嗎,還有一個max_user_connections變量?
所述MAX_USER_CONNECTIONS設(shè)置限制在每個用戶的基礎(chǔ)數(shù)據(jù)庫的連接數(shù)。
如果您想學(xué)習(xí)如何將此變量應(yīng)用于共享主機服務(wù)器,請繼續(xù)閱讀。
這個變量的作用恰如其名,它設(shè)置了一個限制,即每個用戶可以同時連接到MySQL數(shù)據(jù)庫的最大最大連接數(shù)。
在共享主機系統(tǒng)上,這是一項功能強大的設(shè)置,因為您可以使用它來防止單個用戶用盡所有MySQL連接。
通常,我建議您將max_user_connections設(shè)置為max_connections設(shè)置的50-75%。您可以在my.cnf的mysqld部分中設(shè)置此值:
1個 2 3 4 5 6 7 | cat /etc/my .cnf [mysqld] datadir= /var/lib/mysql socket= /var/lib/mysql/mysql .sock user=mysql max_connections = 400 max_user_connections=200 |
在此示例中,我們總共允許400個連接,一個用戶最多可以使用200個連接。
這基于我在100臺MySQL服務(wù)器上的工作。通常,我發(fā)現(xiàn)只有一兩個用戶參與了大多數(shù)MySQL連接。通過將此數(shù)字設(shè)置為50-75%,您可以有效地為其他用戶和站點保留MySQL連接插槽的25-50%。
如果您想更精確地進行調(diào)整,建議您監(jiān)視MySQL以找出高峰連接時間何時發(fā)生。然后在此期間,對服務(wù)器進行輪詢,以查看誰在建立最多的連接。
我對此不太科學(xué)。我通常只在MySQL命令行上運行show process list。我將其與通過諸如NewRelic,ServerDensity之類的工具或安裝的任何服務(wù)器監(jiān)視工具提供給我的跟蹤結(jié)合起來。
然后,我設(shè)置了一個限制,該限制將阻止用戶接管數(shù)據(jù)庫,但仍允許足夠的連接以使站點正常運行。
通過設(shè)置max_user_connections,可以減少單個用戶帳戶對服務(wù)器上所有站點產(chǎn)生負面影響的可能性。這在共享主機設(shè)置中特別有用,在共享設(shè)置中,您可能無法控制最終用戶生成的代碼或流量。
如果DoS或搜索漫游器為網(wǎng)站帶來了大量流量,這也將有所幫助。我已經(jīng)看到過攻擊性搜索機器人可能淹沒MySQL系統(tǒng)的情況。與正常流量不同,搜索引擎會訪問多個頁面-大多數(shù)頁面不太可能緩存在MySQL的查詢緩存或其他緩存中。結(jié)果,負載和MySQL連接可能會激增。設(shè)置max_user_connections限制可以幫助解決這種情況。
您應(yīng)該始終為每個應(yīng)用程序使用唯一的MySQL用戶帳戶。這樣可以提高安全性,并使連接問題的診斷更加容易。
我在單個租戶服務(wù)器上看到的一個常見問題是,傾向于僅將一個用戶用于所有數(shù)據(jù)庫連接。
這是個錯誤。
對于每個應(yīng)用程序,建議您創(chuàng)建一個特定的用戶名和密碼。出于安全和性能方面的考慮,這很好。
通過為每個應(yīng)用程序使用特定用戶,您可以輕松確定哪個應(yīng)用程序正在與數(shù)據(jù)庫建立大量連接。通過組合使用max_user_connections,可以減少單個應(yīng)用程序使系統(tǒng)過載的可能性。
例如,在最近的MySQL優(yōu)化案例中,我發(fā)現(xiàn)對論壇的搜索請求觸發(fā)了長時間運行的MySQL查詢。這些查詢填滿了整個服務(wù)器的連接插槽。結(jié)果,博客和購物車失敗了。
通過使用max_user_connections,我們能夠保護其他應(yīng)用程序免受論壇討論的困擾。
主要缺點是,如果將該數(shù)字設(shè)置得太低,則可能在繁忙的站點上偶爾引起錯誤。由于這些錯誤可能是零星的,因此可能很難檢測到。
如果達到這些限制,大多數(shù)PHP應(yīng)用程序?qū)⒎祷豈ySQL錯誤,提示與MySQL服務(wù)器的連接過多。如果您需要提高此限制,則Apache或PHP錯誤日志也可能提供線索。
在繁忙的MySQL服務(wù)器上使用max_user_connections可以確定特定的MySQL用戶活動,以免對其他用戶造成負面影響。我建議將max_user_connections設(shè)置為您的總max_connections的50-75%。