一文教会你在Docker容器中实现Mysql主从复制

目录
  • 一 主从复制概念
  • 二 主从复制的优势
  • 三 Docker容器实现Mysql主从复制
    • 3.1 创建主服务器容器
    • 3.2 新建主配置文件 my.cnf
    • 3.3 重启master容器实例
    • 3.4 进入mysql-master容器
    • 3.5 在主服务器中创建用户并授权
    • 3.6 创建从服务器容器
    • 3.7 新建主配置文件 my.cnf
    • 3.8 重启slave容器实例
    • 3.9 在主数据库中查看主从同步状态
    • 3.10 进入mysql-slave容器
    • 3.11 在从数据库中配置主从复制
    • 3.12 在从数据库中查看主从同步状态
    • 3.13 在从数据库中开启主从同步
    • 3.14 查看从数据库状态是否同步
    • 3.15 主从复制测试
  • 总结

一 主从复制概念

在数据库中主从复制``表示有一个主数据库,多个从数据库,即,主数据库对外提供读写功能,从数据库对外提供读的功能。
Mysql默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以实时在远端进行。

二 主从复制的优势

  • 高可用,可用于故障切换,如果主库挂了,则可以切到从库
  • 读写分离,减少主库压力,从而提高性能,主库负责写,从库负责读
  • 可备份数据,避免影响业务

三 Docker容器实现Mysql主从复制

下面开始进入实战环节,一步步的教大家如何搭建主从数据库,小伙伴赶快练习一下吧。

3.1 创建主服务器容器

主服务器端口号为3307

docker run -p 3307:3306 --name mysql-master \
-v /Users/zengzhaoxia/mydata/mysql-master/log:/var/log/mysql \
-v /Users/zengzhaoxia/mydata/mysql-master/data:/var/lib/mysql \
-v /Users/zengzhaoxia/mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

创建完成之后,别忘记再 docker ps一下,确保是否创建成功

补充:如果MYSQL_ROOT_PASSWORD的密码设置为root,当登录数据库时可能会报和权限相关的错误,所以,不妨将密码改为数字试试,比如123456。

3.2 新建主配置文件 my.cnf

进入/mydata/mysql-master/conf目录下新建my.cnf,my.cnf 内容如下:

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
##指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间,默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062 错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

切记切记,此处一定是 [mysqld],不要写成了[mysql]。

3.3 重启master容器实例

因为第二步修改了配置文件,所以需要重启docker容器

docker restart mysql-master
docker ps

3.4 进入mysql-master容器

进入mysql-master容器,并登录数据库,可以看到当前有哪些默认的数据库。

docker exec -it mysql-master /bin/bash
mysql -uroot -p
show databases;

3.5 在主服务器中创建用户并授权

##1. 建立用户
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
##2. 授权
mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';

3.6 创建从服务器容器

从服务器容器的端口号为:3308

docker run -p 3308:3306 --name mysql-slave \
-v /Users/zengzhaoxia/mydata/mysql-slave/log:/var/log/mysql \
-v /Users/zengzhaoxia/mydata/mysql-slave/data:/var/lib/mysql \
-v /Users/zengzhaoxia/mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

创建完成之后,别忘记再 docker ps一下,确保是否创建成功

3.7 新建主配置文件 my.cnf

进入/mydata/mysql-slave/conf目录下新建my.cnf,my.cnf内容如下:

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
##指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能,以备slave作为其他数据库实例的master时使用
log-bin=mall-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间,默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062 错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave 设置为只读(具有super权限的用户除外)
read_only=1

3.8 重启slave容器实例

因为修改了配置,所以需要重启 slave 实例

docker restart mysql-slave
docker ps

3.9 在主数据库中查看主从同步状态

在主服务器中输入如下命令:

mysql> show master status;

3.10 进入mysql-slave容器

docker exec -it mysql-slave /bin/bash

3.11 在从数据库中配置主从复制

change master to master_host='100.100.32.185',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000002',master_log_pos=617,master_connect_retry=30;

其中,

字段 含义
master_host 主数据库的IP地址
master_port 主数据库的运行端口
master_user 在主数据库创建的用于同步数据的用户账号
master_password 在主数据库创建的用于同步数据的用户密码
master_log_file 指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取file参数
master_log_pos 指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数
master_connect_retry 连接失败重试的时间间隔,单位为秒

3.12 在从数据库中查看主从同步状态

mysql> show slave status \G;
## 加入 \G表示 竖排以键值对的形式显示,主要观察Slave_IO_Running和Slave_SQL_Running

3.13 在从数据库中开启主从同步

在从数据库中操作,表示从数据库同意接收数据

start slave;

3.14 查看从数据库状态是否同步

show slave status \G;

3.15 主从复制测试

验证主要分为两步,第一步在主数据库中创建数据,第二步在从数据库中查看数据。

1. 在主数据库中新建数据库db01,并在db01中新建表t1,并插入数据
create database db01;
use db01;
create table t1(id int,name varchar(20));
insert into t1 values(1,'zeng');

2. 在从数据库中查询
show databases;//会看到db01数据库
use db01;
select * from t1;

总结

到此这篇关于在Docker容器中实现Mysql主从复制的文章就介绍到这了,更多相关Docker容器实现Mysql主从复制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于Docker的MySQL主从复制环境搭建的实现步骤

    1. 前言 之前的程序架构可能是这样的一种形式: 当程序体量扩大后,我们进行扩展,可能会扩展多个后台服务实例,但数据库还是只有一个,所以系统的瓶颈还是在数据库上面,所以这次的主要任务就是对数据库进行扩展,主要形式为:扩展多台数据库实例,实现读写分离,对于一些写的任务分配到主数据库,对于读的任务使用子数据库进行读取.从而提高系统性能. 修改后的架构如下所示: 2. 环境预搭建 这次使用docker来进行这个环境的搭建,使用MySQL版本为5.7.13. docker pull mysql:5.7.

  • 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主从复制的示例代码

    目录 一.概述 1.原理 2.实现 三.创建Slave实例 四.主从配置 总结: 五.参考 一.概述 1.原理 master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中: slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启

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

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

  • 基于Docker如何实现MySQL主从复制详解

    前言 MySQL的主从复制是实现应用的高性能,高可用的基础.对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同MySQL服务器,可有效减轻数据库压力.当遇到MySQL单点故障中,也能在短时间内实现故障切换.本文就MySQL的内建的复制功能进行阐述. 版本 MySQl: 5.7.17 CentOS: 7.4.1708 Docker: 1.13.1 概述 MySQL复制数据流程: 主库在数据更新提交事务之前,将事件异步记录到binlog二进制日志文件中,日志记录完成后存储引擎提交本次事

  • 使用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

  • 详解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搭建MySQL5.7主从复制的实现

    目录 1.新建mysql-master主服务器容器实例3307 2.新建mysql-master主服务器配置文件my.cnf 3 重启master实例 4 进入mysql-master容器 5 master容器实例内创建数据同步用户 6 新建mysql-slave从服务器实例3308 7 进入/usr/local/mysql-slave/conf目录下新建my.cnf 8 修改完配置后重启slave实例 9 在主数据库中查看主从同步状态 10 进入mysql-slave容器 11 在从数据库中配

  • Docker上部署mysql8主从复制的实现

    目录 环境准备 简易版本安装 设置密码 配置 MySQL 主从复制 创建 bridge 网络并指定 IP 区间 创建数据和配置存放目录 准备配置文件 启动数据库 远程访问配置(主从) 主库创建复制用户 从库设置 master 的信息 环境准备 需要一个 MySQL8 版本的 MySQL,因为我个人没有用过 mysql5,不知道二者是否会有一些特性上的偏差. 默认你与我的环境是一样的. 简易版本安装 先仅仅安装一个 MySQL,一上来就主从的话很多细节都会杂糅在一起. docker run -d

  • 一文教会你在Docker容器中实现Mysql主从复制

    目录 一 主从复制概念 二 主从复制的优势 三 Docker容器实现Mysql主从复制 3.1 创建主服务器容器 3.2 新建主配置文件 my.cnf 3.3 重启master容器实例 3.4 进入mysql-master容器 3.5 在主服务器中创建用户并授权 3.6 创建从服务器容器 3.7 新建主配置文件 my.cnf 3.8 重启slave容器实例 3.9 在主数据库中查看主从同步状态 3.10 进入mysql-slave容器 3.11 在从数据库中配置主从复制 3.12 在从数据库中查

  • 详解如何在 docker 容器中捕获信号

    我们可能都使用过 docker stop 命令来停止正在运行的容器,有时可能会使用 docker kill 命令强行关闭容器或者把某个信号传递给容器中的进程.这些操作的本质都是通过从主机向容器发送信号实现主机与容器中程序的交互.比如我们可以向容器中的应用发送一个重新加载信号,容器中的应用程序在接到信号后执行相应的处理程序完成重新加载配置文件的任务.本文将介绍在 docker 容器中捕获信号的基本知识. 信号(linux) 信号是一种进程间通信的形式.一个信号就是内核发送给进程的一个消息,告诉进程

  • 在Docker容器中使用iptables时的最小权限的开启方法

    在Docker容器中使用iptables时的最小权限的开启方法 Dcoker容器在使用的过程中,有的时候是需要使用在容器中使用iptables进行启动的,默认的docker run时都是以普通方式启动的,没有使用iptables的权限,那么怎样才能在容器中使用iptables呢?要如何开启权限呢? 那么在docker进行run的时候如何将此容器的权限进行配置呢?主要是使用--privileged或--cap-add.--cap-drop来对容器本身的能力的开放或限制.以下将举例来进行说明: 例如

  • 在Docker容器中不需要运行sshd的原因浅析

    当开始使用Docker时,人们经常问:"我该如何进入容器?",其他人会说"在你的容器里运行一个SSH服务器".但是,从这篇博文中你将会了解到你根本不需要运行SSHd守护进程来进入你的容器.当然,除非你的容器就是一个SSH服务器. 运行SSH服务器是很想当然的,因为它提供了进入容器的简便方式.在我们公司基本上每个人都最少使用过一次SSH.我们中有很大一部分人每天都会使用它,并且他们很熟悉公钥与私钥,无密码登录,密钥代理,甚至有时会使用端口转发和其他不常用的功能.正因如

  • 详解挂载运行的docker容器中如何挂载文件系统

    前言 感觉最近很多人都在问docker相关的问题,关于怎么操作一个已经启动的docker容器的文件系统,首先我发现这非常困难,因为 mnt的命名空间. 为了登录进入一个已经启动的docker容器,我们需要这么做: 使用nsenter来在临时挂载点上挂载整个docker容器的文件系统. 创建一个特定目录的绑定挂载来当作卷来使用. 卸载临时挂载. 好吧,开始实践. 启动一个名为charlie的docker实例: $ docker run --name charlie -ti ubuntu bash

  • 详解docker 允许主机ssh连接到docker容器中

    在docker容器中,安装好ssh: 1)替换掉容器中的安装源为163源 2)安装ssh服务 apt-get update apt-get install openssh-server 3)添加目录,修改ssh配置文件 mkdir -p /var/run/sshd vim /etc/pam.d/sshd 找到 session    required     pam_loginuid.so 这一行,将它注释掉 4)添加要链接过来的主机公钥 将公钥放到/root/.ssh/authorized_ke

  • docker容器中crontab无法正常运行解决方案

    相信很多人看完docker容器, 需要加crontab, 加完却发现不能执行,心塞.....接着便开始各种折腾... 首先当然是看日志了, 发现/var/log 下面没有任何信息, 那是因为你没有打开rsyslog. # /etc/init.d/rsyslog start 继续看日志 # tail /var/log/crond Dec 29 16:39:01 web01-50794 crond[2839]: (root) FAILED to open PAM security session (

  • Docker容器中运行flume及启动不输出运行日志问题

    flume配置文件如下: # Name the components on this agent app1.sources = r1 app1.sinks = k1 app1.channels = c1 # Describe/configure the source app1.sources.r1.type = avro app1.sources.r1.bind = 0.0.0.0 app1.sources.r1.port = 44444 # Describe the sink #a1.sink

  • 如何隔离docker容器中的用户的方法

    笔者在前文<理解 docker 容器中的 uid 和 gid>介绍了 docker 容器中的用户与宿主机上用户的关系,得出的结论是:docker 默认没有隔离宿主机用户和容器中的用户.如果你已经了解了 Linux 的 user namespace 技术(参考<Linux Namespace : User>),那么自然会问:docker 为什么不利用 Linux user namespace 实现用户的隔离呢?事实上,docker 已经实现了相关的功能,只是默认没有启用而已.笔者将在

  • 详解如何将Spring Boot应用跑在Docker容器中

    日常的Rest服务开发我都会首选SpringBoot,因为它本身的易用性以及自带的各种方便功能.生态等,今天就简单讲一下如何将Spring Boot应用跑在Docker容器中 项目搭建 首先打开Idea,选择初始化一个Spring Boot应用,然后一路回车下去,待Idea下载完依赖,开始编码 这里写一个简单的接口: @RestController @SpringBootApplication public class DemoApplication { @GetMapping("/hello&

随机推荐