Mysql-MMM是mysql一款高可用的解决方案。在mysql是一主(或二主)多从,的情况下提供高可用服务。
对于MASTER-MASTER复制的情况,其原理是:
1.监测在集群内的mysql服务是否运行正常。
2.在运行正常的服务器上配置虚拟IP地址对外提供服务。(类似keepalived)
3.当某台master不能提供正常服务时,另一台master将会接管虚拟IP地址,并且继续提供服务。同时slave服务器将会change master ,指向新的master服务器。
问题:
当我按照官方的文档进行搭建,发现我的slave并不会因为某一台master停止服务而change master。可能是由于mysql版本问题(我的是5.5.64-MariaDB),总之在网上没有找到相应的解决方法。
解决思路:
当slave无法切换自己的master的情况下,如果某台master停止服务,而此时这台master对应的slave仍然提供服务的话,就会可能导致写入的业务数据无法读取出来。
如果当master宕机后,我们将其对应的slave全部设置为不可用,就能保证mysql提供的服务正常。
说明:
现有4台mysql,db1(master),db2(master),db3(slave of db1),db4(slave of db2)
这里写了一个json文件来表述:
[{ "clustername": "cluster1", "master": "db1", "slave": ["db3"] }, { "clustername": "cluster2", "master": "db2", "slave": ["db4"] }]
再定义了一个mmmCluster类,提供检测各个节点和设置节点状态的方法:
#!/usr/bin/python
import os
class mmmCluster:
def __init__(self,master,slave):
self.master = master;
if type(slave) == type([]):
self.slave = slave;
else:
self.slave = [slave];
def chkNodeStatus(self,node):
ans = os.popen("mmm_control show|grep "+node).read();
if ans.find("Can't connect to monitor") > 0:
#print("mmm-monitor is not running.");
raise Exception("mmm-monitor is not running.");
elif ans.find("ONLINE") > 0:
return "online";
elif ans.find("OFFLINE") > 0:
return "offline";
else:
return "unkown status:"+ans;
def chkMasterStatus(self):
return self.chkNodeStatus(self.master);
def setNode(self,node,status):
if status not in ["online","offline"]:
raise Exception("Status Must be online or offline.");
c_status = self.chkNodeStatus(node);
if c_status == status:
print("Node:"+node+" is already "+status);
return True;
elif c_status[:6] == "unkown":
print("Node:"+node+" cannot be set "+status);
return False;
else:
ans = os.popen("mmm_control set_"+status+" "+node).read();
print ans;
if ans[:2] == "OK" and self.chkNodeStatus(node) == status:
return True;
else:
return False;
def setSlaves(self,status):
ans = 0;
for i in self.slave:
self.setNode(i,status);
if self.chkNodeStatus(i) != status:
ans = ans + 1;
if ans > 0:
return False;
else:
return True;
def syncStatus(self):
m_status = self.chkMasterStatus();
if m_status != "online":
self.setSlaves("offline");
else:
self.setSlaves("online");
我们的一个mmmCluster对象对应的是mysql-mmm中某一个master主机,以及其对应的一个或多个slave。
实例化:c1 = mmmCluster(master="db1",slave=["db3","db5"....])
mmmCluster对外主要提供syncStatus方法,其主要作用就是保证mmmCluster中的slave状态与master的状态一致。当master为ONLINE,会将OFFLINE的slave设置为ONLINE(如果存在HARDOFFLINE状态,setonline会失败,如果是其他非ONLINE状态将不会执行);当master为OFFLINE时,会将ONLINE的slave设置为OFFLINE。
接下来只要将这个类实例化并且作为守护进程在我们的mmm-monitor服务器后台运行即可完善mysql-mmm对于change master上不完善的地方。
本文介绍了MySQL-MMM高可用解决方案的原理,包括主主复制和虚拟IP的角色。在实践中遇到slave无法根据master状态切换的问题,可能由于MySQL版本导致。解决思路是通过编写Python脚本来手动管理slave状态,确保当master宕机时,相应slave变为不可用,以维持服务正常。文章提供了一个mmmCluster类的示例,用于检查和设置节点状态,以实现与master状态同步。

2687

被折叠的 条评论
为什么被折叠?



