背景:

众所周知,MySQL只支持一对多的主从复制,而不支持多主(multi-master)复制。

当然,5.6的GUID功能的出现也带来了multi-master的无限可能,不过这个已经是题外话了。

本文主要介绍一种非实时的适用于各版本MySQL的multi-master方法。

内容简介:

基本原理就是通过SP记录当前 master-log的name和pos记录到表中,然后读取下一个master记录,执行stop slave / change master / start slave。以此循环反复。

个人对他的方法进行了改进,增加了以下功能:

1. master可以根据业务流量设置权重值

2. 各个master-slave运行情况的监控

3. 各个master可以实时退出多主的架构

具体操作过程:

1. 创建保存各个master信息的表

use mysql;

CREATE TABLE`rotate_master` (

`id`int(11) NOT NULLAUTO_INCREMENT,

`master_host`varchar(255) DEFAULT NULL comment 'master地址',

`master_port`int(10) unsigned DEFAULT NULL comment 'master端口',

`master_log_file`varchar(255) DEFAULT NULL ‘上次停止时的master-log文件’,

`master_log_pos`int(10) unsigned DEFAULT NULL comment '上次停止时的master-log-pos',

`IS_Slave_Running`varchar(10) DEFAULT NULL comment '上次停止时主从是否有异常',

`in_use`tinyint(1) DEFAULT '0' comment '是否是当前正在同步的数据行',

`weight`int(11) NOT NULL DEFAULT '1' comment '该master的权重,即重复执行多少个时间片',

`repeated_times`int(11) NOT NULL DEFAULT '0' comment '当前已经重复执行的时间片数',

`LastExecuteTime`timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '上次执行的时间',PRIMARY KEY(`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

新增加一个master :

insert into`rotate_master`

(`master_host`,`master_port`,`master_log_file`,`master_log_pos`,`in_use`,`weight`)values

--1号master,权重=1,并设置为当前master

('192.168.0.1',3307,'mysqlbinlog.000542',4,1,1),--2号master,权重=2

('192.168.0.2',3306,'mysqlbinlog.000702',64762429,0,2),--3号master,权重=5

('192.168.0.3',3306,'mysqlbinlog.000646',22157422,0,5)

手工把master 调整到当前的配置项:

change master to master_host='192.168.0.1', master_port=3306,master_log_file='mysqlbinlog.000542',master_log_pos=4,master_user='repl',master_password='repl';

start slave;

创建rotate master SP:

注意:代码中用于连接master的用户名和密码是 :  repl / repl ,请根据自己的情况修改。

DELIMITER $$DROP PROCEDURE IF EXISTS`mysql`.`rotate_master`$$CREATE DEFINER=`root`@`localhost` PROCEDURE`rotate_master`()BEGIN

DECLARE _info text;DECLARE _master_file varchar(255);DECLARE _master_pos intunsigned;DECLARE _master_host varchar(255);DECLARE _master_port intunsigned;DECLARE _is_slave_running varchar(10);DECLARE _id int;DECLARE _weight int;DECLARE _repeated_times int;select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME = 'Slave_running' into_is_slave_running;

STOP SLAVE;SELECT LOAD_FILE(@@relay_log_info_file) INTO_info;SELECTSUBSTRING_INDEX(SUBSTRING_INDEX(_info,'\n', 3), '\n', -1),

SUBSTRING_INDEX(SUBSTRING_INDEX(_info,'\n', 4), '\n', -1)INTO_master_file, _master_pos;UPDATE mysql.rotate_master SET `master_log_file` = _master_file, `master_log_pos` = _master_pos, id = LAST_INSERT_ID(id), `IS_Slave_Running` = _is_slave_running WHERE in_use = 1;select weight,repeated_times into _weight,_repeated_times from mysql.rotate_master where in_use =1;if(_weight <=_repeated_times)THEN

SELECTid,

master_host,

master_port,

master_log_file,

master_log_posINTO_id, _master_host, _master_port, _master_file, _master_posFROMrotate_masterORDER BY id <= LAST_INSERT_ID(), id LIMIT 1;SET @sql :=CONCAT('CHANGE MASTER TO master_host=', QUOTE(_master_host),', master_port=', _master_port,', master_log_file=', QUOTE(_master_file),', master_log_pos=', _master_pos

', master_user="repl"',

', master_password="repl"'

);PREPARE myStmt FROM @sql;EXECUTEmyStmt;UPDATE mysql.rotate_master SET in_use = 0,repeated_times=0 WHERE in_use = 1;UPDATE mysql.rotate_master SET in_use = 1,repeated_times=1 WHERE id =_id;ELSE

UPDATE mysql.rotate_master SET `repeated_times`=`repeated_times`+1 WHERE in_use = 1;END IF;

START SLAVE;END$$

DELIMITER ;

创建Event:

每2分钟运行一次,rotate_master() ,即时间片大小是2分钟

DELIMITER $$CREATE EVENT `rotate_master` ON SCHEDULE EVERY 120 SECOND STARTS '2011-10-13 14:09:40' ON COMPLETION NOTPRESERVE ENABLE DO CALL mysql.rotate_master()$$

DELIMITER ;

至此,多主复制已经搭建完成。

由于时间片长度是2分钟。

Master1 在执行 1*2 分钟后,stop slave,然后change master to Master2;

Master2 在执行 2*2 分钟后,stop slave,然后change master to Master3;

Master3 在执行 5*2 分钟后,stop slave,然后change master to Master2;

并以此循环往复。

如果希望把其中一个master移除多主复制,可以将他的配置项权重设置为0;

即: update rotate_master set weigh=0 where id = #ID# ;

多master mysql_使用 Rotate Master 实现MySQL 多主复制相关推荐

  1. mysql多实例复制,Mysql实例使用Rotate Master实现MySQL 多主复制的实现方法

    搜索热词 <MysqL实例使用Rotate Master实现MysqL 多主复制的实现方法>要点: 本文介绍了MysqL实例使用Rotate Master实现MysqL 多主复制的实现方法 ...

  2. Keepalived+LVS+MySQL双主复制实现读写负载均衡及高可用

    目录 一.Keepalived和LVS简介 1. Keepalived简介 2. LVS简介 二.安装配置 1. 下载安装LVS 2. 下载安装Keepalived 3. Keepalived配置 5 ...

  3. python mysql 双主_keepalived+mysql双主复制高可用方案

    MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换.而Keepalived通过虚拟IP,实现了 ...

  4. mysql避免回环复制_【20181204】 MySQL 双主复制是如何避免回环复制的

    想要了解这个问题的原因在于有一次面试的时候,面试官问我一个问题,就是MySQL的双主复制的时候是如何避免回环复制这个问题的,说老实话在基于GTID复制的时候我还是比较了解的,因为GTID复制是MySQ ...

  5. 配置mysql为主主复制步骤

    mysql版本:mysql-5.6.24-solaris10-sparc-64bit.tar 操作系统:solaris 11g u10 操作用户:使用非root进行操作安装,a路服务器ip地址为192 ...

  6. c mysql 双主复制_mysql双主复制及使用keepalived作高可用的配置详解

    1.系统环境架构 vip 192.168..45.244 mysql-1:192.168.45.238 mysql-2:192.168.45.239 2.mysql双主设置 192.168.45.23 ...

  7. c mysql 双主复制_mysql双主复制总结

    双主复制: 1).在两台服务器上各自建立一个具有复制权限的用户: 2).修改配置文件: # 主服务器A上 [mysqld] server-id = 10 log-bin = mysql-bin rel ...

  8. mysql双主复制模式_mysql复制模式第二部分-----双主模式

    双主配置 我在配置主从服务器时,使用了两台服务器:10.19.34.126和10.19.34.91. 1.首先需要在这两台上搭建单独的mysql服务masterA和masterB. 2.配置数据库ma ...

  9. 基于keepalived的mysql_【实用】基于keepalived的mysql双主高可用系统

    原标题:[实用]基于keepalived的mysql双主高可用系统 mysql单节点存储时,系统出现故障时服务不可用.不能及时恢复的问题,因此实际使用时,一般都会使用mysql双机方案,使用keepa ...

最新文章

  1. MetaPhlAn2:宏基因组物种组成分析
  2. Protocol Buffer Basics: C#
  3. 开关设备对于数据中心正常运行时间很重要!
  4. shell脚本传递参数,并且判断参数是否为空
  5. C语言 十进制整数字符串转十六进制字符串
  6. HDU 6127 Hard challenge(极角 + 二分)
  7. 前端学习(1033):jquery插件-图片懒加载
  8. java取模多位数_JAVA大数类—基础操作(加减乘除、取模、四舍五入、设置保留位数)...
  9. 当WEB2.0从概念变成电子商务网站的工具
  10. Apache基本设置
  11. Div高度自适应内容高度
  12. PHOTOSHOP教程
  13. 用友添加附件设置文件服务器,用友服务器怎么配置上传附件
  14. 渤海银行增收不增利:信用卡等不良率暴涨,李伏安被市场“打脸”
  15. 基于SSM的在线点餐系统的设计与实现
  16. SoC设计与验证流程
  17. 性能强悍的CSS动画库--Animate.css
  18. 易基因技术推介|简化基因组甲基化测序研究解决方案
  19. vue3全局变量定义使用
  20. MySQL数据库零基础教学[超详细]

热门文章

  1. [NET] 如何从 Winform 移植到 Webform [自己搞定HTTP协议]
  2. IPsec NAT穿越
  3. nuxt 头部引入js文件 第一次进入页面不加载js文件的解决方法
  4. 财会小白的办公室自救指南
  5. python之路day05--字典的增删改查,嵌套
  6. JDBC的学习(三)——以查询新闻系统为例
  7. AngularJS中实现无限级联动菜单(使用demo)
  8. 基于UDP的socket客户服务器编程
  9. cordova contacts测试
  10. ubuntu 新建一个root用户