1、简介
主从复制只主服务器存储的数据通过一定的底层操作同步给从服务器,从而实现主服务器和从服务器数据一致的效果。主从模式主要有以下几个用途:
- 减轻主服务器压力:读操作可通过从服务器读取。
- 实现数据备份:主服务器宕机损坏后数据可由从服务器恢复
2、主从复制原理
服务器上面的任何修改都会保存在二进制日志Binary log里面,从服务器上面启动一个I/O thread(实际上就是一个主服务器的客户端进程),连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log里面。从服务器上面开启一个SQL thread定时检查Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍。
3、MySQL主从复制的过程
- Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容。
- Master接收到来自Slave的IO进程的请求后,负责复制的IO进程会根据请求信息读取日志指定位置之后的日志信息,返回给Slave的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置。
- Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master从何处开始读取日志。
- Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
4、一主一从实现
4.1 安装Docker
此步骤不做说明,请参照网上案例
4.2 拉取MySQL镜像
这里以MySQL 5.7.36为例两台机器执行以下命令:
docker pull mysql:5.7.36
4.3 修改MySQL 配置文件
这里提前创建配置文件,挂载至容器内:
master配置文件,文件名:mysqld.cnf:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
server-id=100 # 注意这里,server-id要唯一,即master使用100,那slave就不能用100了
log-bin=mysql-bin
slave配置文件,文件名:mysqld.cnf:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
server-id=101 # 这里不能与其他节点的ID相同
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
4.4 启动MySQL
docker run --net=host --name=mysql -dit -e MYSQL_ROOT_PASSWORD=123456 -v /root/mzb/mysql/data:/var/lib/mysql -v /root/mzb/mysql.conf.d:/etc/mysql/mysql.conf.d mysql:5.7.36
注意修改配置文件路径,以及本地数据路径
master和slave启动命令一致
4.5 配置同步账号及同步配置
在master上进入容器内:
docker exec -it mysql bash
mysql -uroot -p123456
# 创建同步用户:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 查看节点情况:
show master status;
在slave上进入容器内:
docker exec -it mysql bash
mysql -uroot -p123456
# 创建同步用户:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 加入主节点
CHANGE MASTER TO master_host = '192.168.10.236', # 主节点IP
master_user = 'slave', # 同步用户
master_password = '123456', # 同步密码
master_port = 3306,
master_log_file = 'mysql-bin.000003', # 此处日志文件名为master上执行show master status; 展示的名
master_log_pos = 617,
master_connect_retry = 30;
start slave; # 开启slave
show slave status \G;
如下图则成功完成主备MySQL的部署搭建
接下来即可在master创建数据库和数据表的创建了,可以看到从节点会同步主节点的数据,但是从节点创建的数据并不会同步给主节点,这一点需要注意