天天看點

【譯】修複MySQL不合适的預設配置

Fixing Poor MySQL Default Configuration Values

原文位址:http://jeremy.zawodny.com/blog/archives/011421.html

[幾句廢話:本人英文很爛,今天很無奈地第一次認真地看英文文檔,很糾結,花了好長時間才看了那麼一丁點兒,回過頭看,竟又忘記自己剛看的内容了~速度太慢,汗||于是想想試着翻譯并記下來吧,順便大家也給我指出錯誤啊~Thank you~]

    我最近一直在積累一些MySQL在大的生産環境會産生問題的預設配置變量。它們都具有相同的特性那就是,一兩次網絡波動就會觸發一些非常不想看到的結果。

max_connect_errors

    如果用戶端連接配接到MySQL時遇到問題,伺服器過了connect_timeout 時間後将不再等待,并且增加連接配接主機錯誤的次數。當這個錯誤次數達到max_connect_errors後,用戶端将被拒絕連接配接,直到你執行FLUSH HOSTS指令。更加糟糕的是,如果你的網絡時不時地波動,并且沒有重新啟動MySQL,這個錯誤數就會日積月累,最後指不定哪天晚上突然出故障,讓你忙碌整夜。

        在MySQL的docs裡看到主機被阻止了,可悲的是,這時沒有辦法去徹底阻止這個檢查。卻不能實作設定變量為0,你的真正解決方案隻有(a)設定一個非常大的值(max_connect-error=1844674407370954751);(b)臨時運作FLUSH HOSTS指令。

connect_timeout

         這跟上面的問題相關,在網絡擁塞的情況下(不管是用戶端或者服務端),剛開始連接配接可能要花費幾秒才能完成,預設的connect_timeout 時間是5秒。當你被這種情況所牽絆,上面的這個max_connect_errors問題就會很有沖擊力。

        為了避免這種情況,首先可以嘗試設定connect_timeout一個值像15 或 20。并且考慮設定thread_cache_size為一個非零值。當伺服器在非常短的時間周期裡,時常保持高的新連接配接數,這個設定将幫助改善這種情況。

skip-name-resolve

       在預設情況下,MySQL做一個反向DNS查詢對每個過來的連接配接,這就太糟糕了,似乎不論你有多麼好的基礎設施,在DNS伺服器有标志。 MySQL的主機緩存存在,讓那些查找降到最低值。我曾經見過由于這個原因導緻了至今8年的麻煩。當這種情況發生的時候,我隻能假定這個主機緩存存在一個bug或分析lib庫。

       我建議在/etc/my.cnf裡添加skip-name-resolve來完全跳過個DNS。僅僅用IP位址或你授權的範圍。似乎減緩從DNS伺服器的回複也能幫助你改善connect_timeout的牽絆。試想有2、3台DNS伺服器配置,但是第一個不可用。

slave_net_timeout

      當主從資料庫的網絡連接配接在某種程度上被中斷,任何一方都不能檢測(像防火牆或路由改變),你必須等待直到slave_net_timeout設定的時間過後,從資料數才知道連接配接錯誤了。它将嘗試再次連接配接主伺服器并且采集哪裡使它停止。這真是太可怕了。

       然而,這個預設值是3600秒,整整一個小時!太不好了。

      誰會希望他們的從伺服器在檢查它們哪裡出問題之前,閑置那麼長時間時間?我覺得任何人都不想要這種結果。