在学习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= -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= -d mysql:5.6.
docker run --name slave -v /etc/slave.cnf:/etc/mysql/my.cnf -v $SLAVE_DIR:/var/lib/mysql --net=host -e MYSQL_ROOT_PASSWORD= -d mysql:5.6.
## Creating a User for Replication
docker stop master slave
docker start master slave sleep 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 ];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.

-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= -d mysql:5.6.

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

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

docker stop master slave
docker start master slave sleep

设置快捷键

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

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

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

如何利用docker快速构建MySQL主从复制环境的更多相关文章

  1. 利用Docker快速部署Mysql

    写在前面 我又来更新了~~~,今天内容较少,主要是利用Docker快速部署Mysql和初始化数据 利用Docker下载Mysql 简洁明了,在命令提示符中输入 docker pull mysql:8. ...

  2. 9. 利用Docker快速构建MGR | 深入浅出MGR

    目录 1.安装Docker 2.拉取GreatSQL镜像,并创建容器 2.1 拉取镜像 2.2 创建新容器 2.3 容器管理 3.构建MGR集群 3.1 创建专用子网 3.2 创建3个新容器 3.3 ...

  3. 如何利用 docker 快速部署 Mysql 服务

    docker 基础教程不再多说,这里只着重讲如何使用 docker 部署 mysql 服务 docker 拉取 访问 dockerhub,搜索关键词 mysql,我这里选择 mysql-server, ...

  4. 一文教您如何通过 Docker 快速搭建各种测试环境(Mysql, Redis, Elasticsearch, MongoDB) | 建议收藏

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  5. 用前端姿势玩docker【四】基于docker快速构建webpack的开发与生产环境

    目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...

  6. Docker实战之MySQL主从复制

    前言 曾几何时,看着高大上的架构和各位前辈高超的炫技,有没有怦然心动,也想一窥究竟?每当面试的时候,拿着单应用的架构,吹着分库分表的牛X,有没有心里慌的一批? 其实很多时候,我们所缺少的只是对高大上的 ...

  7. 使用Docker快速搭建PHP开发环境

    最近有个同事找过来,希望我对在很早之前写的一个PHP网站上增加一些功能,当时开发使用xampp构建的本地开发环境,但是现在我的笔记本电脑已经更新,没有当时的开发环境.本着尽量不往电脑上装无用软件的原则 ...

  8. Docker-教你如何通过 Docker 快速搭建各种测试环境

    今天给大家分享的主题是,如何通过 Docker 快速搭建各种测试环境,本文列举的,也是作者在工作中经常用到的,其中包括 MySQL.Redis.Elasticsearch.MongoDB 安装步骤,通 ...

  9. 2.快速部署MySQL主从复制

      1.快速部署MySQL主从复制 [root@mysql ~]# mysql -uroot -p123456 -S /data/3307/mysql.sock -e "show slave ...

随机推荐

  1. 递归添加 另一个ds 里的DataRow 时 报错:该行已经属于另一个表。

    public void create_tree(DataSet ds, int parentid)        { DataSet newds = new DataSet();            ...

  2. css清除浮动大全,共8种方法

    我看的网页的网址:http://hi.baidu.com/kongcheng2012/item/2b1250d4452e802538f6f705 为什么浮动这么难? 因为浮动会使当前标签产生向上浮的效 ...

  3. firefox 28.0

    Ubuntu 安装 firefox 28.0指令: apt-cache show firefox | grep Version sudo apt-get install firefox=28.0+bu ...

  4. PHP数组函数的分组归纳

    统计: array_count_values     统计数组中所有的值出现的次数 array_product         计算数组中所有值的乘积 array_sum         计算数组中所 ...

  5. 兼容ie6及以上的表格行滑过时背景色切换的效果

    ;(function(window){    var tb = document.getElementById('tablelist');    function trfocus(){//为了兼容IE ...

  6. php 显示sqlserver二进制图片

    <? header("Content-type:image/ "); // Server in the this format: \ or // , when using a ...

  7. js原生之设计模式开篇介绍

    本文主要讲述一下,什么是设计模式(Design pattern),作为敲键盘的我们要如何学习设计模式.设计模式真的是一把万能钥匙么?     各个代码的设计模式几乎每个人都知晓,就算不会那也一定在一些 ...

  8. FMS用AS来实现拉流

    application.onAppStart=function (){ this.myNC=new NetConnection(); this.myNC.onStatus=NC_onStatus; t ...

  9. HTML5获取当前的经纬度坐标

    使用IE10可以查看出结果:chrome和ff都没有正确显示: <!DOCTYPE html> <html lang="en"> <head> ...

  10. loadrunner:web services接口测试

    本文以实例讲解web services接口测试操作,内容包括:脚本生成.参数化和接口与接口间的取值关联操作. 网站"http://www.webxml.com.cn/zh_cn/web_se ...