MyCat
MyCat简介
mysql主从搭建
因为mycat只能路由,分布,不能把主多个数据库里面的数据进行同步,所以要数据同步必做还要使用mysql的读写分离,主从复制
1.概述主从介绍
Mysql主从又叫Replication、AB复制。简单讲就是A与B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,实现数据实时同步
mysql主从是基于binlog,主上需开启binlog才能进行主从
主从过程大概有3个步骤
主将更改操作记录到binlog里
从将主的binlog事件(sql语句) 同步本机上并记录在relaylog里
从根据relaylog里面的sql语句按顺序执行
2.主从作用
实时灾备,用于故障切换
读写分离,提供查询服务
备份,避免影响业务
主从形式
- 一主一从
- 主主复制
- 一主多从—扩展系统读取的性能,因为读是在从库读取的
- 多主一从—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启动两个mysql]
名称 | 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
注意开放阿里云的端口(本地注意关闭防方墙并重启docker)
7.修改配置文件
将容器里面的配置文件复制出来,主要修改服务器的配置
在root目录下创建一个mysqlms的目录存放从docker容器里面复制过来的配置文件
mkdir mysqlms
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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rxAo1UqC-1614416198201)(https://gitee.com/zhao_binrui/typora_image/raw/master/images/MyCat-%E4%B8%BB%E6%9C%BA%E7%9A%84%E9%85%8D%E7%BD%AE(m1.cnf)].png)
7.2从机的配置m1s1.cnf
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bBZZUXY5-1614416198202)(https://gitee.com/zhao_binrui/typora_image/raw/master/images/MyCat-%E4%BB%8E%E6%9C%BA%E7%9A%84%E9%85%8D%E7%BD%AE(m1s1.cnf)].png)
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;
change master to master_host="192.168.127.130",master_port=3307,master_user="rep",master_password="123456",master_log_file="master.000001",master_log_pos=745;
启动主从(在M1S1)
start slave #在从机中执行
查询主从的状态
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:
然后停止主从,启动主从:
stop slave
start slave
9.3第一个不是yes,是no
就是你的server-id 没有配置成功的原因,需要重新修改配置文件,复制配置文件到容器里面,然后重启就ok
9.4mysql主从的操作规范
1 只能在主机里面执行DML 语句,不能在从机里面执行DML语句【会破坏主从】
2 在从机里面可以执行查询语句
3 主机只有一台,但是从机可以有多台
测试
在M1 里面创建数据库
看M1S1 有没有复制过去
不能在从表中删除数据库,只能删主表的
搭建mysql集群
9.3第一个不是yes,是no
就是你的server-id 没有配置成功的原因,需要重新修改配置文件,复制配置文件到容器里面,然后重启就ok
9.4mysql主从的操作规范
1 只能在主机里面执行DML 语句,不能在从机里面执行DML语句【会破坏主从】
2 在从机里面可以执行查询语句
3 主机只有一台,但是从机可以有多台
测试
在M1 里面创建数据库
看M1S1 有没有复制过去
不能在从表中删除数据库,只能删主表的