Host XXX is blocked because of many connection errors, unblock with 'mysqladmin flush-hosts

nginx反向代理mysql的配置如下:

 upstream  mysql_server {
    server  172.18.3.243:3306;

    #check interval=3000 rise=2 fall=5 timeout=1000;
     }

server {
    listen       3305;
    server_name localhost;
    access_log  logs/access.log;
    proxy_pass mysql_server;
    so_keepalive on;
    tcp_nodelay on;
       }

配置完成nginx 發現代理mysql後,發現連接連接mysql經常報錯,Host XXX is blocked because of many connection errors, unblock with ‘mysqladmin flush-hosts。
剛開始以爲是代碼出現問題導致的,後來發現是nginx的後端健康監測導致。

MySQL服務器已經從某個host接收了大量中途終止的連接,於是決定終止繼續接收來自該host的連接,允許最大的連接錯誤數爲max_connect_errors,通過show variables命令可以查詢,一般爲10。

解決方法:在另外一處地方執行mysqladmin flush-host或者登錄進mysql執行flush hosts(本機host已經不允許登錄!)。
但是flush hosts 只是治標不治本,暫時解決了問題,一會就又會出現。

真正的原因是nginx配置裏我註釋掉的那一行健康監測, 這會出現一個問題,就是tcp連接會掉線。原因在於當服務端關閉連接的時候,客戶端不可能立刻發覺連接已經被關閉,需要等到當Nginx在執行check規則時認爲服務端鏈接關閉,此時nginx會關閉與客戶端的連接。
所以註釋掉健康監測問題就解決了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章