前言
之前说到redis的主从备份:
Mysql主从复制指的是数据可以从一个Mysql数据库节点复制到多个Mysql数据库节点。 Mysql数据库默认采用异步复制机制。这样对于master节点和slave节点来说,只能保证弱一致性。可能会存在master节点和slave节点数据不一致的情况。
redis同步第一次进行全量同步,slave将master上的数据全部复制一份。slave放弃之前的数据,将接收到的RDB文件全部导入,之后进行增量同步。
和redis不同,mysql主从同步只能基于搭建好之后的数据操作的同步,无法同步以前的数据,故需要手动同步
一、原理?
1.master节点通过foke一个线程将数据变动记录到binlog文件中
2.slave节点通过io线程每一段时间去master节点获取binlog日志数据,保存到relay log中继日志中
3.slave节点检测中继日志有更新,sql线程会将更新的内容同步到slave节点中
tip:还记得之前的日志监听器吗??
二、步骤
1.master搭建
139.9.186.192服务器作为master
1.拉镜像,今天拉5.7版本
docker pull mysql:5.7
2.运行mysql-master
docker run -d -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
3.更新和下载vim插件
1.docker exec -it mysql-master /bin/bash
2.apt-get update
3.apt-get install vim
4.打开my.cnf文件
vim /etc/mysql/my.cnf
5.修改my.cnf文件,添加如下文件
[mysqld] //必填
server_id=1 //如果在同一局域网下部署集群,那么多个mysql的server_id不能相同
log-bin=mysql-bin //日志名称
expire_logs_days=7 //自动清理log时间
6.重启mysql-master
7.查看是否生效
1.进入docker exec -it mysql-master /bin/bash
2.使用mysql> mysql -u root -p
3.mysql> show variables like '%log_bin%'; //log_bin日志此时为on
8.创建从库连接的用户
mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456';
9.查看主数据库状态
mysql> show master status //记录下file名字和position后面从库连接使用
2.slave搭建
1.15.233.184为slave
1.拉镜像,拉5.7版本
docker pull mysql:5.7
2.运行mysql-master
docker run -d -p 3306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
3.更新和下载vim插件
1.docker exec -it mysql-slave /bin/bash
2.apt-get update
3.apt-get install vim
4.打开my.cnf文件
vim /etc/mysql/my.cnf
5.修改my.cnf文件
[mysqld]
server_id=2
read_only=1 //将slave从库设置为只读状态,0为读写状态
6.重启salve,再次进入
7.连接到mysql,连接到master
mysql> change master to
-> master_host='139.9.186.192',
-> master_user='slave',
-> master_password='123456',
-> master_log_file='mysql-bin.000001', //填写上面要你记录的file
-> master_log_pos=406; //填写上面要你记录的position
mysql> start slave;
测试:
从master添加一个test数据库,那么slave将收到。如果在slave添加,那么master不会收到