• docker高级之安装mysql 主从复制


    安装 mysql 主从复制

    主从搭建步骤

    新建主服务器容器实例 3307

    docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql  -v /mydata/mysql-master/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    docker run -p 3307:3306 --name mysql-master \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=123456 \-d mysql:5.7
    
    • 1
    • 2

    出错

    docker ps -a查看

    docker logs -f 容器id,查看日志

    image-20220728181307897

    删除失败的容器docker rm -f 容器id,然后补上conf.d

    docker run -p 3307:3306 --name mysql-master -v /mysqldata/mysql-master/log:/var/log/mysql  -v /mysqldata/mysql-master/data:/var/lib/mysql  -v /mysqldata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    
    • 1

    image-20220728183129163

    总结原因加个conf.d在容器的目录

    后面又发现问题了主机文件夹应该是mydata

    下面这个是最终的,究极正确的

    docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql  -v /mydata/mysql-master/data:/var/lib/mysql  -v /mydata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    
    • 1

    进入/mydata/mysql-master/conf 目录下新建 my.cnf

    vim my.cnf

    [mysqld]
    ## 进入/mydata/mysql-master/conf 目录下新建 my.cnf server_id,同一局域网中需要唯一
    server_id=101 
    ## 指定不需要同步的数据库名称
    binlog-ignore-db=mysql 
    ## 开启二进制日志功能
    log-bin=mall-mysql-bin 
    ## 设置二进制日志使用内存大小(事务)
    binlog_cache_size=1M 
    ## 设置使用的二进制日志格式
    (mixed,statement,row)
    binlog_format=mixed 
    ## 二进制日志过期清理时间。默认值为 0,表示不自动清理。
    expire_logs_days=7 
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。
    ## 如:1062 错误是指一些主键重复,1032 错误是
    因为主从数据库数据不一致
    slave_skip_errors=1062
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    修改完配置后重启 master 实例

    docker restart mysql-master
    
    • 1

    image-20220728183237500

    进入 mysql-master 容器

    docker exec -it mysql-master /bin/bash
    mysql -uroot -p
    
    • 1
    • 2

    image-20220728183336010

    master 容器实例内创建数据同步用户

    CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
    
    • 1
    • 2

    image-20220728183534922

    新建从服务器容器实例 3308

    docker run -d -p 3308:3306 --name mysql-slave \-v /mydata/mysql-slave/log:/var/log/mysql \-v /mydata/mysql-slave/data:/var/lib/mysql \-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
    
    • 1

    image-20220728183642883

    进入/mydata/mysql-slave/conf 目录下新建 my.cnf

    [mysqld]
    ## 设置 server_id,同一局域网中需要唯一
    server_id=102
    ## 指定不需要同步的数据库名称
    binlog-ignore-db=mysql 
    ## 开启二进制日志功能,以备 Slave 作为其它数据库实例的 Master 时使用
    log-bin=mall-mysql-slave1-bin 
    ## 设置二进制日志使用内存大小(事务)
    binlog_cache_size=1M 
    ## 设置使用的二进制日志格式
    (mixed,statement,row)
    binlog_format=mixed 
    ## 二进制日志过期清理时间。默认值为 0,表示不
    自动清理。
    expire_logs_days=7 
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。
    ## 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
    slave_skip_errors=1062 
    ## relay_log 配置中继日志
    relay_log=mall-mysql-relay-bin 
    ## log_slave_updates 表示 slave 将复制事件写进自己的二进制日志
    log_slave_updates=1 
    ## slave 设置为只读(具有 super 权限的用户除外)
    read_only=1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    修改完配置后重启 slave 实例

    docker restart mysql-master
    
    • 1

    image-20220728183944775

    在主数据库中查看主从同步状态

     show master status;
    
    • 1

    image-20220728191802743

    好折磨呀,一直没有这个,检查了好几遍发现docker run 主机的命令有问题

    下面这是最终的

    docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql  -v /mydata/mysql-master/data:/var/lib/mysql  -v /mydata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    
    docker run -p 3308:3306 --name mysql-slave \-v /mydata/mysql-slave/log:/var/log/mysql \-v /mydata/mysql-slave/data:/var/lib/mysql \-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    
    • 1
    • 2
    • 3

    进入 mysql-slave 容器

    docker exec -it mysql-slave /bin/bash
    mysql -uroot -p
    
    • 1
    • 2

    在从数据库中配置主从复制

    change master to master_host='101', master_user='slave', 
    master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
    
    • 1
    • 2
    查看ip
    ifconfig
    192.168.111.100
    
    • 1
    • 2
    • 3
    change master to master_host='192.168.111.100', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
    
    • 1

    参数说明

    主从复制命令参数说明
    master_host:主数据库的 IP 地址;
    master_port:主数据库的运行端口;
    master_user:在主数据库创建的用于同步数据的用户账号;
    master_password:在主数据库创建的用于同步数据的用户密码;
    master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取 File 参数;
    master_log_pos:指定从数据库从哪个位置开始复
    制数据,通过查看主数据的状态,获取 Position 参数;
    master_connect_retry:连接失败重试的时间间隔,单位为秒。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    报错了,看到有弹幕提醒创建容器加个–privileged=true。先把容器删除了,再重新创建一遍

    image-20220728204821678

    docker run -p 3307:3306 --name mysql-master --privileged=true -v /mydata/mysql-master/log:/var/log/mysql --privileged=true -v /mydata/mysql-master/data:/var/lib/mysql --privileged=true -v /mydata/mysql-master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    
    docker run -p 3308:3306 --name mysql-slave --privileged=true \-v /mydata/mysql-slave/log:/var/log/mysql --privileged=true \-v /mydata/mysql-slave/data:/var/lib/mysql --privileged=true \-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    
    • 1
    • 2
    • 3

    image-20220728205226418

    在从数据库中查看主从同步状态

     show slave status \G; kv形式
     show master status;横的看
    
    • 1
    • 2

    image-20220728205430026

    未开始

    在从数据库中开启主从同步

    start slave;
    
    • 1

    image-20220728205519714

    再次查看

     show slave status \G;
    
    • 1

    image-20220728205556106

    有问题

    主机新建库-使用库-新建表-插入数据,ok

    image-20220728210300139

    从机使用库-查看记录,失败

    image-20220728210330040

    记得在从数据库中查看主从同步状态 时候有点问题,一个yes,一个connecting,把主机的防火墙关了试试

     systemctl stop firewalld
    
    • 1

    重启容器失败了,发现重启容器需要防火墙

    image-20220728210611007

    启动防火墙

     systemctl start firewalld
    
    • 1

    重新启动2个容器

    从数据库再次配置主从复制,报错,根据报错信息输入stop slave;

    image-20220728211026231

    再次配置主从复制

    image-20220728211123458

    查看状态是no

    image-20220728211135666

    开启主从同步

    image-20220728211143781

    再次查看状态都是yes了,。。。这也不知道怎么解决了

    之前主数据库添加了数据,在从数据库中查看,可以查看到。完美

    image-20220728211330735

  • 相关阅读:
    Redis缓存的使用
    第11章 初识IdentityServer4
    浅谈高速公路服务区分布式光伏并网发电
    在java中类的继承原则有哪些?
    计算机的存储系统
    数据结构系列学习(九) - 循环队列(Circular_Queue)
    阿里开源的Java诊断利器Arthas
    反射填充详解ReflectionPad2d(padding)
    图像鲁棒性--常见14种图像攻击matlab实现
    hot100-相交链表
  • 原文地址:https://blog.csdn.net/qq_46110710/article/details/126082516