今天一個主從複製的伺服器出現了問題,資料和主伺服器不一樣,但是複製程式是對的。開始我只看了複製程式,沒有太注意,原始內容如下:

 

  1. mysql> show slave statusG 
  2. *************************** 1. row *************************** 
  3.                Slave_IO_State: Waiting for master to send event 
  4.                   Master_Host: 192.168.125.9 
  5.                   Master_User: slave 
  6.                   Master_Port: 9188 
  7.                 Connect_Retry: 10 
  8.               Master_Log_File: mysql-bin.000004 
  9.           Read_Master_Log_Pos: 805036116 
  10.                Relay_Log_File: localhost-relay-bin.000018 
  11.                 Relay_Log_Pos: 192473825 
  12.         Relay_Master_Log_File: mysql-bin.000004 
  13.              Slave_IO_Running: Yes 
  14.             Slave_SQL_Running: Yes 
  15.               Replicate_Do_DB:  
  16.           Replicate_Ignore_DB:  
  17.            Replicate_Do_Table:  
  18.        Replicate_Ignore_Table:  
  19.       Replicate_Wild_Do_Table:  
  20.   Replicate_Wild_Ignore_Table:  
  21.                    Last_Errno: 0 
  22.                    Last_Error:  
  23.                  Skip_Counter: 0 
  24.           Exec_Master_Log_Pos: 197587108 
  25.               Relay_Log_Space: 805036869 
  26.               Until_Condition: None 
  27.                Until_Log_File:  
  28.                 Until_Log_Pos: 0 
  29.            Master_SSL_Allowed: No 
  30.            Master_SSL_CA_File:  
  31.            Master_SSL_CA_Path:  
  32.               Master_SSL_Cert:  
  33.             Master_SSL_Cipher:  
  34.                Master_SSL_Key:  
  35.         Seconds_Behind_Master: 25236 
  36. Master_SSL_Verify_Server_Cert: No 
  37.                 Last_IO_Errno: 0 
  38.                 Last_IO_Error:  
  39.                Last_SQL_Errno: 0 
  40.                Last_SQL_Error:  
  41. 1 row in set (0.00 sec) 

後來發現資料不對,發現

Read_Master_Log_Pos和Exec_Master_Log_Pos真麼差別這麼大,原理上,應該是挨著的, 然後開始找問題,把日誌翻來覆去的看,沒有發現任何問題,然後看了一下processlist: ,發現延遲了5個多小時,我的個娘耶。

  1. mysql> show processlistG 
  2. *************************** 1. row *************************** 
  3.      Id: 1 
  4.    User: root 
  5.    Host: localhost 
  6.      db: NULL 
  7. Command: Query 
  8.    Time: 0 
  9.   State: NULL 
  10.    Info: show processlist 
  11. *************************** 2. row *************************** 
  12.      Id: 2 
  13.    User: system user 
  14.    Host:  
  15.      db: NULL 
  16. Command: Connect 
  17.    Time: 1038 
  18.   State: Waiting for master to send event 
  19.    Info: NULL 
  20. *************************** 3. row *************************** 
  21.      Id: 3 
  22.    User: system user 
  23.    Host:  
  24.      db: NULL 
  25. Command: Connect 
  26.    Time: 18697
  27.   State: freeing items 
  28.    Info: NULL 
  29. 3 rows in set (0.00 sec) 

基本確認主庫和從庫是延遲,而不是認為或者其他bug之類的東西。

開始找延遲的原因吧:

1、檢查網路延時:

  1. [root@localhost var]# ping 192.168.125.9 
  2. PING 192.168.125.9 (192.168.125.9) 56(84) bytes of data. 
  3. 64 bytes from 192.168.125.9: icmp_seq=1 ttl=64 time=0.555 ms 
  4. 64 bytes from 192.168.125.9: icmp_seq=2 ttl=64 time=0.588 ms 
  5. 64 bytes from 192.168.125.9: icmp_seq=3 ttl=64 time=0.635 ms 
  6. 64 bytes from 192.168.125.9: icmp_seq=4 ttl=64 time=0.588 ms 
  7. 64 bytes from 192.168.125.9: icmp_seq=5 ttl=64 time=0.586 ms 

沒有發現問題。

2、檢查系統資源

 

  1. [root@localhost var]# iostat -dx 1 5 
  2. Linux 2.6.18-164.el5PAE (localhost.localdomain)         11/18/2011 
  3.  
  4. Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util 
  5. sda               0.07    40.80  0.22 123.53     6.06  1314.72    10.67     0.98    7.92   2.74  33.97 
  6. sda1              0.01     0.00  0.00  0.00     0.02     0.00    18.93     0.00    2.33   1.60   0.00 
  7. sda2              0.00     0.00  0.00  0.00     0.01     0.00    36.13     0.00    3.65   2.81   0.00 
  8. sda3              0.02     0.01  0.00  0.01     0.02     0.16    20.21     0.00    5.36   2.71   0.00 
  9. sda4              0.00     0.00  0.00  0.00     0.00     0.00     2.00     0.00   21.00  21.00   0.00 
  10. sda5              0.04    40.79  0.22 123.52     6.01  1314.56    10.67     0.98    7.92   2.74  33.96 
  11.  
  12. Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util 
  13. sda               0.00   156.00  2.00 365.00    16.00  4160.00    11.38     3.15    8.64   2.68  98.30 
  14. sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  15. sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  16. sda3              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  17. sda4              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  18. sda5              0.00   156.00  2.00 365.00    16.00  4160.00    11.38     3.15    8.64   2.68  98.30 
  19.  
  20. Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util 
  21. sda               0.00   112.00  0.00 315.00     0.00  3448.00    10.95     2.52    8.06   3.13  98.70 
  22. sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  23. sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  24. sda3              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  25. sda4              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  26. sda5              0.00   112.00  0.00 315.00     0.00  3448.00    10.95     2.52    8.06   3.13  98.70 
  27.  
  28. Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util 
  29. sda               0.00   103.96  0.00 195.05     0.00  2392.08    12.26     3.12   15.47   5.06  98.71 
  30. sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  31. sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  32. sda3              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  33. sda4              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00 
  34. sda5              0.00   103.96  0.00 195.05     0.00  2392.08    12.26     3.12   15.47   5.06  98.71 

發現有IO,但是不太厲害,算正常。

然後看CPU,使用top命令

  1. Tasks: 141 total,   1 running, 139 sleeping,   1 stopped,   0 zombie 
  2. Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st 
  3. Cpu1  :  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st 
  4. Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st 
  5. Cpu3  :  0.0%us,  4.7%sy,  0.0%ni, 94.7%id,  0.0%wa,  0.0%hi,  0.7%si,  0.0%st 
  6. Cpu4  :  0.0%us,  1.3%sy,  0.0%ni,  1.0%id, 97.3%wa,  0.3%hi,  0.0%si,  0.0%st 
  7. Cpu5  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st 
  8. Cpu6  :  0.0%us,  0.0%sy,  0.0%ni, 91.3%id,  0.0%wa,  3.7%hi,  5.0%si,  0.0%st 
  9. Cpu7  :  0.3%us,  7.0%sy,  0.0%ni, 81.8%id,  0.0%wa,  1.0%hi,  9.9%si,  0.0%st 
  10. Mem:   4139196k total,  2605768k used,  1533428k free,   215052k buffers 
  11. Swap:  8385920k total,        0k used,  8385920k free,  2143992k cached 

發現

Cpu4  :  0.0%us,  1.3%sy,  0.0%ni,  1.0%id, 97.3%wa,  0.3%hi,  0.0%si,  0.0%st  這個核有點問題 

wait太高的,話,應該是cpu在等待IO資源,導致的。 但是IO資源又不太高,才幾M的寫入。 不過現在也沒辦法,只有想法降低mysql的寫入來試試看。  我關閉了slave更新bin-log的功能 #log-slave-updates  然後重啟mysql,啟動slave程式。現在Slave_SQL程式速度加快了,明顯看見 Exec_Master_Log_Pos數增加,show processlist中的時間也在縮短, 過了有20多分鐘,資料同步完成了。通過maatkit工具檢查,沒有問題。  故障現在是修復了,不過為什麼mysql的IO那麼低,卻會導致IO資源缺乏,我嘗試通過寫檔案來測試磁碟IO,應該可以達到130多M/s。 這個問題現在比較詭異了,估計是mysql slave只能使用單核導致的,而這臺伺服器雖然是8核的,但是單核的主頻只有2.13,中繼sql,執行sql,寫入自己的blog,IO請求都在一個核上,導致的資源不足。

在補充一下,這個機器業務空閒後,我做了一個基準測試,發現效率還是上不去。找了硬體的原因,也懷疑過編譯引數,在相同硬體平臺和mysql版本做了相關測試。最後發現這次效能問題的最終殺手是my.cnf的一個配置。這次心血來潮加了如下一個引數

sync_binlog=1  //意思是即時同步binlog到硬碟上,不快取日誌,目的是避免硬體故障或者軟體故障導致binlog沒有即時寫盤而丟失。但是開始沒想到這個引數在QPS上到100左右後,效能消耗是如此的高,導致整個CPU核都在等待IO,建議大家以後不是特別需要,還是別碰這個引數了,預設是0,由作業系統來排程什麼時候寫入到硬碟,或者將值調整到比較大。

還有一個就是innodb引擎的

innodb_flush_log_at_trx_commit = N

N=0  – 每隔一秒,把事務日誌快取區的資料寫到日誌檔案中,以及把日誌檔案的資料重新整理到磁碟上;

N=1  – 每個事務提交時候,把事務日誌從快取區寫到日誌檔案中,並且重新整理日誌檔案的資料到磁碟上;

 

N=2  – 每事務提交的時候,把事務日誌資料從快取區寫到日誌檔案中;每隔一秒,重新整理一次日誌檔案,但不一定重新整理到磁碟上,而是取決於作業系統的排程;

如果設定為1,效率也會相當的低,建議設定到2,如果想要效能再提交,可以設定為0.

 

具體可以參見如下文章:http://www.mysqlops.com/2011/10/26/mysql-variable-third.html