HA代理负载平衡+ MySQL主/主复制问题

时间:2018-05-29 15:09:07

标签: mysql mariadb replication haproxy

我将HA Proxy设置为负载均衡器并在主/主+从复制上进行故障转移。我有两个xinetd bash脚本,用于监听端口9200和9201.端口92​​00上的一个检查主设备状态,端口9201检查一个状态,检查从设备状态以及主设备后面的状态。

我的HA代理配置文件如下所示:

global
    log 127.0.0.1 local0 notice

defaults
    log global
    retries 2
    timeout connect 10000
    timeout server 28800000
    timeout client 28800000

// writes and critical reads goes here
// critical reads are the ones we can't afford any latency at all
listen mariadb-writes
    bind 0.0.0.0:3307
    mode tcp
    option allbackups
    option httpchk
    balance roundrobin

    // 9200 check master status
    server mariadb1 1.1.1.1:3306 check port 9200 // master1
    server mariadb2 2.2.2.2:3306 check port 9200 backup // master2

// heavy reads that we can afford some latency
listen mariadb-reads
    bind 0.0.0.0:3308
    mode tcp
    option allbackups
    option httpchk
    balance roundrobin

    // 9201 check slave status and seconds behind
    server mariadb1 1.1.1.1:3306 check port 9201
    server mariadb2 2.2.2.2:3306 check port 9201
    server mariadb3 3.3.3.3:3306 check port 9201

    // 9200 on backups check the master status
    server mariadb1b 1.1.1.1:3306 check port 9200 backup
    server mariadb2b 2.2.2.2:3306 check port 9200 backup

我使用两个脚本的原因是因为它是我找到解决复杂问题的唯一方法,但它也创建了一个新问题。我选择执行两个不同的脚本,因为检查主 - 主复制上的从属状态可能会在其他主服务器关闭时停用其中一个主服务器,因为它会破坏复制。因此,不是检查从属状态,而是在我的主人身上,我只是写入其中一个节点并继续写入它,如果它已经完成的话。如果由于某种原因我的主机关闭,主备份将保留请求。

我看到的问题是,如果master1发生故障,master2将接收写入并依赖它停留多长时间,当它上升时,复制将远远落后并且激活它将导致严重的数据一致性问题,直到赶上复制。

我想在9200主脚本中做两次检查,一个会检查奴隶状态,如果它已经检查,检查它落后了多少秒,但是如果奴隶是下来,检查主人状态。换句话说,如果从站断开,则不要返回503,因为它可能是第二个主站断开并打破复制。但是这也存在一些缺陷,因为当master1启动时,复制将被破坏,直到MariaDB重新连接到另一个master2,因此在此期间,写入不能被定向到该节点。我可以将HA Proxy配置为在激活已关闭的节点之前等待几秒钟,但这对我来说似乎不是正确的解决方案。

基本上,如果我的master1启动并且HA代理将请求转发给它,而它正在赶上从master2复制数据的停机时间,我试图想办法管理连接。有谁知道这个问题有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

(这个答案并未解决您提出的监控问题;而是快速转发到下一步 - 修复复制速度减慢。)

  • 你有多线程复制吗?如果是,您设置了哪些参数? (太高可能一样糟糕。)
  • 您是否在Slave中打开了慢速日志? <!DOCTYPE html> <html> <title>W3.CSS</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css"> <style> .mySlides {display:none} .demo {cursor:pointer} </style> <body> <div class="w3-content" style="max-width:1200px"> <video class="mySlides" src="video1.mp4" controls style="width:100%"></video> <video class="mySlides" src="video2.mp4" controls style="width:100%"></video> <video class="mySlides" src="video3.mp4" controls style="width:100%"></video> <video class="mySlides" src="video4.mp4" controls style="width:100%"></video> <div class="w3-row-padding w3-section"> <div class="w3-col s4"> <video class="demo w3-opacity w3-hover-opacity-off" src="video2.mp4" style="width:100%" onclick="currentDiv(2)"></video> </div> <div class="w3-col s4"> <video class="demo w3-opacity w3-hover-opacity-off" src="video3.mp4" style="width:100%" onclick="currentDiv(3)"></video> </div> <div class="w3-col s4"> <video class="demo w3-opacity w3-hover-opacity-off" src="video4.mp4" style="width:100%" onclick="currentDiv(4)"></video> </div> </div> </div> </body> </html>long_query_time的价值较低?
  • 什么是最慢的查询?让我们看看它们,加上log_slow_slave_statements = ONSHOW CREATE TABLE

也就是说,加速Slave上的EXPLAIN SELECT ...或者复制到Slave的写入可能会消除&#34;问题。