Docker-Compose实现Mysql主从

1. 简介

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

演示mysql版本:5.7.16

2. 部署流程

master节点:

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

slave节点:

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

3. master节点

3.1 安装mysql

  1. 创建mysql文件夹并进入文件夹(文件夹名称mysql)
  2. 创建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
  1. mysql-temp容器中的配置文件copy出来,现在conf文件夹中就是mysql自带的所有配置文件
$ docker cp mysql-temp:/etc/mysql conf

Docker-Compose实现Mysql主从
3. 因为当前conf目录中的 my.cnf还是个link,所以直接使用当前目录中的备份文件作为主要的配置文件
$ mv my.cnf.fallback my.cnf
  1. 修改配置文件 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

Docker-Compose实现Mysql主从
5. 服务启动完毕后,创建用于同步的用户并授权 创建的用户名称为 slave密码为 123456
CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';
#刷新权限
FLUSH PRIVILEGES;
  1. 查看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主从

可能的原因:

  1. 主从网络不通
  2. 两台节点的 server-id重复,直接修改对应的id即可
  3. 数据库的uuid相同(可能是因为数据库文件是直接copy过来的导致的),在对应的库下生成不同于master的uuid到 auto.cnf中即可
  4. sql执行失败,可能是slave刚添加进来,也没有master库的数据库instance,导致操作对应的库时slave这边根本没有对应的instance或者table又或是记录,引发的报错。这个只能具体问题具体解决了
  5. 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

Original: https://www.cnblogs.com/ludangxin/p/16358928.html
Author: 张铁牛
Title: Docker-Compose实现Mysql主从

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581126/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • eclipse开发jsp页面第一行小红点

    The superclass “javax.servlet.http.HttpServlet” was not found on the Java Buil…

    Java 2023年6月9日
    094
  • Golang中的空字符,似花不是花

    最近在Linux下开发Go程序,发现一个奇怪的问题,在读取Linux系统信息时读到了空字符,导致了程序异常。在 ASSIC中十六进制0为字符NUT,表示为 空字符NULL。但这个字…

    Java 2023年6月16日
    094
  • MCU软件最佳实践——矩阵键盘驱动

    1.矩阵键盘vs独立按键 在mcu应用开发过程中,独立按键比较常见,但是在需要的按键数比较多时,使用矩阵键盘则可以减少io占用,提高系统资源利用率。例如,某mcu项目要求有16个按…

    Java 2023年6月6日
    072
  • 好久不见

    其实真的没想到,自己当初为了帮助自己刷题复习写的博客,能帮助这么多人 大家的消息还有comments我没有一一回复,我表示非常抱歉,因为当找到工作后,就想赶紧换换脑子,休息休息。。…

    Java 2023年5月30日
    096
  • Java开发笔记(一百四十三)FXML布局的基本格式

    前面介绍了JavaFX的常见控件用法,虽然JavaFX控件比起AWT与Swing要好用些,但是一样通过代码编写控件界面,并没有提高什么开发效率。要想浏览界面的展示效果,都必须运行测…

    Java 2023年6月6日
    084
  • Tomcat 单机多实例使用记录

    参考资料 CATALINA_HOME 属性 VS CATALINA_BASE 属性 步骤 1. 创建 CATALINA_BASE 使用的目录 2. 拷贝配置文件添加hello应用 …

    Java 2023年6月13日
    086
  • 实现不完全规划的方法

    在各种常见的规划场景中,我们经常会遇到一种不完全规划的情况。即在正常情况下,在完成了一次规划运算(甚至是CH阶段的运算中),OptaPlanner的规划实体(Planning En…

    Java 2023年6月16日
    0126
  • 【Java面试】谈谈常用的分布式ID设计方案

    “谈谈常用的分布式ID设计方案”! 一个工作了7年的同学,被问到了这样一个问题。问题并不难,但是在实际面试的时候,如果只是回答1,2,3很难通过面试,因为作…

    Java 2023年6月16日
    079
  • 神秘的backlog参数与TCP连接队列

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介 这要从一次压测项目说起,那是我们公司的系统与另几家同行公司的系统做性能比拼,性能数据会直接影响…

    Java 2023年6月7日
    0101
  • 消息推送接口设计(内含源码)

    我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为优质八股文选手 今天要做的就是实现 austin-api和 austin-api-impl模块的部分代…

    Java 2023年6月9日
    0118
  • openstack 虚拟机实例迁移

    10.20.1.181 nova-api controller 10.20.1.182 nova-compute compute1 10.20.1.183 nova-compute…

    Java 2023年5月30日
    084
  • spring security登录认证流程

    spring security登录认证流程 1、前端携带用户名和面膜发送请求,controller接收到后,调用service的login方法 2、根据传过来的用户名和密码生成Us…

    Java 2023年6月9日
    078
  • 04-MyBatisPlus条件构造器

    一、wapper介绍 Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapp…

    Java 2023年6月15日
    096
  • 全面理解Java内存模型

    Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是…

    Java 2023年5月29日
    066
  • WC2022入职集训课程【数字化与创新思维】

    区块链 1.1 认识 区块链是一种去中心化,分布式记账的数据库技术行为。通过学习和体悟,将区块链的定义分成去中心化、分布式记账和数据库行为三部分。加密数字货币是区块链的一种应用。 …

    Java 2023年6月5日
    092
  • RabbitMQ单机部署指南

    1.1.下载镜像 方式一:在线拉取 docker pull rabbitmq:3.8-management 方式二:从本地加载 上传到虚拟机中后,使用命令加载镜像即可: docke…

    Java 2023年6月7日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球