欢迎来到站长天空!

其它服务器

当前位置: 主页 > 服务器 > 其它服务器

Docker-Compose实现Mysql主从的示例代码

时间:2025-12-22 02:30:03|栏目:其它服务器|点击:

目录
  • 1. 简介
  • 2. 部署流程
  • 3. master节点
    • 3.1 安装mysql
  • 4. slave节点
    • 5. 验证
      • 6. 可能遇到的问题
        • 7. 同步部分数据库实例或表

          1. 简介

          通过使用docker-compose 搭建一个主从数据库,本示例为了解耦 将两个server拆分到了两个compose文件中,当然也可以放到一个compose文件中

          演示mysql版本:5.7.16

          2. 部署流程

          master节点:

          • 安装mysql-server
          • 修改配置
          • 创建用于同步的账号并授权
          • 检查相关配置

          slave节点:

          • 安装mysql-server
          • 修改配置
          • 选择主节点
          • 检查相关配置并验证同步功能

          3. master节点

          3.1 安装mysql

          创建mysql文件夹并进入文件夹(文件夹名称mysql)

          创建docker-compose文件内容如下

          # docker-compose.yml
          version: '3'
          services:
            mysql:
              restart: "no"
              image: mysql:5.7.16
              container_name: mysql-master
              volumes:
                - ./datadir:/var/lib/mysql
                - ./conf/mysql:/etc/mysql
              environment:
                - "MYSQL_ROOT_PASSWORD=123456"
                - "TZ=Asia/Shanghai"
              ports:
                - 3306:3306
              networks:
                - mysql-net
          networks:
            mysql-net:
              driver: bridge

          注意:因为要把配置文件挂在到服务中去,所以要先把容器中的配置文件copy到宿主机上

          1.先启动一个用于copy文件的容器

          $ docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=root --rm -d  mysql:5.7.16

          2.将mysql-temp容器中的配置文件copy出来,现在conf文件夹中就是mysql自带的所有配置文件

          $ docker cp mysql-temp:/etc/mysql conf

          Docker-Compose实现Mysql主从的示例代码

          因为当前conf目录中的my.cnf还是个link,所以直接使用当前目录中的备份文件作为主要的配置文件

          $ mv my.cnf.fallback my.cnf

          3.修改配置文件my.cnf

          在文件的最下方加入配置信息

          [mysqld]
          log-bin=mysql-bin # 开启 binlog
          server-id=1 # 当前server在cluster中的id,必须保证在cluster中唯一
          #只保留7天的二进制日志,以防磁盘被日志占满(可选)
          expire-logs-days = 7
          #不备份的数据库 (可选)
          binlog-ignore-db=information_schema  
          binlog-ignore-db=performation_schema
          binlog-ignore-db=sys

          4.启动mysql服务,通过输出内容得知真实的网络名称为mysql_mysql-net,也就是当前所在文件夹的名称拼接了文件中指定的网络名称

          Docker-Compose实现Mysql主从的示例代码

          5.服务启动完毕后,创建用于同步的用户并授权

          创建的用户名称为slave密码为123456

          CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
          GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';
          #刷新权限
          FLUSH PRIVILEGES;

          6.查看master状态信息

          SHOW MASTER STATUS;
          #查看Mater数据有哪些slave
          select * from information_schema.processlist as p where p.command = 'Binlog Dump'; 

          Docker-Compose实现Mysql主从的示例代码

          4. slave节点

          安装步骤同master相同,只把需要修改的展示一下,当前的目录结构如下

          Docker-Compose实现Mysql主从的示例代码

          docker-compose.yaml 主要修改了网络相关的信息和container_name(网络名称上面有解释)

          version: '3'
          services:
            mysql:
              restart: "no"
              image: mysql:5.7.16
              container_name: mysql-slave
              volumes:
                - ./datadir:/var/lib/mysql
                - ./conf:/etc/mysql
              environment:
                - "MYSQL_ROOT_PASSWORD=123456"
                - "TZ=Asia/Shanghai"
              ports:
                - 3307:3306
              networks:
                - mysql_mysql-net
          networks:
            mysql_mysql-net:
              external: true # 来自外部

          my.cnf添加的内容如下:

          [mysqld]
          server-id=2
          relay_log=relay-log
          #开启只读 意味着当前的数据库用作读,当然这也只会影响到非root的用户,如果使用root用户操作本库是不会有影响的
          read_only=ON

          设置完成后启动salve server,连接slave并关联master节点

          • MASTER_HOST:直接使用container_name
          • MASTER_LOG_FILE/MASTER_LOG_POS:直接使用安装master步骤中的最后一步的值,其实就是指定同步的bin-log文件名称和Offset
          CHANGE MASTER TO
          MASTER_HOST='mysql-master',
          MASTER_USER='slave',
          MASTER_PASSWORD='123456',
          MASTER_LOG_FILE='mysql-bin.000001',
          MASTER_LOG_POS=154;

          管理完成后 启动salve

          START SLAVE;

          最后查看slave status

          SHOW SLAVE STATUS;

          Docker-Compose实现Mysql主从的示例代码

          5. 验证

          在master上创建test数据库并创建user表,刷新查看salve库,出现了对应的库表

          Docker-Compose实现Mysql主从的示例代码

          经验证数据同步也没有问题。

          6. 可能遇到的问题

          SHOW SLAVE STATUS时发现 slave_io_running=No salve_sql_running=No,可能的原因有很多,可以查看如下的字段中输出的内容

          Docker-Compose实现Mysql主从的示例代码

          可能的原因:

          • 主从网络不通
          • 两台节点的server-id重复,直接修改对应的id即可
          • 数据库的uuid相同(可能是因为数据库文件是直接copy过来的导致的),在对应的库下生成不同于master的uuid到auto.cnf中即可
          • sql执行失败,可能是slave刚添加进来,也没有master库的数据库instance,导致操作对应的库时slave这边根本没有对应的instance或者table又或是记录,引发的报错。这个只能具体问题具体解决了
          • master和slave的MASTER_LOG_FILE/MASTER_LOG_POS值设置的有问题,在slave节点上STOP SLAVE;然后重新连接下master即可

          7. 同步部分数据库实例或表

          在master节点上添加配置【可选】(如果只希望从库读取到部分实例)

          在my.cnf文件中加入如下配置

          #需要同步的数据库名 有多个库添加多行即可
          binlog-do-db=test
          binlog-do-db=test1
          #排除的数据库
          binlog-ignore-db=sys

          salve端:在my.cnf文件中加入如下配置,这样的话salve只会读取配置的db或table,master对其他db的操作也不会影响slave

          #如果salve库名称与master库名相同,使用本配置 
          replicate-do-db=test
          #如果master库名[test]与salve库名[test001]不同,使用以下配置[需要做映射] 
          #replicate-rewrite-db = test -> test001
          #如果不是要全部同步[默认全部同步],则指定需要同步的表 
          #replicate-wild-do-table=test.user
          #replicate-wild-do-table=test.role

          上一篇:prometheus监控节点程序的安装及卸载命令

          栏    目:其它服务器

          下一篇:docker安装redis挂载容器卷同时开启持久化

          本文标题:Docker-Compose实现Mysql主从的示例代码

          本文地址:https://zz.feitang.co/server/32569.html

          广告投放 | 联系我们 | 版权申明

          申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

          如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

          联系QQ:257218569 | 邮箱:257218569@qq.com

          Copyright © 2018-2025 站长天空 版权所有 Powered by EyouCms冀ICP备14023439号