我将HA Proxy设置为负载均衡器并在主/主+从复制上进行故障转移。我有两个xinetd bash脚本,用于监听端口9200和9201.端口9200上的一个检查主设备状态,端口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复制数据的停机时间,我试图想办法管理连接。有谁知道这个问题有更好的方法吗?
答案 0 :(得分:0)
(这个答案并未解决您提出的监控问题;而是快速转发到下一步 - 修复复制速度减慢。)
<!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 = ON
和SHOW CREATE TABLE
。也就是说,加速Slave上的EXPLAIN SELECT ...
或者复制到Slave的写入可能会消除&#34;问题。