Docker-Compose实现Mysql主从
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到宿主机上 - 先启动一个用于copy文件的容器 - $ docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=root --rm -d mysql:5.7.16
 
- 将 - mysql-temp容器中的配置文件copy出来,现在conf文件夹中就是mysql自带的所有配置文件- $ docker cp mysql-temp:/etc/mysql conf
  
- 因为当前conf目录中的 - my.cnf还是个link,所以直接使用当前目录中的备份文件作为主要的配置文件- $ mv my.cnf.fallback my.cnf
 
 
- 修改配置文件 - 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
 
- 启动mysql服务,通过输出内容得知真实的网络名称为 - mysql_mysql-net,也就是当前所在文件夹的名称拼接了文件中指定的网络名称 
- 服务启动完毕后,创建用于同步的用户并授权 - 创建的用户名称为 - slave密码为- 123456- CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';
 #刷新权限
 FLUSH PRIVILEGES;
 
- 查看master状态信息 - SHOW MASTER STATUS;
 #查看Mater数据有哪些slave
 select * from information_schema.processlist as p where p.command = 'Binlog Dump';
  
4. slave节点
安装步骤同master相同,只把需要修改的展示一下,当前的目录结构如下

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;

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

经验证数据同步也没有问题。
6. 可能遇到的问题
SHOW SLAVE STATUS时发现 slave_io_running=No salve_sql_running=No,可能的原因有很多,可以查看如下的字段中输出的内容

可能的原因:
- 主从网络不通
- 两台节点的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
Docker-Compose实现Mysql主从的更多相关文章
- 【架构】docker环境搭建mysql主从
		序 本文主要研究怎么在docker上搭建mysql的主从.因为在单机搭建mysql多实例然后再配主从,感觉太痛苦了,环境各有不同,配置各不大相 同,从网上找搭建方法,试了半天也没成功,最后也没耐心调试 ... 
- Docker - Docker中搭建MySQL主从
		1.pull完centos7纯净版的镜像后,创建容器,然后将宿主机上下载的MySQL文件 (MySQL下载地址:http://mysql.mirror.kangaroot.net/Downloads/ ... 
- 基于Docker Compose搭建mysql主从复制(1主2从)
		系统环境 * 3 Ubuntu 16.04 mysql 8.0.12 docker 18.06.1-ce docker-compose 1.23.0-rc3 *3 ==> PS ###我用的是 ... 
- Docker Compose 启动mysql,redis,rabbitmq
		这里使用的centos7,首先切换到root. sudo -s 首先去设置下载镜像,否则下载这三个东西要很久,而且可能失败. vim /etc/docker/daemon.json 内容如下: { & ... 
- docker搭建简单mysql主从
		关于MySQL主从模式,如果我们直接在本机上搭建的话,是没法搭建的,只能借助于虚拟机,但有的时候我们又需要搭建一个主从集群,以便于进行一些功能性的测试.这个时候我们就可以尝试使用docker,借助于d ... 
- Docker | Compose创建mysql容器
		本文通过Docker Compose来创建mysql容器 在linux服务器上创建文件,用于管理容器 mkdir docker-mysql cd docker-mysql vim docker-com ... 
- mac   docker环境搭建mysql主从同步服务器
		参考地址:https://www.cnblogs.com/jinjiangongzuoshi/p/9299275.html 1.下载镜像 docker pull mysql:5.7.19 2.建立配用 ... 
- django 本地项目部署uwsgi 以及云服务器部署 uwsgi+Nginx+Docker+MySQL主从
		一 .django 本地项目部署uwsgi 1 本地部署项目 uwsgi安装测试 通过uwsgi 进行简单部署 安装uwsgi命令:pip install uwsgi -i http://pypi.d ... 
- Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践
		我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实 ... 
- Docker Mysql主从同步配置搭建
		Docker Mysql主从同步配置搭建 建立目录 在虚拟机中建立目录,例如路径/home/mysql/master/data,目录结构如下: Linux中 新建文件夹命令:mkdir 文件夹名 返回 ... 
随机推荐
- java基础-java异常处理
			异常* A:异常的概述 * 异常就是Java程序在运行过程中出现的错误.* B:异常的分类 * Error:服务器宕机,数据库崩溃等 * ExceptionC:异常的继承体系 * Throwable ... 
- 升级DLL plugin 到AutoDllPlugin
			为了使打包构建速度加快使用的DLLPlugin,但是我们还是需要手动把dll文件引入文件, HTMLwebpackplugin 结合autoDLLplugin可以自动引入打包文件, 十份地方便 
- Java中的List接口实现类LinkedList
			package collection; import java.util.LinkedList; /* * 1.implement List接口 * 2.底层是一个链表结构:查询慢,增删快 * 注意: ... 
- SpringMVC-组件分析之视图解析器(prefix,suffix)
			SpringMVC的默认组件都是在DispatcherServlet.properties配置文件中配置的: spring-webmvc->org/springframewrok/web/ser ... 
- SpringCloud Function SpEL注入
			SpringCloud Function SpEL注入 漏洞分析 
- Water 2.6.1 发布,一站式服务治理平台
			Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ... 
- 《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
			1.简介 上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例 ... 
- Spring从入门到源码—IOC基本使用(二)
			1.spring_helloworld 使用maven的方式来构建项目(Mavaen) 添加对应的pom依赖 pom.xml <dependencies> <!-- https:// ... 
- XCTF练习题---CRYPTO---Broadcast
			XCTF练习题---CRYPTO---Broadcast flag:flag{fa0f8335-ae80-448e-a329-6fb69048aae4} 解题步骤: 1.观察题目,下载附件 2.下载完 ... 
- 论文解读(DAGNN)《Towards Deeper Graph Neural Networks》
			论文信息 论文标题:Towards Deeper Graph Neural Networks论文作者:Meng Liu, Hongyang Gao, Shuiwang Ji论文来源:2020, KDD ... 
