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


    前言

    在实际生产环境中,如果对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 ‘1qaz@WSX’;
    mysql> GRANT REPLICATION SLAVE ON . to ‘mslave’@‘192.168.131.1’ IDENTIFIED BY ‘1qaz@WSX’;
    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;

  • 相关阅读:
    堆(堆排序和模拟堆)
    Lecture1:从图像分类引出概念
    简析Acrel-1000安科瑞变电站综合自动化系统选型与应用
    如何让chatGPT给出高质量的回答?
    CM311-1a_CH_S905L3A_安卓9.0_纯净线刷固件包
    轻量限制流量?阿里云轻量应用服务器月流量包收费说明
    springboot调用第三方接口json转换成对象
    机器学习之算法优化(一)
    第八章---IO及对象序列化
    Java,集合框架,关于Map接口与Collections工具类
  • 原文地址:https://blog.csdn.net/m0_56257585/article/details/126265559