MyCat详解(2.主从搭建)

1,概述主从介绍

Mysql主从又叫Replication、AB复制。简单讲就是A与B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,实现数据实时同步

mysql主从是基于binlog,主上需开启binlog才能进行主从

主从过程大概有3个步骤

主将更改操作记录到binlog里

从将主的binlog事件(sql语句) 同步本机上并记录在relaylog里

从根据relaylog里面的sql语句按顺序执行

2,主从作用

实时灾备,用于故障切换

读写分离,提供查询服务

备份,避免影响业务

扫描二维码关注公众号,回复: 11401724 查看本文章

主从形式
在这里插入图片描述

  • 一主一从

  • 主主复制

  • 一主多从—扩展系统读取的性能,因为读是在从库读取的

  • 多主一从—5.7版本开始支持

  • 联级复制

3,主从复制原理

在这里插入图片描述

4,主从复制步骤

主库将所有的写操作记录在binlog日志中,并生成log dump线程,将binlog日志传给从库的I/O线程

从库生成两个线程,一个是I/O线程,另一个是SQL线程


I/O线程去请求主库的binlog日志,并将binlog日志中的文件写入relay log(中继日志)中

SQL线程会读取relay loy中的内容,并解析成具体的操作,来实现主从的操作一致,达到最终数据一致的目的

5,主从复制配置步骤

确保从数据库与主数据库里的数据一致

在主数据库里创建一个同步账户授权给从数据库使用

配合主数据库(修改配置文件)

配置从数据库(修改配置文件)

需求

搭建两台MYSQL服务器,一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作

6,环境说明【使用docker启动两个】

名称 Ip Port
M1 192.168.149.128 3307
M1S1 192.168.149.128 3308

在这里插入图片描述

docker run --name M1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker run --name M1S1 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

7,修改配置文件

将容器里面的配置文件复制出来,主要修改服务器的配置

在root目录下创建一个mysqlms的目录存放从docker容器里面复制过来的配置文件
在这里插入图片描述

docker cp M1:/etc/mysql/conf.d/docker.cnf m1.cnf
docker cp M1S1:/etc/mysql/conf.d/docker.cnf m1s1.cnf
在这里插入图片描述

7.1,主机的配置m1.cnf

主机里面要记录sql 语句,以后从机会把该sql 语句偷过去

在这里插入图片描述

7.2,从机的配置m1s1.cnf

在这里插入图片描述

7.3,配置文件修改后,复制到容器里面

docker cp m1.cnf M1:/etc/mysql/conf.d/docker.cnf

docker cp m1s1.cnf M1S1:/etc/mysql/conf.d/docker.cnf

在这里插入图片描述

重启mysql(m1,m1s1)

docker restart M1 M1S1
在这里插入图片描述

8,执行sql语句

8.1进入主机

docker exec -it M1 bash
mysql -uroot -p123456

在这里插入图片描述

创建用户

create user ‘rep’@’%’ identified by ‘123456’;
在这里插入图片描述

给该用户授予权限:

grant replication slave on . to ‘rep’@’%’;

在这里插入图片描述

刷新权限

flush privileges;
在这里插入图片描述

至此:M1 里面已经创建了一个用户:rep 123456 拥有所以库,所有表replication slave

尝试使用M1 里面的rep 用户登录:

在这里插入图片描述

8.2进入从机里面执行相关配置

docker exec -it M1S1 bash

mysql -u root -p123456

在这里插入图片描述

change master to master_host="",master_port=,master_user="",master_password="",master_log_file="",master_log_pos=

master_log_file:该文件具体叫什么名称,需要从主机里面去看看:

进入M1 里面使用root 用户登录M1,执行下面的sql:

show master status;

在这里插入图片描述

修改上面的SQL执行
在这里插入图片描述

change master to master_host=“117.48.203.125”,master_port=3307,master_user=“rep”,master_password=“123456”,master_log_file=“master.000001”,master_log_pos=745;

启动主从:(在M1S1里面执行)

start slave ;

在这里插入图片描述

查询主从的状态(M1S1)

show slave status \G;
在这里插入图片描述

成功的标志:
在这里插入图片描述

9,搭建失败的原因

9.1,第一个不是yes,是connecting

是因为从机使用你配置的主机信息没有登陆到主机里面!

修改(从机里面)

stop slave;

change master to master_host="192.168.149.128",master_port=3307,master_user="rep",master_password="123456",master_log_file="master.000001",master_log_pos=745;

start slave;

9.2,第二个不是yes ,是no

在这里插入图片描述

从机会复制主机里面的sql 语句,来自己执行!

实验时先把从机里面的db3 删除

再把主机里面的db3 删除->从机里面复制该删除的命令->从机执行删除的命令(db3),事务无法提交,将一直阻塞!
在这里插入图片描述

现在从机里面要删除db3 ,但是没有db3,导致一直阻塞,以后的主从复制不会进行了

解决:在从机新建一个db3:

然后停止主从,启动主从:

在这里插入图片描述

9.3,第一个不是yes,是no

就是你的server-id 没有配置成功的原因,需要重新修改配置文件,复制配置文件到容器里面,然后重启就ok

9.4,mysql主从的操作规范

  1. 只能在主机里面执行DML 语句,不能在从机里面执行DML语句

  2. 在从机里面可以执行查询语句

  3. 主机只有一台,但是从机可以有多台

10,测试

在M1 里面创建数据库

看M1S1 有没有复制过去

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43623447/article/details/104276173