新建備庫級聯(lián)到主庫會將主庫上大量的binlog拉到本地保存為relaylog,這個階段會導致主庫網絡流量非常大,從而引發(fā)主庫的查詢更新等受到影響。
解決思路:
1. 在備庫拉主庫binlog的IO線程上做限流:每拉一定數(shù)據(jù)量M的binlog則sleep時間N。
這個測試效果比較明顯,但存在如下幾個問題:
1) 參數(shù)比較難控制 需要DBA根據(jù)實際場景調整來獲得預期的網絡流量,這個過程可能需要多次嘗試才可能獲取到預期行為
2) 存在抖動 在sleep時刻明顯能觀察到不均勻的網絡流量
2. 在socket的選型上做文章
1) 對主備庫的IO線程使用的連接都設置socket屬性。
2) 靈感來自facebook mysql中引入的rpl_send_buffer_size參數(shù):對主庫的dump線程增加SNDBUF參數(shù)控制以優(yōu)化主庫發(fā)送的速度。
NET* net = &thd->net;
+ if (rpl_send_buffer_size &&
+ (setsockopt(net->vio->mysql_socket.fd, SOL_SOCKET, SO_SNDBUF,
+ &rpl_send_buffer_size, sizeof(rpl_send_buffer_size)) == -1 ||
+ setsockopt(net->vio->mysql_socket.fd, IPPROTO_TCP, TCP_WINDOW_CLAMP,
+ &rpl_send_buffer_size, sizeof(rpl_send_buffer_size)) == -1))
+ sql_print_warning(“Failed to set SO_SNDBUF with (error: %s).”,
+ strerror(errno));
+
完整補丁參考 https://github.com/facebook/mysql-5.6/commit/d3b0c7814090bded6563fee7d46d2ae41ed32a60
其中,主庫的dump線程連接描述符NET的設置有兩點:
a. SOL_SOCKET級別對應的應用層所設置的緩沖區(qū)大小
b. IPPROTO_TCP級別對應的傳輸層設置的擁塞窗口大小
stackovreflow上有人遇到利用setsocketopt設置SOL_SOCKET級別的SO_RCVBUF但無效果的問題。解決方法為同時設置SOL_SOCKET級別的TCP_WINDOW_CLAMP。(注:TCP_WINDOW_CLAMP應該屬于IPPROTO_TCP級別)
http://stackoverflow.com/questions/2223825/setting-tcp-receive-window-in-c-and-working-with-tcpdump-in-linux
http://linux.die.net/man/7/tcp
3) 至少設置備庫才有效,從2048到UINT_MAX(2*1024*1024),檢測主庫網卡流出/備庫網卡流入從4.8M 到 15.4M。
4) 需要注意的是,此參數(shù)是在連接建立之前設置,更改此參數(shù)需要重啟主備之間的復制。
從運維角度看,動態(tài)設置某個比較接近‘0’的時間,但主備復制延時低于此值后,復制不再受此限流的影響。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com