MySQL集群(二)之主主复制
前面介绍了主从复制,这一篇我将介绍的是主主复制,其实听名字就可以知道,主主复制其实就是两台服务器互为主节点与从节点。接下来我将详细的给大家介绍,怎么去配置主主复制!
一、主从复制中的问题
1.1、从节点占用了主节点的自增id
环境:
主节点:zyhserver1=1.0.0.3
从节点:udzyh1=1.0.0.5
第一步:我们在主节点中创建一个数据库db_love_1,在创建一个表tb_love(里面有id自增和name属性)。
create database db_love_1;
use db_love_1;
create table tb_love( id int primary key auto_increment, name varchar());
第二步:在主节点中添加一条数据,我们可以在主从节点中都可以看到这条数据都有了。
insert into tb_love(name)values('zhangsan');
第三步:如果我们在从节点中加入一条数据
insert into tb_love(name)values('lisi');
在从节点中:
在主节点中:
这是自然的因为我们是主从复制,只有主节点写的数据才能同步到从节点中,从节点中的数据是不能同步同主节点中的。因为从节点并没有二进制日志文件,而主节点也没有中继日志文件,去完成相应的功能。
第四步:如果我们在主节点中在插入一条数据
insert into tb_love(name)values('wangwu');
在主节点中:
在从节点中:
分析:这时候我们会发现从节点并没有更新主节点的wangwu这条数据,因为从节点中的id为2的位置已经被占了,然后我们在来看一下从节点的状态:

在这里我们可以看到从节点的IO线程是开启的,而SQL线程是关闭的。这样就导致了主从关系断裂了,那我们要怎么去恢复它呢?
我们先在从节点中stop slave,然后进行reset slave,然后重新来进行在从节点中change master to。
1.2、主从关系建立前的前提
其实在建立主从关系之前,我们需要保证两点:
1)一是数据库和表的结构是一样的,也就是说主节点中有哪些数据库和表从节点也应该有哪些数据库和表。
(如果说主节点中有个数据库是从节点中没有的,那当我们删除这个数据库时,从节点没有就会出错了)
2)二是保证主从节点的:数据库主键自增的步长一致,但是自增起始位置位置不一致。
(一个从1开始自增,则生成的主键为:1,3,5,7,9。另一个从2开始自增,生成的主键为:2,4,6,810)
主节点的MySQL终端执行:
set auto_increment_increment=
set auto_increment_offset=
从节点的MySQL终端执行:
set auto_increment_increment=
set auto_increment_offset=
永久设置,如果是重启了MySQL服务还是要重新设置:
主节点的MySQL终端执行:
set global auto_increment_increment=
set global auto_increment_offset=
从节点的MySQL终端执行:
set global auto_increment_increment=
set global auto_increment_offset=
1.3、在搭建MySQL集群主从复制的时候遇到的问题
1)查看slave的状态出现的是

查看你change的时候host(这里最好使用ip)、port、user、password、fileN、pos是否正确。
有没有真的创建了用户zyh。如果还不行在查看一下两台服务器能不能ping通。
2)主节点主机能ping通从节点,反过来不行
因为我们在VMware中安装的两台虚拟机,一个用的是桥接模式,一个用的是NAT模式,所以
我把桥接模式改成了NAT模式就有用了。
1.4、理解binary-log文件的内容获取
Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的RelayLog 文件(MySQL-relay-bin.xxxxxx)的最末端,并将读取到的Master 端的bin-log 的文件名和位置记录到master-info 文件中
Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。
分析:slave的IO线程读到的SQL语句,是怎么来的?其实它并不能直接获取到主节点中写入的SQL语句。而是通过查询(分析)主节点中数据变化结果(如插入、删除、修改操作)
,来自己生成SQL语句存入到二进制日志文件中,所以为什么我们在主节点中指定查询语句,从节点不会去做查询操作了。
二、主主复制
其实我们学会了主从复制,那主主复制理解起来就是相当的简单了。不就是在主节点中配置从节点,从节点加上主节点的配置吗!
2.1、主主复制理解
1)在slave节点授权账号
2) 在master节点进行slave配置,将原来的slave当做master进行连接
2.2、主主复制过程
环境:
ubuntu的server版:1.0.0.3==server1(主节点)
ubuntu的desktop版(两台):1.0.0.5=udzyh1(从节点)
1)其实我们一开始的配置(mysqld.cnf文件中)是server1——>udzyh1:
在主节点中:
server-id=
log-bin=mysql-bin-
binlog-format=rpw
在从节点中:
server-id=
relay-log=mysql-relay-
2)我们需要把从节点的配置加到主节点中,主节点的配置加到从节点中
在主节点加上:
relay-log=mysql-relay-
在从节点上加上:
lob-bin=mysql-bin-
binlog-format=row
当我们重启服务的时候就可以在/var/lib/mysql下主节点会生成中继日志文件,而从节点就会生成二进制日志文件了。我们还是在配置文件
中加上skip-name-resolve把反向域名解析关闭,可以加快运行(只是关闭MySQL的)
3)连接
在udzyh1中运行:grant replication slave,replication client on *.* to 'zyh'@'%' identified by '123456';(在主节点创建一个用户)
然后在server1中的MySQL终端运行:

4)然后在server1中开启主从复制
start slave
注意:有两个常用的操作
show binary logs;作用和show master status \G一样
show binlog events in 'mysql-bin-11.0000001' \G
三、MySQL集群的主主复制的深入探讨
3.1、解决主键冲突问题
1)如果为简单的两台节点,可以让第一台节点id自增步长为2 起点为1,让第二台节点id自增步长为2 起点为2
set session/ set global auto_increment_increment=2
set session / set global auto_increment_offset=1
2) 利用主键生成程序或者主键服务器
3.2、Mysql 集群的被动主主复制
两台服务器都互为master 但是其中一台为只读服务器,不能插入修改数据。
在只读服务器的my.conf配置文件中 添加 read-only=1(对于拥有super权限的用户,可以ignore这个选项) ,目的主要是为了备份master服务器

注意:但是我们一般不会这样做,我们会通过mysql-proxy来完成(后面讲解)
3.3、节点的部署方式


不能让一台slave节点,复制多台master节点

MySQL集群(二)之主主复制的更多相关文章
- MySQL集群搭建(6)-双主+keepalived高可用
双主 + keepalived 是一个比较简单的 MySQL 高可用架构,适用于中小 MySQL 集群,今天就说说怎么用 keepalived 做 MySQL 的高可用. 1 概述 1.1 keepa ...
- MySQL集群(四)之keepalived实现mysql双主高可用
前面大家介绍了主从.主主复制以及他们的中间件mysql-proxy的使用,这一篇给大家介绍的是keepalived的搭建与使用! 一.keepalived简介 1.1.keepalived介绍 Kee ...
- MySQL集群MGR架构for多主模式
本文转载自: https://www.93bok.com MGR简介 MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决 ...
- MySQL集群MGR架构for单主模式
本文转载自: https://www.93bok.com MGR简介 MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决 ...
- MySQL集群搭建(1)-主备搭建
数据库在任何业务中都是最重要的环节之一,这就对数据库架构提出的较高的要求.单点数据库永远不应该出现在生产环境,我们已经目睹过太多由于单点.备份缺失造成的损失,所以,搭建高可用 MySQL 集群是非常有 ...
- 在Docker下进行MyCAT管理双主双从MySQL集群
前言 在Docker下双主双从MySQL集群模拟 https://www.cnblogs.com/yumq/p/14259964.html 本文实验配置文件 Docker拉取MyCAT镜像 如果没启动 ...
- MongoDB 集群-主从复制(一主二从)
MongoDB 集群-主从复制(一主二从) 官方文档 https://docs.mongodb.com/manual/tutorial/deploy-replica-set/ https://docs ...
- [原]项目进阶 之 集群环境搭建(二)MySQL集群
上次的博文中我们介绍了一下集群的相关概念,今天的博文我们介绍一下MySQL集群的相关内容. 1.MySQL集群简介 MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单 ...
- 集群技术(二) MySQL集群简介与配置详解
when?why? 用MySQL集群? 减少数据中心结点压力和大数据量处理(读写分离),采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据 ...
随机推荐
- Axure 入门
Axure RP是一个专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写. Axure RP是美国Axu ...
- Run Unit API Testing Which Was Distributed To Multiple Test Agents
Recently I am blocked by a very weird issue, from the VS installed machine, I can run performance te ...
- Django编写RESTful API(二):请求和响应
欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我 ...
- easyUI自带的时间插件日期选择、月份选择、时间选择的使用(转)
1.日期选择 只要将class设置成easyui-datebox就可以了,当然前提是已经应用了easyui的js <input type="text" class=" ...
- 如何获取Azure Storage Blob的MD5值
问题表述 直接使用CloudBlockBlob对象获取的Properties是空的,无法获取到对象的MD5值,后台并未进行属性值的填充 前提:blob属性本省包含md5值,某些方式上传的blob默认并 ...
- 【渗透笔记】友情检测朋友公司并拿下shell过程
一朋友在一个百货公司上班,由于无聊危险漫步就友情检测了他们公司的网站,开始我们的检测之旅吧. 打开网站,发现网站挺不错,不愧是大卖场,页面做的挺花,但是安全性怎么样呢?来试试吧.先用工具扫了下后台,结 ...
- 归并排序—Java版
一开始做算法的时候,感觉递归算法很绕,所以我就在阅读别人代码的基础上,对代码每一步都添加自己的注解,方便我以后的学习. public class MergeSort { /** * 归并排序 * @p ...
- JDBCTemplate
1.Spring提供的一个操作数据库的技术JdbcTemplate,是对Jdbc的封装.语法风格非常接近DBUtils. JdbcTemplate可以直接操作数据库,加快效率,而且学这个JdbcTem ...
- macaca 环境搭建篇,(web 和安卓)
appium研究一段时间,感觉appium太不稳定了, 后来听说了阿里开源了macaca,那么我就想尝尝鲜,啥都不说,我感觉还是赶紧上手搭建环境吧. macaca介绍: Macaca是一套完整的自动化 ...
- java Io流中FileInputStream和BufferedInputStream的速度比较
首先是对FileInputStream 加上 FileOutputStream 对文件拷贝的应用 我这里拷贝的是一个视频.当然,你们拷贝什么都可以,当文件越大时效果越明显 下面是对BufferedIn ...