怎樣解決MySQL數據庫主從復制延遲的問題


      mysql replication 中主從延遲是一個比較常見的問題,請看前期一篇博文:怎樣解決MySQL數據庫主從復制延遲的問題。根據目前有些公司使用的方案,最近測試了兩個,其中之一是阿里的relay fetch ,業績說法數據預熱,當然也有其他開源類似開源工具,目前諸如mk-slave-prefetchreplication-prefetch等,感興趣可以去看看。整理的文檔主要是參考了官方的《relay fetch 讀取本地binlog 進行備庫預熱》,有些圖片直接引用,還有文字,與官方不同的是安裝過程中出現的問題及解決方式,歸納如下:


基本思路原理 

備庫sql線程執行更新之前,預先將相應的數據加載到內存中,並不能提高sql_thread線程執行sql的能力,也不能加快io_thread線程讀取日志的速度。

 

 

限制

  1 目前僅支持主庫binlog ROW模式

  2 表需要有主鍵或唯一索引

  3 忽略test和mysql數據庫

  4 如果數據庫中存在類似tbname_1、tbname_2這樣命名的多個表,但其表模式卻不相同時,請加上-t選項,例如:tb_1 tb_2 tb_3這樣命名的三個表,默認情況下,被認為是同樣模式的表,這個特點是淘寶為了適應他們自己的數據庫環境

  5 默認最多支持10000個用戶表,如果學員支持更多表,可以通過修改宏MAX_TABLE_NUM來進行調整。

 

獲取源碼 

  安裝svn客戶端從下列地址獲取源碼:

svn checkout http://relay-fetch.googlecode.com/svn/trunk/

安裝編譯:

make

make的時候需要根據mysql安裝環境修改Makefile配置文件,relay-fetch依賴mysql的lib庫文件等,gcc編譯的時候指定,如下紅色標示部分:

#locate your libmysqlclient_r.so

 

all:

        gcc -g -O0 -Wall-o relayfetch relayfetch.c -I/usr/local/mysql/include/-L/usr/local/mysql/lib -lmysqlclient_r -lpthread

 

clean:

        rm -rf *.orelayfetch

 

32位系統安裝有warning ,如下

relayfetch.c: In function ‘daemon_rf’:

relayfetch.c:2599: warning: format ‘%lu’ expects type ‘longunsigned int’, but argument 4 has type ‘long long unsigned int’

relayfetch.c:2599: warning: format ‘%lu’ expects type ‘longunsigned int’, but argument 4 has type ‘long long unsigned int’

不是錯誤error,沒有太多影響

安裝完畢,在安裝目錄下運行./relayfetch –h,了解一下relayfetch 常用參數,如果報如下錯誤error while loading shared libraries: libmysqlclient.so.16/18:cannot open shared object file

應該是mysql的lib庫文件引用問題,建立如下類似軟鏈接

32位

ln -s /usr/local/mysql/lib/libmysqlclient.so.18  /usr/lib/

 

64位

ln -s /usr/local/mysql/lib/libmysqlclient.so.18  /usr/lib64/

 

使用

運行: ./relayfetch -h來獲取選項

主要選項包括:
-d debug
-D 后台運行
-p 密碼
-u 用戶名,請以root用戶運行
-P mysqld端口號
-s 整數,單位為M,當read線程超過sql線程position這么多字節數時,會等待sql線程,默認為1M
-S mysql sock文件路徑
-n worker線程數目。默認為5
-a 當seconds_behind_master大於這個值時,會喚醒relayfetch,默認為1s
-t 當使用該選項時,表明不使用分表規則(例如,表name_1 和表name_2會被視為同一類表)

我們可以通過端口號來運行

./relayfetch-uroot -t -P3306

或者通過sock來運行

./relayfetch-S /u01/mysql/run/mysql.sock -uroot

測試效果

 

 這個效果不明顯,可能機器原因(本人測試256內存虛擬機)。請參考官方測試吧

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM