處理mysql複製故障一例

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

 

  1. mysql> show slave status\G 
  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 processlist\G 
  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

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