1. 程式人生 > >關於大併發mysql連線引起資料庫錯誤OperationalError: (2003, "Can't connect to MySQL server on 'x.x.x.x (99)")分析

關於大併發mysql連線引起資料庫錯誤OperationalError: (2003, "Can't connect to MySQL server on 'x.x.x.x (99)")分析

之前線上一個服務偶爾會產生資料庫連線失敗的錯誤,類似這種

OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (99)")

通過分析業務邏輯,分析出引起這個問題的原因是因為當時短時間內產生了大量的資料庫連線。

接著我在本地測試環境寫了下面的python指令碼

import MySQLdb
def test(self):
    while True:          
        db = MySQLdb.connect(host='127.0.0.1', user='me',passwd='mypassword')
        c = db.cursor()
        c.close()
        db.close()
        print i
        i = i + 1
執行之後,在12秒之後報相同的錯誤退出,整個過程中開啟了28287個連線。

在這12秒過程中監控資料庫發現當時的資料庫連線數在15以下,是正常狀態。因此基本可以斷定這個bug和資料庫本身沒有主要關係。

通過下面命令可以統計當前各種狀態的連線的數量

# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 28417
ESTABLISHED 49
可能出現的情況以及解釋
CLOSED:無連線是活動的或正在進行
LISTEN:伺服器在等待進入呼叫
SYN_RECV:一個連線請求已經到達,等待確認
SYN_SENT:應用已經開始,開啟一個連線
ESTABLISHED:正常資料傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉

可以看到連線資料庫失敗的時候,存在大量的time_wait狀態的連線。基本可以斷定造成此Bug的原因是因為time_wait積累導致埠耗盡。

產生time_wait的原因:

當某個tcp端點關閉tcp連線時,會在記憶體中維護一個小的控制塊,用來記錄最近關閉連結的ip地址和埠號,這類資訊只會維持一小段時間,通常是所估計的最大分段使用期的兩倍(成為2MSL,通常為2分鐘),在這段時間內無法重新建立兩個具有相同ip地址和埠號的連線。

在本場景下構建一條tcp連線的4個值

<source-IP-address,source-port,destination-address,desctnation-port>
中只有源埠號是可以改變的,客戶端(python指令碼所在機器)每次連線到伺服器(資料庫)上去時,都會獲得一個新的原埠,以實現連結惟一性,

但是由於可用埠的數量有限(比如60000)個,而在2MSL秒(比如120秒)內連線是無法重用的,連線率被限制在60000/120=500秒/次。

當前場景就是因為連線率過高導致time_wait埠耗盡的問題,埠耗盡後由於沒有可用埠自然遇到連線資料庫失敗.

知道問題的原因我們可以從兩方面解決問題:

1.減少time_wait連線等待時間

通過修改核心引數解決

主要修改兩個引數

tcp_tw_recycle - BOOLEAN
	Enable fast recycling TIME-WAIT sockets. Default value is 0.
	It should not be changed without advice/request of technical
	experts.

tcp_tw_reuse - BOOLEAN
	Allow to reuse TIME-WAIT sockets for new connections when it is
	safe from protocol viewpoint. Default value is 0.
	It should not be changed without advice/request of technical
	experts.
參考自

修改方法如下

[[email protected] ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
[[email protected] ~]#

vim /etc/sysctl.conf
增加或修改net.ipv4.tcp_tw值:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

使核心引數生效:
[[email protected] ~]# sysctl -p

[[email protected] ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

2.增加客戶端負載生成機器的數量,或這個確保客戶端和伺服器在迴圈使用幾個虛擬ip地址已增加更多的連線組合,

在本場景中因為是主要和資料庫的互動,可以通過建立資料庫連線池複用myslq連線較少新連線的生成.

參考資料

http://elf8848.iteye.com/blog/1739571

http://blog.csdn.net/sungblog/article/details/1385345

<<http權威指南>> 4.2.7 TIME_WAIT累積與埠耗盡

相關推薦

關於併發mysql連線引起資料庫錯誤OperationalError: (2003, "Can't connect to MySQL server on 'x.x.x.x (99)")分析

之前線上一個服務偶爾會產生資料庫連線失敗的錯誤,類似這種 OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (99)") 通過分析業務邏輯,分析出引起這個問題的原因是因為當時短時

在本地用 Navicat 連線遠端資料庫報錯:Can't connect to MySQL server on 。。。

在騰訊雲新買了一臺伺服器,環境都安裝好了,在本地用 Navicat 連線資料庫,就是連線不上,一直報錯Can’t connect to MySQL server on 。。。搞了三四個小時,終於搞定,分享一下過程。 一、檢查使用者授權 1.進入ubuntu

解決: pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on xxxx

在MySQL Server 已經安裝好的情況下, Python 3 使用 pymysql 進行連線資料庫操作時,出現的BUG如下圖:在網上找了資料,看有的說是MySQL沒有開啟,有的說是一些許可權問題,這個問題困擾了我一天,最終我發現,我原來的測試程式碼這樣寫:貌似並不規範,

Nativecat連線linux伺服器的mysql資料庫問題解析(2003-Cant connect to mysql server on ‘localhost‘(10038))

今天配置Linux系統安裝和操作Mysql時,Nativecat無法連線Mysql資料庫,折騰了好久終於解決該問題,此時分享出來希望可以幫助以後同樣遇到該問題的同學一點幫助,不至於走彎路。首先丟擲問題 連線mysql資料庫時遇到“2003-Can’t connect to m

MySQL 資料庫連線失敗 SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (13)

CentOS6.5x64 安裝禪道6.2,生成配置檔案,資料庫連線失敗 資料庫連線失敗 SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (13) root,密碼肯定沒有錯(命令列可

win10連線navicat 連線mysql server時遇到2003-Can't connect to MySQL server on 'localhost'(10038)錯誤

解決辦法: 今天進行連線資料庫時遇到一個頭疼的問題,就是連線錯誤,如圖 然後就百度拉一下,爬了一下貼,翻了一些博,然後就自己寫一下吧,自己實際操作步驟,因為網上的很多都不是win10 首先找到管理工具,可以通過搜尋項搜尋 然後,點選高階安全windows防火牆 再

MySQL執行錯誤解決:Can't connect to MySQL server on localhost (10061)解決方法

問題描述: 在命令列輸入 mysql -u root -p 登入mysql,返回”Can’t connect to MySQL server on localhost (10061)”錯誤。 解決方法: 1、將mysql加入到Windows的服務中。切換到my

windows下用Python連線mysql報錯問題“MySQLdb in Python: “Can't connect to MySQL server on 'localhost'””

""" __author__ = 'chenguolin' __date__=2014-02-17 """ import MySQLdb db = MySQLdb.connect(host="

Navicat for Mysql 出現2003 can't connect to MySQL server on

                環境:Navicat for Mysql 8.2 + MySQL Sever 5.1問題:通過MySQL命令列能連線,但是通過Navicat for Mysql 8.2卻連不上,出現如下錯誤:2003 - can's connect to MySQL server on 'lo

連線MySQL的10060錯誤:Cant connect to MySQL server on ‘...’(10060)

連線MySQL的10060錯誤:Can’t connect to MySQL server on ‘...’(10060) 使用MySQL的圖形介面管理工具Navicat for MySQL連線Mysql資料庫時提示錯誤:Can’t connect to MySQL server (

Can't connect to MySQL server on 'x.x.x.x' (10038) mysql資料庫連線不上問題

總結1.防火牆(是否關閉)2. 入站規則(3306)3. 許可權問題(我的是許可權問題) 問題1.2參考:   請自行搜尋我的是問題三誤刪管理員賬戶導致的許可權問題 -------------------------------------------------

遠端連線資料庫時出現Can't connect to Mysql on '主機名'(10061)解決方法

情況一: 授權法。例如,你想myuser使用mypassword從任何主機連線到mysql伺服器的話。  GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OP

win7下安裝解壓版MySQL(版本:5.7.21) 完全解決MySQL錯誤2003Cant connect to MySQL server (10060)

step1:下載 我安裝的日期是2018年3月2日,版本為5.7.21,我的電腦是win7 64位,根據自己的系統選擇相應版本,點選Download,如圖所示: 然後跳到下面這個介面,注意此時不需要註冊也不需要登入,直接點選紅色部分: 最好選擇非系統

資料庫-MySqlCant connect to MySQL server on ‘xxxx’ (10061) 二

一、問題描述 1、系統: Windows Server 2000、Windows Server 2003、Windows Server 2008、Windows Server 2008 R2、Windows Vista、Windows Vista XP 2、描述: 使用連線工具頻

redis客戶端在本地連線CentOS 7虛擬機器的服務端時,為什麼會報can't connect to redis-server錯誤??以及做主從複製的時候總是失敗

redis客戶端在本地連線CentOS 7虛擬機器的服務端時,為什麼會報can't  connect to redis-server 的錯誤? 1.你虛擬機器上的防火牆沒有關 2.埠沒有開放 3.bi

ClouderManger搭建資料叢集時ERROR 2003 (HY000): Can't connect to MySQL server on 'ubuntucmbigdata1' (111)的問題解決(圖文詳解)

[email protected]:/opt/cloudera/parcels/CDH-5.6.0-1.cdh5.6.0.p0.45/lib$ pwd /opt/cloudera/parcels/CDH-5.6.0-1.cdh5.6.0.p0.45/lib [email pro

MySQL錯誤2003Can't connect to MySQL server (10060)

如果你想myUser使用myPassword從任何主機連線到mysql伺服器的話  GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;  FLUSH PRIVILEGES;  如果你

MySQL連線失敗:Can't connect to MySQL server on '127.0.0.1'

報錯資訊:failed to connect to MySQL at localhost:3306 with user root Could not connect to MySQL database

如何解決Can t connect to mysql server on localhost (10061) 錯誤

現在還在配置mysql資料庫結果連線時提示can t connect to mysql server on 'localhost' (10061) 錯誤的了,下面給大家整理了我處理此問題的整個過程有興趣的朋友可參考一下。

Navicat連線伺服器出現:Can't connect to mysql server on

1.重啟防火牆試試: service iptables restart 2.或者: 附錄iptables防火牆的命令 查詢防火牆狀態: [[email protected] ~]# service iptables status 停止防火牆: [[e