详解如何利用docker快速构建MySQL主从复制环境

在学习MySQL的过程中,常常会测试各种参数的作用。这时候,就需要快速构建出MySQL实例,甚至主从。

考虑如下场景:

譬如我想测试mysqldump在指定--single-transaction参数的情况下,对于myisam表的影响。

本来想在现成的测试环境中进行,但测试环境中,有大量的数据,执行mysqldump进行全备,产生的SQL文件,很难基于表进行搜索。

这个时候,就特别渴望能有一套干净的实例进行测试。

此刻,快速构建能力就显得尤为必要,很多童鞋可能会问,通过脚本不就能实现么?为什么要用docker?

个人感觉:脚本太重,会涉及很多额外的工作,譬如创建用户,相对较长的数据库初始化过程,MySQL启动过程,而我需要的是一种快速构建,快速销毁的能力。

而这,正是Docker的强项。

如下,是利用docker启动一个实例的时间,不到1s,如果使用脚本来做的话,绝不会这么快。

# time docker run --name slave -v /etc/slave.cnf:/etc/mysql/my.cnf -v /var/lib/mysql/slave:/var/lib/mysql -p3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.34
6b7fe5da9e8c77529ee634e163add57db5cd15757e88261ce320a502ae01f853

real  0m0.986s
user  0m0.026s
sys  0m0.018s

于是基于docker写了个脚本,可在30s左右新建一套MySQL主从复制环境

#!/bin/bash

MASTER_DIR=/var/lib/mysql/master
SLAVE_DIR=/var/lib/mysql/slave

## First we could rm the existed container
docker rm -f master
docker rm -f slave

## Rm the existed directory
rm -rf $MASTER_DIR
rm -rf $SLAVE_DIR

## Start instance
docker run --name master -v /etc/master.cnf:/etc/mysql/my.cnf -v $MASTER_DIR:/var/lib/mysql --net=host -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.34
docker run --name slave -v /etc/slave.cnf:/etc/mysql/my.cnf -v $SLAVE_DIR:/var/lib/mysql --net=host -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.34
## Creating a User for Replication
docker stop master slave
docker start master slave

sleep 3

docker exec -it master mysql -S /var/lib/mysql/mysql.sock -e "CREATE USER 'repl'@'127.0.0.1' IDENTIFIED BY 'repl';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.0.1';"

## Obtaining the Replication Master Binary Log Coordinates
master_status=`docker exec -it master mysql -S /var/lib/mysql/mysql.sock -e "show master status\G"`
master_log_file=`echo "$master_status" | awk 'NR==2{print substr($2,1,length($2)-1)}'`
master_log_pos=`echo "$master_status" | awk 'NR==3{print $2}'`
master_log_file="'""$master_log_file""'"

## Setting Up Replication Slaves
docker exec -it slave mysql -S /var/lib/mysql/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE=$master_log_file,MASTER_LOG_POS=$master_log_pos;"docker exec -it slave mysql -S /var/lib/mysql/mysql.sock -e "start slave;"
docker exec -it slave mysql -S /var/lib/mysql/mysql.sock -e "show slave status\G"

## Creates shortcuts
grep "alias master" /etc/profile
if [ $? -eq 1 ];then
  echo 'alias mysql="docker exec -it master mysql"' >> /etc/profile
  echo 'alias master="docker exec -it master mysql -h 127.0.0.1 -P3306"' >> /etc/profile
  echo 'alias slave="docker exec -it master mysql -h 127.0.0.1 -P3307"' >> /etc/profile
  source /etc/profile
fi

脚本本身没有太多需要说明的地方,主从容器起来后,遵循的还是常见的主从复制建立流程。

主要是说说创建容器所涉及的选项。

代码如下:

docker run --name master -v /etc/master.cnf:/etc/mysql/my.cnf -v $MASTER_DIR:/var/lib/mysql  --net=host -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.34

-v /etc/master.cnf:/etc/mysql/my.cnf:将本地的配置文件映射成容器的配置文件,这样,可通过修改本地配置文件,来达到修改容器配置文件的效果。

-v $MASTER_DIR:/var/lib/mysql :将本地目录映射成容器的数据目录,这样,方便查看数据目录的内容,不然的话,就默认保存在/var/lib/docker/volumes目录下,实在不方便查看。

--net=host:共享宿主机的网络,大大降低容器之间的通信复杂度。

 注意

在脚本刚开始的时候,会删除之前的容器,这包含两步操作

1. 通过docker命令删除容器

2. 通过操作系统命令删除之前容器的数据目录。

如果不删除的话,再次通过如下命令创建容器时,并不会清空之前的数据目录,而是直接加载,相当于新启了一个mysqld进程启动之前的实例。

代码如下:

docker run --name master -v /etc/master.cnf:/etc/mysql/my.cnf -v $MASTER_DIR:/var/lib/mysql  --net=host -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.34

这也给我们提供了一个思路,如果只是想测试参数的作用,并不想新建实例的话,只需通过docker命令删除容器,修改配置文件,通过上述命令创建容器即可。

在启动实例后,执行了一个重启实例的操作,因为在测试的过程中,发现如果执行docker exec -it master bash之类的操作,会导致容器down掉(具体down的原因还未分析),但是重启实例后就没问题。

docker stop master slave
docker start master slave

sleep 3

设置快捷键

mysql:mysql客户端,可以通过该客户端连接其它主机上的MySQL服务器。

master:执行master即可登录本机的master实例,省掉了指定主机名和端口的操作。

salve:执行slave即可登录本机的slave实例。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 使用Docker容器搭建MySql主从复制

    1. 编写主MySQL的Docker文件 新建文件夹,命名为MySQL-master-v1.在文件夹mysql-master-v1中新建文件Dockerfile和master.cnf.笔者推荐使用的编辑器是Visual Studio Code.利用编辑器将这两个文件的编码设置成UTF-8.因为本文介绍安装到Linux系统下,所以笔者建议读者把换行符设置成LF,以兼顾Linux操作系统.按照如下内容编写这两个文件. Dockerfile FROM mysql:5.7 # set timezone

  • mysql 5.7 docker 主从复制架构搭建教程

    分享mysql 5.7 docker 主从复制架构搭建教程,供大家参考,具体内容如下 环境版本: MySQL :  5.7.13 Docker : 1.11.2 CentOS : 7.1 1.先在两个物理机上分别安装两个MySQL.命令如下 复制代码 代码如下: docker pull mysql:5.7.13  docker run --name anuo-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=qaz.00JK -d mysql:5.7.13 2.

  • 详解Docker方式实现MySql 主从复制(实践篇)

    本文实践了用Docker方式来实现基于binlog的MySql主从复制.关于MySql主从复制的原理将在下一篇中进行讲解. 一些数据的本地存储目录结构 mysql >tree -L 2 . ├── data │ ├── master01 │ └── slave01 ├── master01 │ └── master01.cnf └── slave01 └── slave01.cnf master01.cnf配置 [mysqld] log-bin=mysql-master01-bin # 使用bi

  • 详解如何利用docker快速构建MySQL主从复制环境

    在学习MySQL的过程中,常常会测试各种参数的作用.这时候,就需要快速构建出MySQL实例,甚至主从. 考虑如下场景: 譬如我想测试mysqldump在指定--single-transaction参数的情况下,对于myisam表的影响. 本来想在现成的测试环境中进行,但测试环境中,有大量的数据,执行mysqldump进行全备,产生的SQL文件,很难基于表进行搜索. 这个时候,就特别渴望能有一套干净的实例进行测试. 此刻,快速构建能力就显得尤为必要,很多童鞋可能会问,通过脚本不就能实现么?为什么要

  • 详解如何使用Docker部署Django+MySQL8开发环境

    前一段时间重装了系统,然后我还没有备份,导致电脑里的开发环境全都没有了. 一想到又要装 Python 环境,还要装数据库,然后安装过程中还可能报一堆错就头疼. 最近正在学习 Docker,这不正好解决了我当前的痛点了吗?而且,不止这次重装系统,以后再重装都不怕了,只要拿着 Dockerfile 和 docker-compose 文件,不管到什么环境,一条命令轻松跑起来. 之前部署 Python 开发环境,都是用的 virtualenv,或者是 Pipenv.这次使用 Docker 之后,对比下来

  • 详解如何利用amoeba(变形虫)实现mysql数据库读写分离

    关于mysql的读写分离架构有很多,百度的话几乎都是用mysql_proxy实现的.由于proxy是基于lua脚本语言实现的,所以网上不少网友表示proxy效率不高,也不稳定,不建议在生产环境使用: amoeba是阿里开发的一款数据库读写分离的项目(读写分离只是它的一个小功能),由于是基于java编写的,所以运行环境需要安装jdk: 前期准备工作: 1.两个数据库,一主一从,主从同步: master: 172.22.10.237:3306 :主库负责写入操作: slave: 10.4.66.58

  • 详解如何使用Docker快速部署ELK环境(最新5.5.1版本)

    在Linux服务器上安装Docker以后,Pull相关的官方Docker镜像: docker pull docker.elastic.co/elasticsearch/elasticsearch:5.5.1 docker pull docker.elastic.co/kibana/kibana:5.5.1 docker pull docker.elastic.co/logstash/logstash:5.5.1 启动Elastic Search容器: docker run -p 9200:920

  • 详解如何用webpack4从零开始构建react开发环境

    项目文件准备: 执行npm init,然后创建如下图所示的文件. 在index.html里面添加 <!DOCTYPE html> <html> <head> <title>The Minimal React Webpack Babel Setup</title> </head> <body> <div id="app"></div> <script src="./

  • 详解用Docker构建MySQL主从环境

    前言 本篇文章记录我使用 docker-compose 以及 dockerfile 来构建基于 binlog 的 MySQL 主从环境.如果你严格按照文中的步骤进行配置,相信很快就可以搭建好一个基础的 MySQL 主从环境. 介绍 MySQL 主从同步分为 3 个步骤: master 节点将数据的更新记录写到 binary log 中. slave 节点开启 IO 线程连接 master 节点,请求获取指定 binary log 文件的指定位置之后的日志. master 节点的 binary l

  • 详解如何利用GORM实现MySQL事务

    目录 前言 禁用默认事务 自动事务 手动事务 嵌套事务 SavePoint.RollbackTo 小结 前言 为了确保数据一致性,在项目中会经常用到事务处理,回滚操作还是比较常见的需求:事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部都执行,要么全不执行,对于MySQL事务相信大家应该都不陌生,这篇文章主要总结一下在Go语言中Gorm是如何实现事务的:感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助. 禁用默认事务 gorm事务默认是开启的.为了确保数据一致性,Gorm会在事务

  • 详解如何利用Xtrabackup进行mysql增量备份

    目录 利用Xtrabackup进行mysql增量备份 安装 设置数据库用于备份账户 全量备份 增量备份 提问总结 原理 为什么最后一次增量备份不用 "--apply-log-only" 为什么备份完后要准备备份 "prepare" 为什么选择这个做备份? 利用Xtrabackup进行mysql增量备份 现在xtrabackup版本升级到了8.0,但是只对mysql8.0才有支持, 我们这还是使用2.4, 但是2.4相比之前的2.1有了比较大的变化:innobacku

  • 详解如何利用Nodejs构建多进程应用

    目录 前言 进程的创建和使用 多核利用率 创建子进程 进程间通信 IPC 总结 前言 JavaScript 主线程运行在单个进程的单个线程上.这样做的好处是: 程序状态是单一的,在没有多线程的情况下没有锁.线程同步问题, 操作系统在调度时因为较少上下文的切换,可以很好地提高CPU的使用率. 但是单进程单线程并非完美的结构,一旦线程中某段代码发生异常阻塞,会阻塞代码执行而浪费资源.同时,如今CPU基本均是多核的,服务器往往还有多个CPU. 因此 Nodejs 不可避免的面临两个问题:如何充分利用多

  • 详解使用create-react-app快速构建React开发环境

    最近在折腾react开发,总结一个react环境搭建的教程,写得比较细碎,基本上就是自己的搭建步骤了,希望能够帮助到有需要的小伙伴. 常用的脚手架 react-boilerplate react-redux-starter-kit create-react-app(git上关注量最大) 使用 create-react-app 快速构建 React 开发环境 create-react-app 是来自于 Facebook,通过该命令我们无需配置就能快速构建 React 开发环境. create-re

随机推荐