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数据库公用的数据 ...
随机推荐
- 第一天的php体验
第一次了解php.以前对于程序猿的认知是很片面的.因为没有了解过.今天通过一天的了解交流,有了新的认知.对于这个主要应用于前端的语言还是很有兴趣的.毕竟可以亲眼看到自己做出来的网页,心里的成就感肯定满 ...
- JSP 页面传值方法总结
JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧. 试着将各种方式总结下来,需要时可以进行权衡利弊选择最合适的方式. 1. URL 链接后追加参数 <a href=&quo ...
- Ubuntu 发行版的 Linux 操作系统
Ubuntu 发行版的 Linux 操作系统.. ------------------------------------- ------------------------------------- ...
- 关于操作系统中多个fork()会创建几个进程的理解
最近在看操作系统的书,在讲到用fork()创建子进程时,有些地方一时迷惑,最终理解,特记录下来.如下: //创建一个子进程:#include "csapp.h" int main( ...
- ASP.NET Core 2.0使用Cookie认证实现SSO单点登录
之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sample,这个Demo是基于.NET Framework,.NE ...
- class对象详解
我们知道,对于java语言,我们一般先写一个类对象,表示对某一类对象概述,其中包括属性,方法等.我们在对类对象编译时,会产生一个.class对象,jvm在加载类对象时,是加载.class 对象文件,我 ...
- 利用JavaScript来切换样式表
切换样式表 html页 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- Linux下C/C++和lua交互-Table
本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边. 最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程. ...
- Python中os和shutil模块实用方法集…
Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...
- 201521123084 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...