作者:王少鹏(老A),中国开源协会(oscna.org)数据库分会成员,现就职于上海某MySQL数据库厂商。

本文来源:鸡书之家(dbawsp.com)出品,转载请注明来源,谢谢。


运维经常要和数据库打交道,尤其是MySQL,以前的方式是在本机装个MySQL或者MySQL主从复制架构用于本地调试,但有了docker以后就不需要再去繁琐的安装MySQL啦(虽然安装MySQL也不是很麻烦),直接在docker中启几个MySQL容器就可以自动建立主从复制关系了。

1. 安装docker与docker-compose

# 卸载老版本docker
[root@docker ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine[root@docker ~]# yum -y install epel-release wget
[root@docker ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@docker ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
[root@docker ~]# yum -y install docker-ce# 启动并配置镜像加速
[root@docker ~]# systemctl start docker.service && systemctl enable docker.service[root@docker ~]# cat /etc/docker/daemon.json
{"registry-mirrors": ["https://registry.docker-cn.com"]
}或者{"registry-mirrors": ["https://dockerhub.mirrors.nwafu.edu.cn/"],"storage-driver":"devicemapper"
}[root@docker ~]# systemctl restart docker.service
  • 安装docker-compose
[root@docker ~]# curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@docker ~]# chmod +x /usr/local/bin/docker-compose
[root@docker ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

2. 先决条件

[root@docker ~]# docker pull mysql:5.7.30[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7.30              a4fdfd462add        10 hours ago        448MB[root@docker ~]# mkdir -p /data/mysql/master/{conf,data}
[root@docker ~]# mkdir -p /data/mysql/slave/conf
[root@docker ~]# mkdir -p /data/mysql/{init-db-m,init-db-s}
[root@docker ~]# chown -R mysql.mysql /data/mysql# 主库的创建用户SQL脚本
[root@docker ~]# cat /data/mysql/init-db-m/create_user_1.sql
grant all on *.* to 'dumpuser'@'%' identified by '123456';
grant replication slave on *.* to 'repl'@'%' identified by '123456';# 从库远程备份主库及创建主从通道Bash脚本
[root@docker ~]# cat /data/mysql/init-db-s/dump-repl_1.sh
#!/bin/bash
while ! mysql -uping -p123456 -hmysql_m_compose -P3306 -e "select 1"
dosleep 1
done
sleep 3mysqldump -udumpuser -p123456 -hmysql_m_compose -P3306 --single-transaction --default-character-set=utf8mb4 --set-gtid-purged=on --master-data=2 --flush-logs --hex-blob --triggers --routines --events --all-databases > /tmp/full.sqlmysql -uroot -p123456 -e "reset master;"mysql -uroot -p123456 -e "source /tmp/full.sql;"mysql -uroot -p123456 -e "CHANGE MASTER TO MASTER_HOST='mysql_m_compose',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_CONNECT_RETRY=10,MASTER_AUTO_POSITION=1;"mysql -uroot -p123456 -e "start slave;"

3. 创建主从配置文件

# mysql_m_compose节点
[root@docker ~]# cat /data/mysql/master/conf/my.cnf
[mysqld]
server_id = 33060000
port = 3306
log_timestamps=SYSTEM
max_allowed_packet = 16M
read_only = 0
character_set_server = utf8mb4
secure_file_priv = ""
max_connect_errors = 100000
interactive_timeout = 1800
wait_timeout = 1800# BINLOG
log_bin = mysql-bin
binlog_format = row
log_slave_updates = 1
max_binlog_size = 200M
relay_log = relay-bin
sync_binlog = 1# GTID
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_gtid_simple_recovery = 1# ENGINE
default_storage_engine = InnoDB
innodb_flush_log_at_trx_commit=1# ----------------------------------------------------------------------------------------------------------------------# mysql_s_compose节点
[root@docker ~]# cat /data/mysql/slave/conf/my.cnf
[mysqld]
server_id = 33060001
port = 3306
log_timestamps=SYSTEM
max_allowed_packet = 16M
read_only = 0
character_set_server = utf8mb4
secure_file_priv = ""
max_connect_errors = 100000
interactive_timeout = 1800
wait_timeout = 1800# BINLOG
log_bin = mysql-bin
binlog_format = row
log_slave_updates = 1
max_binlog_size = 200M
relay_log = relay-bin
sync_binlog = 1# GTID
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_gtid_simple_recovery = 1# ENGINE
default_storage_engine = InnoDB
innodb_flush_log_at_trx_commit=1

4. 创建docker-compose.yml文件

  • 将init_sql下的文件映射到/docker-entrypoint-initdb.d目录下(注:/docker-entrypoint-initdb.d下以sqlsh结尾的文件会在数据库初始化完成后自动执行)
[root@docker ~]# cat /data/mysql/docker-compose.yml
version: '3'
services:mysql_m_compose:image: mysql:5.7.30container_name: mysql_mrestart: alwaysports:- 33061:3306environment:- MYSQL_USER=ping- MYSQL_PASSWORD=123456- MYSQL_ROOT_PASSWORD=123456volumes:- ./master/conf/my.cnf:/etc/my.cnf- ./master/data:/var/lib/mysql- ./init-db-m:/docker-entrypoint-initdb.dmysql_s_compose:image: mysql:5.7.30container_name: mysql_srestart: alwaysports:- 33062:3306depends_on:- mysql_m_composeenvironment:- MYSQL_ROOT_PASSWORD=123456volumes:- ./slave/conf/my.cnf:/etc/my.cnf- ./init-db-s:/docker-entrypoint-initdb.d

5. docker-compose启动mysql容器

[root@docker mysql]# docker-compose up -d
Creating network "mysql_default" with the default driver
Creating mysql_m ... done
Creating mysql_s ... done[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
35cc9c6fbf52        mysql:5.7.30        "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        33060/tcp, 0.0.0.0:33062->3306/tcp   mysql_s
53a04e176ecc        mysql:5.7.30        "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        33060/tcp, 0.0.0.0:33061->3306/tcp   mysql_m# 检查主从复制关系
# 主库
mysql_m> use db
Database changed
mysql_m> create table t1(id int,name varchar(32));
Query OK, 0 rows affected (0.01 sec)mysql_m> insert into t1 values(1,'aa'),(2,'bb'),(3,'cc');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql_m> select  * from db.t1;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
+------+------+
3 rows in set (0.00 sec)# 从库
mysql_s> select  * from db.t1;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
+------+------+
3 rows in set (0.00 sec)# 查看主从复制状态信息
mysql_s> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: mysql_m_composeMaster_User: replMaster_Port: 3306Connect_Retry: 10Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 194Relay_Log_File: relay-bin.000004Relay_Log_Pos: 367Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 194Relay_Log_Space: 568Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 33060000Master_UUID: f93b936b-9b6b-11ea-9bda-0242c0a82002Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set: f93b936b-9b6b-11ea-9bda-0242c0a82002:1-9Auto_Position: 1Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:
1 row in set (0.00 sec)

6. 销毁两个容器

[root@docker mysql]# docker-compose down
Stopping mysql_s ... done
Stopping mysql_m ... done
Removing mysql_s ... done
Removing mysql_m ... done
Removing network mysql_default
[root@docker mysql]# ll -sh /data/mysql/master/data/
total 192M
4.0K -rw-r----- 1 polkitd input 1.2K May 21 14:12 53a04e176ecc-slow.log
4.0K -rw-r----- 1 polkitd input   56 May 21 14:04 auto.cnf
4.0K -rw------- 1 polkitd input 1.7K May 21 14:04 ca-key.pem
4.0K -rw-r--r-- 1 polkitd input 1.1K May 21 14:04 ca.pem
4.0K -rw-r--r-- 1 polkitd input 1.1K May 21 14:04 client-cert.pem
4.0K -rw------- 1 polkitd input 1.7K May 21 14:04 client-key.pem0 drwxr-x--- 2 polkitd input   48 May 21 14:05 db
4.0K -rw-r----- 1 polkitd input 1.4K May 21 14:04 ib_buffer_pool76M -rw-r----- 1 polkitd input  76M May 21 14:12 ibdata148M -rw-r----- 1 polkitd input  48M May 21 14:12 ib_logfile048M -rw-r----- 1 polkitd input  48M May 21 14:04 ib_logfile112M -rw-r----- 1 polkitd input  12M May 21 14:04 ibtmp1
4.0K drwxr-x--- 2 polkitd input 4.0K May 21 14:04 mysql
4.0K -rw-r----- 1 polkitd input  177 May 21 14:04 mysql-bin.000001
7.9M -rw-r----- 1 polkitd input 7.9M May 21 14:04 mysql-bin.000002
4.0K -rw-r----- 1 polkitd input  241 May 21 14:04 mysql-bin.000003
4.0K -rw-r----- 1 polkitd input  887 May 21 14:12 mysql-bin.000004
4.0K -rw-r----- 1 polkitd input   76 May 21 14:04 mysql-bin.index12K drwxr-x--- 2 polkitd input 8.0K May 21 14:04 performance_schema
4.0K -rw------- 1 polkitd input 1.7K May 21 14:04 private_key.pem
4.0K -rw-r--r-- 1 polkitd input  452 May 21 14:04 public_key.pem
4.0K -rw-r--r-- 1 polkitd input 1.1K May 21 14:04 server-cert.pem
4.0K -rw------- 1 polkitd input 1.7K May 21 14:04 server-key.pem12K drwxr-x--- 2 polkitd input 8.0K May 21 14:04 sys[root@docker mysql]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

7. 重建MySQL容器

[root@docker mysql]# docker-compose up -d
Creating network "mysql_default" with the default driver
Creating mysql_m ... done
Creating mysql_s ... done[root@docker mysql]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
7cd912fa9721        mysql:5.7.30        "docker-entrypoint.s…"   8 seconds ago       Up 8 seconds        33060/tcp, 0.0.0.0:33062->3306/tcp   mysql_s
d9e3514a1e19        mysql:5.7.30        "docker-entrypoint.s…"   9 seconds ago       Up 8 seconds        33060/tcp, 0.0.0.0:33061->3306/tcp   mysql_m# 主库
mysql_m> select * from db.t1;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
+------+------+
3 rows in set (0.00 sec)# 从库
mysql_s> select * from db.t1;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
+------+------+
3 rows in set (0.01 sec)mysql_s> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: mysql_m_composeMaster_User: replMaster_Port: 3306Connect_Retry: 10Master_Log_File: mysql-bin.000006Read_Master_Log_Pos: 194Relay_Log_File: relay-bin.000004Relay_Log_Pos: 367Relay_Master_Log_File: mysql-bin.000006Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 194Relay_Log_Space: 568Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 33060000Master_UUID: f93b936b-9b6b-11ea-9bda-0242c0a82002Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set: f93b936b-9b6b-11ea-9bda-0242c0a82002:1-12Auto_Position: 1Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:
1 row in set (0.00 sec)

MySQL容器部署及数据持久化(主从复制)相关推荐

  1. 记录Docker安装Mysql容器,及其数据卷的配置

    1.进入Docker Hub Docker Hub Container Image Library | App Containerization 2.无需登录,左上角search搜索Mysql,带有O ...

  2. [Kubernetes] 在K8S上部署MySQL 8.0并数据持久化

    在K8S上安装MySQL 1.创建PV apiVersion: v1 kind: PersistentVolume metadata:name: model-db-pv spec:storageCla ...

  3. docker mysql volum_Docker --volume(数据持久化)

    数据卷 volume 数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定.数据卷 是被设计用来持久化数据的 第一种:bind mount vol ...

  4. Java mysql同步复制_MySQL数据的主从复制、半同步复制和主主复制详解

    一.MySQL复制概述 ⑴.mysql数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...

  5. docker 打包mysql_基于docker部署mysql的数据持久化问题

    本人最近在使用docker部署mysql时,在持久化mysql数据时遇到了一个有趣的问题,将排查过程及思考记录在这里,以备后查. 先简单描述下我遇到的问题:在mysql容器中创建了两个数据库,然后使用 ...

  6. docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别

    前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此 ...

  7. 【Docker】备份Docker镜像image、容器container、数据volume

    文章目录 镜像image备份 容器container备份 数据卷volume 基本操作 数据卷备份 reference 本意上想要了解一下 Docker 容器中 Volume 的备份,毕竟重要的数据都 ...

  8. docker中下载mysql容器实例(详细)

    简单版 第一步:查看mysql镜像 name                        镜像名字 description               描述 stars                ...

  9. 【云原生】阿里云ACK部署MySQL 数据持久化存储

    思路图 一.概述 ACK介绍 阿里云容器服务Kubernetes版(Alibaba Cloud Container Service for Kubernetes,简称容器服务ACK)是全球首批通过Ku ...

  10. 使用Docker部署MySQL(数据持久化),将mysql的数据映射到本机磁盘

    本文简述如何使用Docker部署mysql,同时持久化数据.我们会用到tutum-docker-mysql 这个项目来搭建一个mysql,省去重头写Dockerfile的时间. 首先我们将tutum- ...

最新文章

  1. 如何从一个表中选择另一个表中不存在的所有记录?
  2. shell 编程整合
  3. BZOJ-1008 越狱
  4. tkinter打开文件选择窗口
  5. apscheduler 绿色版
  6. 【招聘(北京武汉)】北京高远华信科技 .NET 高级工程师
  7. 面试必问系列之在浏览器中输入URL后到网页显示 其间发生了什么?
  8. 地平线机器人_地平线机器人CEO余凯:基于深度学习的自动驾驶之路
  9. 计算机相近专业有哪些,计算机相关的专业有哪些
  10. MySQL 快速删除大量解决方案
  11. python网络爬虫系列教程——Scrapy框架应用全解
  12. ACL2020 | 词向量性别偏见
  13. Unit Tests Tool - What is “Mock You” The introduction to moq #Reprinted#
  14. NYOJ a problem is easy
  15. Java 项目的实际开发过程
  16. 树莓派 摄像头 html5,视频演示如何给树莓派安装摄像头模块
  17. 2022年低压电工考试题模拟考试题库及模拟考试
  18. flutter BoxDecoration设置背景 image 报错:type ‘Image‘ is not a subtype of type ‘ImageProvider<Object> 解决方法
  19. 企业教育中的人工智能市场现状研究分析预测报告-
  20. css属性百分比参照物

热门文章

  1. android里面的USB功能----Host模式
  2. GNSS 5星16频
  3. 数据库驱动加载失败问题
  4. 2020年度十大高薪岗位出炉!程序员霸榜!
  5. 做一个略调皮的个人博客--菜单篇
  6. Hadoop研发工程师_岗位职责和技能要求
  7. 非线性微分方程的线性化
  8. 无人机倾斜摄影在矿山测量测绘中有哪些应用
  9. Android Fingerprint完全解析(二) :Fingerprint启动流程
  10. 利用adsl拨号服务器VPS构建代理IP池