当前位置:网站首页>MySQL:MySQL的集群——主从复制的原理和配置

MySQL:MySQL的集群——主从复制的原理和配置

2022-08-10 22:04:00 _索伦

前言

在实际生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不能满足实际需求的,一般要通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。

1、数据备份 - 热备份&容灾&高可用
2、读写分离,支持更大的并发

原理介绍

在这里插入图片描述

主从复制的流程:两个日志(binlog二进制日志&relay log日志)和三个线程(master的一个线程和
slave的二个线程)

1、主库的更新操作写入binlog二进制日志中。
2、master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器。
3、slave机器执行START SLAVE命令会在从服务器创建一个IO线程,接收master的binary log复制到其中继日志。
首先slave开始一个工作线程(I/O线程),I/O线程在master上打开一个普通的连接,然后开始
binlog dump process,binlog dump process从master的二进制日志中读取事件,如果已经跟上
master,它会睡眠并等待master产生新的事件,I/O线程将这些事件写入中继日志。
4、sql slave thread(sql从线程)处理该过程的最后一步,sql线程从中继日志中读取事件,并重放其
中的事件而更新slave机器的数据,使其与master的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小。

问题

为什么不用I/O线程直接从主库的bin-log里读数据写入从库中,而是写入中继日志?

因为主库的bin-log内容可能很多,而一个I/O线程读取的缓慢,导致从库更新数据可能会和主库的内容差距越来越大,数据落后。

配置

master(centos7):192.168.131.129
slave(win10):192.168.0.6
保证master和slave之间的网络互通,并且保证3306端口是开放的。

master配置:
1、开启二进制日志 , 目录:/etc/my.cnf
配置log_bin和全局唯一的server-id。

在这里插入图片描述

2、创建一个用于主从库通信用的账号

mysql> CREATE USER ‘mslave’@‘192.168.131.1’ IDENTIFIED BY ‘[email protected]’;
mysql> GRANT REPLICATION SLAVE ON . to ‘mslave’@‘192.168.131.1’ IDENTIFIED BY ‘[email protected]’;
mysql> FLUSH PRIVILEGES;

3、获取binlog的日志文件名和position

mysql> show master status;

slave配置:
1、配置全局唯一的server-id(涉及修改配置文件,需要重启mysql57服务)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、使用master创建的账户读取binlog同步数据(stop slave;start slave)

根据自己情况调整参数
在这里插入图片描述

示例,个人的主库bin-log到哪了就配置哪个
在这里插入图片描述

3、START SLAVE
通过show slave status命令查看主从复制状态。show processlist查看master和salve相关线程的运行
状态。

在这里插入图片描述

常见错误

  1. IO_ERROR

在这里插入图片描述

解决方案:

  1. 先使用ping命令查看网络通不通?
  2. 主库所在机器的3306端口是否正常? telnet xxx.xxx.xxx.xxx 3306
  3. 防火墙对端口有限制?
  4. 查看主库的错误日志 /var/log/mysql/mysqld.log

2.Last_Error
在这里插入图片描述

解决:查看配置信息是否写错,然后重启slave线程
在这里插入图片描述
在这里插入图片描述

3.SQL_Error

在这里插入图片描述

错误原因:

从库还没有同步mytest这个库,但主库使用了 drop database mytest的SQL,那么这条SQL会写到bin-log日志,然后I/O线程读到这个SQL,写入中继日志,从库从中继日志读到了这个SQL,执行后产生的错误。

解决:

可以先停止slave线程,跳过一个错误,然后重启slave

stop slave;
set global sql_slave_skip_counter = 1;
start slave;

原网站

版权声明
本文为[_索伦]所创,转载请带上原文链接,感谢
https://sauron7i.blog.csdn.net/article/details/126265559