精华内容
下载资源
问答
  • Mysql主从复制原理 master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中,salve服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果...

    Mysql主从复制原理

    master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中,salve服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放(执行SQL语句写入),使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

    注意几点:

    1–master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
    2–slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。
    3–Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
    4–Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)
    5–master和slave两节点间时间需同步

    流程图:

     

     

     

     

     

     

     

    如上图所示:
    Mysql复制过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
    第二部分就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
    SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
    此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

    4)Mysql复制的模式
    1–主从复制:主库授权从库远程连接,读取binlog日志并更新到本地数据库的过程;主库写数据后,从库会自动同步过来(从库跟着主库变);
    2–主主复制:主从相互授权连接,读取对方binlog日志并更新到本地数据库的过程;只要对方数据改变,自己就跟着改变;

    5)Mysql主从复制的优点
    1–在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
    2–在从主服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
    3–当主服务器出现问题时,可以切换到从服务器。(提升性能)

    6)Mysql主从复制工作流程细节
    1)MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器上已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器定位到从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
    2)MySQL使用3个线程来执行复制功能,其中两个线程(Sql线程和IO线程)在从服务器,另外一个线程(IO线程)在主服务器。
    当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以即为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。在从服务器上,读取和执行更新语句被分成两个独立的任务。当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程执行更新的远远滞后。

    总结:

    主从数据完成同步的过程:
    1)在Slave 服务器上执行sart slave命令开启主从复制开关,开始进行主从复制。
    2)此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从
      复制服务时执行change master命令指定的)之后开始发送binlog日志内容
    3)Master服务器接收到来自Slave服务器的IO线程的请求后,其上负责复制的IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog
      日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在Master服务器端记录的IO线程。返回的信息中除了binlog中的下一个指定更新位置。
      
    4)当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件
     (Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog
      日志的指定文件及位置开始读取新的binlog日志内容
      
    5)Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句
      的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点
      
    主从复制条件
    1)开启Binlog功能
    2)主库要建立账号
    3)从库要配置master.info(CHANGE MASTER to…相当于配置密码文件和Master的相关信息)
    4)start slave 开启复制功能
      
    需要了解的:
    1)3个线程,主库IO,从库IO和SQL及作用
    2)master.info(从库)作用
    3)relay-log 作用
    4)异步复制
    5)binlog作用(如果需要级联需要开启Binlog)
      
    需要注意:
    1)主从复制是异步的逻辑的SQL语句级的复制
    2)复制时,主库有一个I/O线程,从库有两个线程,I/O和SQL线程
    3)实现主从复制的必要条件是主库要开启记录binlog功能
    4)作为复制的所有Mysql节点的server-id都不能相同
    5)binlog文件只记录对数据库有更改的SQL语句(来自主库内容的变更),不记录任何查询(select,show)语句
    ………………………………………………………………………………………
    彻底解除主从复制关系
    1)stop slave;
    2)reset slave; 或直接删除master.info和relay-log.info这两个文件;
    3)修改my.cnf删除主从相关配置参数。
     
    让slave不随MySQL自动启动
    修改my.cnf 在[mysqld]中增加 skip-slave-start 选项。
     
    做了MySQL主从复制以后,使用mysqldump对数据备份时,一定要注意按照如下方式:
    mysqldump –master-data –single-transaction –user=username –password=password dbname> dumpfilename
    这样就可以保留 file 和 position 的信息,在新搭建一个slave的时候,还原完数据库, file 和 position 的信息也随之更新,接着再start slave 就可以很迅速
    的完成增量同步!
     
    需要限定同步哪些数据库,有3个思路:
    1)在执行grant授权的时候就限定数据库;
    2)在主服务器上限定binlog_do_db = 数据库名;
    3)主服务器上不限定数据库,在从服务器上限定replicate-do-db = 数据库名;
     
    如果想实现 主-从(主)-从 这样的链条式结构,需要设置:
    log-slave-updates      只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器。
    当然,二进制日志也是必须开启的:
    log-bin=/opt/mysql/binlogs/bin-log
    log-bin-index=/opt/mysql/binlogs/bin-log.index
     
    还可以设置一个log保存周期:
    expire_logs_days=14

     

    展开全文
  • 概念Mysql主从工作示意图:实施在每台服务器添加复制账号配置主库和从库,配置二进制文件地址等。同志备库连接连接到主库并启用复制环境mysql版本8.0.5,使用docker模拟,docker-compose配置如下:mysql_master: ...

    概念

    Mysql主从工作示意图:

    fa29b7bfce025c64829c42823b26c063.png

    实施

    1. 在每台服务器添加复制账号
    2. 配置主库和从库,配置二进制文件地址等。
    3. 同志备库连接连接到主库并启用复制

    环境

    mysql版本8.0.5,使用docker模拟,docker-compose配置如下:

    mysql_master:
          image:  mysql:latest
          ports:
            - "3306:3306"
    # hostname 当前容器内可使用        
          hostname: msmaster
          volumes:
            - /data/conf/mysql/conf:/etc/mysql/conf.d
            - /data/conf/mysql/data:/var/lib/mysql
          environment:
                MYSQL_ROOT_PASSWORD: 123456
     mysql_slave:
          image:  mysql:latest
    # links 当前容器与mysql_master建立连接,容器内/etc/hosts,可以查看到mysql_master的ip配置
          links:
             - mysql_master:mysql_master
          ports:
            - "3307:3306"
          hostname: msslave
          volumes:
            - /data/conf/mysql_slave/conf:/etc/mysql/conf.d
            - /data/conf/mysql_slave/data:/var/lib/mysql
          environment:
                MYSQL_ROOT_PASSWORD: 123456

    创建复制账号

    #创建账户 为了方便,没有填从库具体域名,%任意
    CREATE USER 'repl'@'%' IDENTIFIED BY 'p4ssword';
    
    #编码方式
    alter user 'repl'@'%' IDENTIFIED with mysql_native_password  by 'p4ssword';
    
    #分配权限 *.* 代表 库名.表名(*代表全部)
    GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'msslave';

    mysql从服务器为主库创建账户

    #创建账户
    CREATE USER 'repl'@'mysql_master' IDENTIFIED BY 'p4ssword';
    
    alter user 'repl'@'mysql_master' IDENTIFIED with mysql_native_password  by 'p4ssword';
    
    #分配权限 *.* 代表 库名.表名(*代表全部)
    GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'msmaster';

    从库配置账号的目的,为方便提供主从切换。

    配置主库从库

    配置文件下 /mysql/conf/ /mysql_slave/conf/

    master

    [mysqld]
    log_bin      = mysql-bin
    server_id    = 10  #设置server-id,必须唯一

    slave

    log_bin           = mysql-bin
    server_id         = 2
    # 中继日志的位置和命名
    relay_log         = /var/lib/mysql/mysql-relay-bin
    # 允许备库将其重放的事件也记录到自身二进制文件中
    log_slave_updates = 1
    # 阻止任何没有特权权限的线程修改数据
    read_only         = 1

    启动复制

    CHANGE MASTER TO MASTER_HOST='mysql_master',
    MASTER_USER='repl',
    MASTER_PASSWORD='p4ssword',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=0;    #设置0,从日志开头读起

    查看从库状态:
    SHOW SLAVE STATUSG;

    deccb0870cf275d28616d33c260c208b.png

    Slave_IO_Running Slave_SQL_Running Slave_IO_State 三列显示还未开始备库复制

    开启复制:

    START SLAVE;

    再次 SHOW SLAVE STATUSG; 查看 Slave_IO_Running Slave_SQL_Running Slave_IO_State 可看出IO线程、SQL线程已经开启;

    查看线程列表:

    SHOW PROCESSLISTG;

    *************************** 3. row ***************************
         Id: 9
       User: system user
       Host: 
         db: NULL
    Command: Connect
       Time: 328
      State: Connecting to master
       Info: NULL
    *************************** 4. row ***************************
         Id: 10
       User: system user
       Host: 
         db: NULL
    Command: Query
       Time: 328
      State: Slave has read all relay log; waiting for more updates
       Info: NULL

    备库的IO线程和SQL线程状态;

    切换到主库查看

    *************************** 2. row ***************************
         Id: 7
       User: repl
       Host: 172.17.0.6:51074
         db: NULL
    Command: Binlog Dump
       Time: 2978
      State: Master has sent all binlog to slave; waiting for more updates
       Info: NULL

    配置成功!

    从另一个服务器开始复制

    主从复制已经配置好,主库修改数据,从库拉去二进制文件发生错误: Last_SQL_Error: Error executing row event: 'Unknown database 'jump'',原因在复制之前主从数据库数据不一致。

    需要初始化备库,或者从其他服务器克隆数据到备库。

    (1)主数据库进行锁表操作,不让数据再进行写入动作
    mysql> FLUSH TABLES WITH READ LOCK;

    (2)查看主数据库状态
    mysql> show master status;

    (3)记录下 FILE 及 Position 的值。
    将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。

    (4)取消主数据库锁定
    mysql> UNLOCK TABLES;

    遇到问题

    1) mysql8 root无grant权限,必须先建账户,再赋权限

    CREATE USER 'root'@'%' IDENTIFIED BY '123456';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

    2) Last_IO_Error: error connecting to master 'repl@mysql_master:3306' - retry-time: 60 retries: 1


    网络不通,检查hosts是否存在

    以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里PHP进阶架构师>>>实战视频、大厂面试文档免费获取

    展开全文
  • 老哥唠叨上一篇发了MySQL主从复制集群搭建流程,不过好像小伙伴们对这个文章并不感兴趣,但是老哥出于对技术的热爱,和对小伙伴们的负责,我还是要写主从复制另一种实现方式:GTID。这些技术真的蛮重要的,希望你们...

    e834a8aed215571e7543d0527d993f1c.png

    老哥唠叨

    上一篇发了MySQL主从复制集群搭建流程,不过好像小伙伴们对这个文章并不感兴趣,但是老哥出于对技术的热爱,和对小伙伴们的负责,我还是要写主从复制另一种实现方式:GTID。这些技术真的蛮重要的,希望你们能学习。

    GTID 简介

    从 MySQL 5.6.5 版本新增了一种主从复制方式:GTID,其全称是Global Transaction Identifier,即全局事务标识。通过GTID保证每个主库提交的事务在集群中都有唯一的一个事务ID。强化了数据库主从的一致性和故障恢复数据的容错能力。在主库宕机发生主从切换的情况下。GTID方式可以让其他从库自动找到新主库复制的位置,而且GTID可以忽略已经执行过的事务,减少了数据发生错误的概率。

    GTID 组成

    GTID是对一个已经提交事务的编号,并且是全局唯一的。GTID是由UUIDTID组成的。UUIDMySQL实例的唯一标识,TID代表该实例上已经提交的事务数量,随着事务提交数量递增。

    举个例子:3E11FA47-71CA-11E1-9E33-C80AA9429562:23,冒号前面是UUID,后面是TID

    GTID 工作原理

    • 主库 master 提交一个事务时会产生 GTID,并且记录在 binlog 日志中
    • 从库 salve I/O 线程读取 master 的 binlog 日志文件,并存储在 slave 的 relay log 中。slave 将 master 的 GTID 这个值,设置到 gtid_next 中,即下一个要读取的 GTID 值。
    • slave 读取这个 gtid_next,然后对比 slave 自己的 binlog 日志中是否有这个 GTID
    • 如果有这个记录,说明这个 GTID 的事务已经执行过了,可以忽略掉
    • 如果没有这个记录,slave 就会执行该 GTID 事务,并记录到 slave 自己的 binlog 日志中。在读取执行事务前会先检查其他 session 持有该 GTID,确保不被重复执行。
    • 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

    GTID实现

    环境

    这里我们准备两台机器,一主一从。

    • 主(master):192.168.216.111
    • 从(salve):192.168.216.222

    master主库配置

    [mysqld]下配置,配置完需要重启

    #GTID:
    server_id=111  #服务器id,一般设置为机器 IP 地址后三位
    gtid_mode=on  #开启gtid模式
    
    #强制gtid一致性,开启后对于特定create table不被支持
    enforce_gtid_consistency=on
    
    #binlog
    log_bin = 二进制日志文件存放路径
    log-slave-updates=true
    
    #强烈建议,其他格式可能造成数据不一致
    binlog_format=row
    
    #relay log
    skip_slave_start=1
    

    slave从库配置

    [mysqld]下配置,配置完需要重启

    #GTID:
    gtid_mode=on #开启gtid模式
    enforce_gtid_consistency=on
    
    #服务器id,一般设置为机器 IP 地址后三位
    server_id=222
    
    #binlog
    log-bin=slave-binlog
    log-slave-updates=true
    
    #强烈建议,其他格式可能造成数据不一致
    binlog_format=row
    
    #relay log
    skip_slave_start=1
    

    检查GTID是否开启

    show variables like '%gtid%';
    

    e0fa3242dad3515d9208c1465f0be998.png

    主库建立授权用户

    # 建立授权用户
    GRANT REPLICATION SLAVE ON *.* TO '用户名'@'从机IP' IDENTIFIED BY '密码';
    # 刷新MySQL的系统权限相关表
    FLUSH PRIVILEGES;
    

    salve连接到master

    CHANGE MASTER TO  
    MASTER_HOST='master的IP',    
    MASTER_USER='用户名',    
    MASTER_PASSWORD='密码',    
    MASTER_PORT=端口号,    
    # 1 代表采用GTID协议复制
    # 0 代表采用老的binlog复制
    MASTER_AUTO_POSITION = 1;
    

    开启主从复制

    start slave;
    

    查看slave状态

    show slave statusG
    

    在master上查看salve信息

    show slave hosts;
    

    efe4445ef0bbf75678f2cb4159c3f619.png

    至此GTID主从复制方式搭建完毕,可以操作主库验证一下从库是否同步了数据。

    IT 老哥

    一个在大厂做高级Java开发的程序猿

    搜索VX:IT 老哥 ,获取更多学习资源
    展开全文
  • 一、前言MySQL的主从复制详细讲解,根据网上教程也踩了很多坑,浪费了一些时间 ,特地全面的梳理下基于docker构建的mysql主从复制构建过程、遇到的问题以及提供安装包样例等希望一篇文章足以解决搭建环境:一主(192....

    7adf48c86dde944447d4584037b4a002.png

    一、前言

    MySQL的主从复制详细讲解,根据网上教程也踩了很多坑,浪费了一些时间 ,特地全面的梳理下基于docker构建的mysql主从复制构建过程、遇到的问题以及提供安装包样例等

    希望一篇文章足以解决

    搭建环境:一主(192.168.26.148)   一从(192.168.26.123)

    Centos 7.2 64位

    MySQL 5.7.24

    Docker 18.06.1-ce

    docker安装包共享:

    mysql主从 复制共享:

    链接:https://pan.baidu.com/s/1jzo3YiG6XLwIqSFKlSC55g
    提取码:6666

    二、MySql主从复制实战

    2.1 docker安装

    待共享

    2.2 安装mysql

    将安装包解压到 /opt/tar/,形成/opt/tar/db-master目录(里面包含安装mysql的脚本配置)

    e7dd830b861cdf6783728599e888c0fc.png

    1)安装主节点:在主节点执行./install-mysql-master.sh (代码如下)

    /opt/tar/db-master/app-mysql.tar\n#启动镜像\nsleep  3\n#启动\ndocker run -i -t -d -p 3306:3306 --restart=always  -v /etc/localtime:/etc/localtime -v /opt/logs/mysq_logs:/logs  -v /opt/tar/db-master/db/mysql:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123@gla.net.cn --name app-mysql mysql5.7.24 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci\n\nsleep 2\ndocker cp /opt/tar/db-master/mysqld.cnf  app-mysql:/etc/mysql/mysql.conf.d/mysqld.cnf\nsleep 2\ndocker restart  app-mysql\n","classes":[]}"   >#导入images
    docker load #启动镜像
    sleep 3
    #启动
    docker run -i -t -d -p 3306:3306 --restart=always -v /etc/localtime:/etc/localtime -v /opt/logs/mysq_logs:/logs -v /opt/tar/db-master/db/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123@gla.net.cn --name app-mysql mysql5.7.24 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

    sleep 2
    docker cp /opt/tar/db-master/mysqld.cnf app-mysql:/etc/mysql/mysql.conf.d/mysqld.cnf
    sleep 2
    docker restart app-mysql

      2)在slave节点执行./install-mysql-slave.sh(代码如下)

    /opt/tar/db-master/app-mysql.tar\n#启动镜像\nsleep  3\n#启动\ndocker run -i -t -d -p 3306:3306 --restart=always  -v /etc/localtime:/etc/localtime -v /opt/logs/mysq_logs:/logs  -v /opt/tar/db-master/db/mysql:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123@gla.net.cn --name app-mysql mysql5.7.24 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci\n\nsleep 2\ndocker cp /opt/tar/db-master/mysqld-slave.cnf  app-mysql:/etc/mysql/mysql.conf.d/mysqld.cnf\ndocker cp /opt/tar/db-master/auto-slave.cnf  app-mysql:/var/lib/mysql/auto.cnf \nsleep 2\ndocker restart  app-mysql\n","classes":[]}"   >#导入images
    docker load #启动镜像
    sleep 3
    #启动
    docker run -i -t -d -p 3306:3306 --restart=always -v /etc/localtime:/etc/localtime -v /opt/logs/mysq_logs:/logs -v /opt/tar/db-master/db/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123@gla.net.cn --name app-mysql mysql5.7.24 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

    sleep 2
    docker cp /opt/tar/db-master/mysqld-slave.cnf app-mysql:/etc/mysql/mysql.conf.d/mysqld.cnf
    docker cp /opt/tar/db-master/auto-slave.cnf app-mysql:/var/lib/mysql/auto.cnf
    sleep 2
    docker restart app-mysql

    使用Navicat连接测试 

    2.3 主从配置

    1)创建主容器的复制账号(Navicat执行SQL)

    GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by 'backup';
    show grants for 'backup'@'%';

    出现如下信息表示授权成功

    2f706d3d7315869d1efa8cc2793a734c.png

    2)修改/etc/mysql/my.cnf,在 [mysqld] 节点最后加上后保存

    注意my.cnf加载了两个目录,所以这里的修改的文件为

    /etc/mysql/mysql.conf.d/mysqld.cnf

    log-bin=mysql-bin
    server-id=1

    log-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀

    server-id=1 唯一服务器ID,非0整数,不能和其他服务器的server-id重复(主和从的要不一样)

    两个主从配置文件分别对应/opt/tar/db-master/目录下mysqld.cnfmysqld-slave.cnf

    3)配置主从复制

    1.在slave节点配置连接

    #停止掉slave
    STOP SLAVE

    CHANGE MASTER TO
    MASTER_HOST='192.168.26.148',
    MASTER_PORT=3306,
    MASTER_USER='backup',
    MASTER_PASSWORD='backup';

    #启动slave
    START SLAVE;

    show slave status;

    MASTER_HOST 填Navicat连接配置中的ip应该就可以

    MASTER_PORT 主容器的端口

    MASTER_USER 同步账号的用户名

    MASTER_PASSWORD 同步账号的密码

    2.检查是否配置成功

    53d7607c38f830b49e0fa31d7f45a4ed.png

    Slave_IO_State 如果是Waiting for master to send event并且如下两个选项都为yes则配置成功

    1fcb9255d5a163aa6c95d8ccb67ef2e3.png

    3.问题排查

    part1: 如果错误可通过如下命令查看docker中的日志(很重要,快速定位问题)

     docker logs app-mysql -f

    part2:重启

    STOP SLAVE;

    CHANGE MASTER TO
    MASTER_HOST='ip',
    MASTER_PORT=端口,
    MASTER_USER='用户名',
    MASTER_PASSWORD='密码';

    START SLAVE;

    part3:如果有一个不是Yes,一半是重启从容器后,事务回滚引起的,那么给出解决方法如下

    stop slave ;
    set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    start slave ;

    4.测试主从复制

    首先,在主实例中创建一个测试数据库test2(148)

    de7b38ff2309b3b8d1ef849ec7789902.png

    打开(刷新)从实例123,可见test2库已存在

    ef0430f6a7402c2c05d405382407ecf1.png

    三、错误排查

    1)Slave failed to initialize relay log info structure from the repository

    mysql> start slave;
    ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
    mysql> reset slave;
    Query OK, 0 rows affected (0.04 sec)

    mysql> start slave IO_THREAD;
    Query OK, 0 rows affected (0.07 sec)

    mysql> stop slave IO_THREAD;
    Query OK, 0 rows affected (0.01 sec)

    mysql> reset slave;
    Query OK, 0 rows affected (0.10 sec)

    mysql> start slave;
    Query OK, 0 rows affected (0.20 sec)

    mysql> show slave status\G

    2)Mysql主从架构报错-Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work

    在搭建Mysql主从架构过程中,由于从服务器是克隆的主服务器系统,导致主从mysql uuid相同, Slave_IO无法启动,报错如下:

    The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

    解决办法,修改其中一台服务器的server-uuid,并保证server-uuid的格式正确,修改完成之后重启Mysql服务就可以了。

    在修改配置文件之前,先登录Mysql客户端查看uuid,把返回的uuid复制,放到要修改的配置文件即可

    MySQL [hb3]> select uuid();
    +--------------------------------------+
    | uuid() |
    +--------------------------------------+
    | a39fd903-3a1c-11e8-ab46-000c29133368 |
    +--------------------------------------+
    1 row in set (0.00 sec)

    修改uuid配置文件

    # find / -name 'auto.cnf'
    # vim /data/mysql/auto.cnf
    [auto]
    server-uuid=804f2ebe-3a1c-11e8-ab46-000c29133368 # 按照这个16进制格式,修改server-uuid,重启mysql即可

    对应auto-save.cnf 配置,应为都是基于一个mysql镜像构建的,所以uuid会重复,需要修改下

    3)如果无Navicat,可进入容器进行执行

    进入master 容器
    进入 mysql,密码为 123123

    # mysql -uroot -p

    成功进入后,创建用户 whosme 并给予 slave 权限

    参考链接:https://my.oschina.net/u/3773384/blog/1810111

    https://www.cnblogs.com/wt645631686/p/8310195.html

    4)开放3306端口

    [root@VM_0_17_centos ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
    [root@VM_0_17_centos ~]# firewall-cmd --reload

    5)查看错误日志

    docker logs slave -f

    14903536336e449dae993b55acf4515c.png

    展开全文
  • 详细的结构分解,可以快速了解mysql主从复制原理和对主从更清晰的了解。
  • mysql主从复制原理详解

    千次阅读 2016-07-08 23:40:30
    原理可以看出: *  主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。 *  如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。 *  如果对从库进行修改...
  • 写在前面最近在写Mycat专题,由于不少小伙伴最近要出去面试,问我能不能简单写下MySQL主从复制原理和注意事项,因为在之前的面试中被问到了这些问题。我:可以啊,安排上了!!主从复制原理(1) Master 将数据改变...
  • 概述今天主要介绍一下Mysql主从复制的三种复制方式,后面再进一步说一下MGR。。参考:...
  • 复制解决的基本问题是让一台服务器...”《高性能MySQL》10.1复制概述MySQL中的两种复制MySQL支持两种复制方式:基于行的复制和基于语句的复制,两者都是通过在主库(master)记录二进制文件(binlog),然后在备库(repli...
  • 主从复制是怎么实现的呢?更新语句会记录 binlog,它是一种逻辑日志。有了这个 binlog,从服务器会获取主服务器的 binlog 文件,然后解析里面的 SQL 语句,在从服务器上面执行一遍,保持主从的数据一致。这里面涉及...
  • 搭建Mysql主从同步之前,我们先来说他们之间同步的过程与原理:同步复制过程献上一张图,这张图诠释了整个同步过程主从复制过程:slave节点与主节点进行连接,建立主从关系,并把从哪开始同步,及哪个日志文件都一并...
  • 一、主从复制概述这章来说说主从复制,对于主从复制,有很多知识,在以后分篇记录,所以在这里只说说简单的用法,用来入个门可以,先说啥是主从复制主从复制就是将一台主机的数据复制到另一台或者多台主机上,复制...
  • MySQL 主从复制主流架构模型我们基于 Binlog 可以复制出一台 MySQL 服务器,也可以复制出多台,取决于我们想实现什么功能。主流的系统架构有如下几种方式:1. 一主一从 / 一主多从一主一从和一主多从是最常见的主从...
  • 搭建Mysql主从同步之前,我们先来说他们之间同步的过程与原理:同步复制过程献上一张图,这张图诠释了整个同步过程 主从复制过程:slave节点与主节点进行连接,建立主从关系,并把从哪开始同步,及哪个日志文件都...
  • 1.Mysql逻辑架构图如果能在脑海中构建出MySql各组件之间如何协同工作的架构图,就会有助于深入理解MySql服务器Mysql逻辑架构图主要分三层:1) 第一层负责连接处理,授权认证,安全等等每个客户端连接都会在服务器...
  • 6、异步复制复制原理1.复制过程复制的过程步骤如下:1、从节点执行 slaveof 命令2、从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制3、从节点内部的定时任务发现有主节点的信息,开始使用 socket ...
  • 索引定义和一些概念:索引(Index)是帮助MySQL高效获取数据的数据结构。我们知道,数据库查询是数据库的最主要功能之一。但每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树...
  • 项目网站的用户量、数据量持续上升,普通模式下的单机MySQL即将面临被请求压力打垮的情景。老早就被急的像热锅上蚂蚁一样的产品经理,把我给叫了过去,看着那诚恳的小眼神儿。心理甚是开心。你说,早知道会遇到这样...
  • 复制的过程步骤如下:上面说的复制过程,其中有一个步骤是“同步数据集”,这个就是现在讲的‘数据间的同步’。...psync 命令需要 3 个组件支持:主从节点各自复制偏移量:主节点复制积压缓冲区:主...
  • MySQL 主从复制是我们业务中常用的技术架构,今天我们就来聊一聊 MySQL 主从复制以及 MySQL 主从配置如何设置?为什么需要主从复制?1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能...
  • 主要介绍了MySQL 主从复制原理与实践,结合实例形式分析了MySQL 主从复制基本概念、原理、实现方法与相关注意事项,需要的朋友可以参考下
  • 一、什么是主从复制主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库。在最常用的mysql数据库中,支持单项、异步赋值。在赋值过程中,一个服务器充当主...
  • MySQL 主从复制是我们业务中常用的技术架构,今天我们就来聊一聊 MySQL 主从复制以及 MySQL 主从配置如何设置?为什么需要主从复制?1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能...
  • 本文实例讲述了MySQL 主从复制原理与实践。分享给大家供大家参考,具体如下:简介MySQL 的主从复制又叫 Replication、AB 复制。至少需要两个 MySQL 服务(可以是同一台机器,也可以是不同机器之间进行)。比如A服务器...
  • 首先要明白为什么要用 mysql 的...来说一下主从复制的实现原理 mysql 复制过程分为三步(如上图所示): 1.mster 将改变记录到二进制日志 (binary log) 当中 这些记录过程叫做二进制日志事件 binary log events; 2.sl
  • MySQL主从复制原理详解:一、mysql主从复制介绍 (1)mysql支持单双向、链式级联、异步复制。在复制过程中一个充当主服务器(Master),一个或多个充当从服务器(Slave)。在复制过程中一个充当主服务器 (2)如果设置了...
  • 一、MySQL 主从复制原理1、简介MySql自带有主从复制功能,该功能是构建大型应用、高性能应用的基础。这种机制是指:将某一台主机(master)上的MySQL数据复制到多台其他主机上(slave),并重新执行一遍来实现。复制过程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 422
精华内容 168
关键字:

mysql主从复制原理详解

mysql 订阅