zoukankan      html  css  js  c++  java
  • mysql-8.0.12主从复制

    mysql主从复制的原理是什么?

    (1)Slave上面的IO线程连接上Master,并请求从指定Binary log文件的指定位置(或者从最开始的日志)之后的日志内容;

    (2)Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程根据请求信息读取指定日志指定位置之后的日志信息,返回给Slave端的IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在Master端Binary log文件的名称以及在Binary log中的位置;

    (3)Slave的IO线程收到信息后,将接收到的日志内容依次写入到Slave端的RelayLog文件(mysql-relay-lin.xxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”

    (4)Slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log文件中的内容成为在Master端真实执行时候的那些可执行的查询或操作语句,并在自身执行那些查询或操作语句,这样,实际上就是在master端和Slave端执行了同样的查询或操作语句,所以两端的数据是完全一样的。

    binlog输出线程。每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。
    对于每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。

    在从库里,当复制开始的时候,从库就会创建两个线程进行处理:

    从库I/O线程。当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。
    从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

    从库的SQL线程。从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

    可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。

    从库通过创建两个独立的线程,使得在进行复制时,从库的读和写进行了分离。因此,即使负责执行的线程运行较慢,负责读取更新语句的线程并不会因此变得缓慢。比如说,如果从库有一段时间没运行了,当它在此启动的时候,尽管它的SQL线程执行比较慢,它的I/O线程可以快速地从主库里读取所有的binlog内容。这样一来,即使从库在SQL线程执行完所有读取到的语句前停止运行了,I/O线程也至少完全读取了所有的内容,并将其安全地备份在从库本地的relay log,随时准备在从库下一次启动的时候执行语句

    Mysql主从同步实践

    环境:

    主mysql:172.16.1.21/24

    从mysql:172.16.1.22/24

    需知:

    1.主从服务器操作系统版本和位数一致;

    2.Master 和 Slave 数据库的版本要一致;

    3.Master 和 Slave 数据库中的数据要一致;

    4.Master 开启二进制日志, Master 和 Slave 的 server_id 在局域网内必须唯一;

    主数据库

    开启log-bin功能,并指定server_id为1.这里log-bin必须指定,不然的话bin-log日志会根据主机名来命名,假如主库的主机名改变了,那主从复制就失效了。

    vim /etc/my.cnf

    [mysqld]

    log-bin=mysql-bin

    log-bin-index=master-bin.index

    server-id=1

    重启服务

    创建一个用于让从数据库连接的用户

    mysql> CREATE USER 'copy'@'%' IDENTIFIED WITH mysql_native_password BY 'tqw961110';
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'copy'@'%';

    刷新授权表信息

    mysql> flush privileges;

    获取主节点当前binary log文件名和位置(position)

    mysql> SHOW MASTER STATUS;

    从数据库 (同主库,必须指定中继日志的名称)

    修改server_id

    vi /etc/my.cnf

    [mysqld]

    server-id=2

    relay-log=relay-log

    relay-log-index=relay-log.index

    重启服务

    在从(Slave)节点上设置主节点参数

    mysql> CHANGE MASTER TO
    MASTER_HOST='172.16.1.21',
    MASTER_USER='copy',
    MASTER_PASSWORD='tqw961110',
    MASTER_LOG_FILE='binlog.000012',
    MASTER_LOG_POS=631746;

    查看主从同步状态

    mysql> show slave statusG;

    开启主从同步

    start slave;

    再次查看主从同步状态

    mysql> show slave statusG;

    Slave_IO_Running和Slave_SQL_Running的状态都为YES才表示同步成功!!!!

    若有错误,可在下方查看报错信息

    一般io的报错,都是server_id重复了

    查看server_id的方法

    show variables like 'server_id';

    至此,主从同步完成。可自行测试同步效果。

  • 相关阅读:
    构造函数产生的点及原因
    关于未捕获异常的处理(WPF)
    消息协定
    为outlook增加“邮件召回”功能
    MHA故障切换和在线手工切换原理
    Delphi 类型转换函数(有几个函数没见过,FloatToStrF,FloatToText等等)
    Delphi 常用属性说明(超长)
    Delphi程序自删除的几种方法
    CreateFile,ReadFile等API详解(或者说MSDN的翻译)
    去除文件属性(使用SetFileAttributes API函数)
  • 原文地址:https://www.cnblogs.com/QicongLiang/p/9817533.html
Copyright © 2011-2022 走看看