mysql mmm切换_Mysql-MMM slave无法切换change master的解决方案

本文介绍了MySQL-MMM高可用解决方案的原理,包括主主复制和虚拟IP的角色。在实践中遇到slave无法根据master状态切换的问题,可能由于MySQL版本导致。解决思路是通过编写Python脚本来手动管理slave状态,确保当master宕机时,相应slave变为不可用,以维持服务正常。文章提供了一个mmmCluster类的示例,用于检查和设置节点状态,以实现与master状态同步。

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上不完善的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值