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

1. 前言

之前的程序架构可能是这样的一种形式:

当程序体量扩大后,我们进行扩展,可能会扩展多个后台服务实例,但数据库还是只有一个,所以系统的瓶颈还是在数据库上面,所以这次的主要任务就是对数据库进行扩展,主要形式为:扩展多台数据库实例,实现读写分离,对于一些写的任务分配到主数据库,对于读的任务使用子数据库进行读取。从而提高系统性能。

修改后的架构如下所示:

2. 环境预搭建

这次使用docker来进行这个环境的搭建,使用MySQL版本为5.7.13。

docker pull mysql:5.7.13

整体结构为:

  • 1个master主节点,作为写的节点。
  • 2个slave从节点,作为读的节点。

先分别将这几个节点启动,映射到不同的端口。在本机使用数据库连接工具连接,测试是否正常启动且正常连接。

docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
docker run -p 3308:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
docker run -p 3309:3306 --name mysql-slave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13

我这里分别将主节点(mysql-master)映射为3307端口,两个从节点(mysql-slave1,2)分别为33083309端口。然后设置MySQL的root密码为123456

然后可以使用navicat等工具连接测试MySQL。

分别进入这几个节点,编辑配置文件。

docker exec -it mysql-master /bin/bash

我使用的是name来进入容器,也可以根据id来选择,即docker exec -it 对应容器的id /bin/bash

由于没有预先安装vivim程序,然后要下载时需要执行apt update命令,这时会从国外源进行下载。由于众所周知的原因,速度很慢。我就将下载源更改为国内源。

进入到/etc/apt文件夹中,首先将原有的文件进行备份:

mv sources.list sources.list.bak

然后使用如下命令新建文件并输入内容:

echo deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse > sources.list

然后我们再执行apt update等操作,最后安装vim即可。

3. 进行主从配置

主节点(master)配置

进入主节点容器后,进入/etc/mysql文件夹中,会有一个my.cnf文件,主要对它进行修改。

编辑这个文件,找到[mysqld],在这个下面添加如下命令:

[mysqld]
...
...
## 唯一的编号
server-id=101
## 这个是关键配置项
log-bin=mysql-bin

配置完成后,需要重启MySQL服务使配置生效。使用service mysql restart命令进行重启,重启完成后会关闭MySQL的容器,我们还要重启容器docker restart mysql-master

从节点(slave)配置

同主节点一样,编辑/etc/mysql/my.cnf文件

[mysqld]
...
...
## 唯一的编号
server-id=103
## 选,如果需要将该节点作为其他节点的主节点则需要添加
# log-bin=mysql-bin

链接主节点和从节点

主节点

在主节点容器中进入MySQLmysql -u root -p,密码就是启动容器时设置的123456

进入MySQL后执行show master status;

从这里我们得到两个信息FilePosition的值,我这里分别是mysql-bin.000001154

从节点

进入MySQL,执行如下的命令:

change master to master_host='***', master_port=3306, master_user='root', master_password='123456', master_log_file='****', master_log_pos= ***;

分别解释一下这几个参数代表的意思:

master_host:主节点的ip地址,可以在本机使用中如下命令来查看容器的ip地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id

master_port:mysql的端口号,不是对外映射的端口号

master_user:mysql中的用户,要有权限,我直接使用了root,也可以新建用户来使用

master_password:用于同步的mysql帐户密码

master_log_file:用于同步的文件,就是从主节点查询到的文件,我这里是mysql-bin.000001

master_log_pos:binlog文件开始同步的位置, 就是从主节点查询到的位置,我这里是154

执行刚刚的命令后在MySQL终端执行show slave status \G;来查看主从同步状态。

我们可以从这里查看配置的信息来进行核查,然后可以看到两个属性slave_io_runningslave_sql_running都是no,也就是关闭状态。

我们可以执行start slave来开启主从复制,执行后再次执行show slave status \G;命令可以看到两个属性都变成了yes,则说明主从复制已经开启。

如果启动未成功,我们可以检查网络是否连通,同步用到的mysql密码是否正确,还有就是同步文件名称和位置是否正确!

测试

我们可以在主库中新建一个数据库,到从库中如果看到这个库的存在就表示主从同步完成。

4. 级联配置

我想再加一个备份节点,并且这个节点是从slave1节点进行备份的,也就是slave1节点作为backup节点的主节点。这就构成了master->slave->backup这样一个级联关系。

我本来是按照上面的步骤,先在slave的my.cnf中添加了

log-bin=mysql-slave-bin #为了区分,我对文件名进行了修改

接着在backup节点执行的

change master to master_host='***', master_user='root', master_password='123456', master_port=3306, master_log_file='****', master_log_pos= ***;

命令换成对应slave节点的ip等属性。结果发现不行。在主节点有更改后,备份节点并没有变更!

于是我开始了排查,发现在slave节点中的binlog文件并没有更改信息的记录,而backup节点相当于监听这个文件变更,这个文件没有变更所以backup节点也就不会有更改。这里延伸一点,mysql的binlog记录了我们所有更改的操作,所以理论上我们可以通过binlog来恢复任一时间刻的数据库内容。

于是问题就转变成,主节点变更后如何让从节点的binlog日志有记录。

我们可以在编辑my.cnf文件时再添加一行:log_slave_updates=1即可,让slave在接到master同步后也将二进制日志写到自己的binlog中。

这样就可以完成,主节点进行更改后,从节点和备份节点都会进行变更,备份节点的数据是从从节点备份过去的。

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

(0)

相关推荐

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

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

  • 使用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服务器,可有效减轻数据库压力.当遇到MySQL单点故障中,也能在短时间内实现故障切换.本文就MySQL的内建的复制功能进行阐述. 版本 MySQl: 5.7.17 CentOS: 7.4.1708 Docker: 1.13.1 概述 MySQL复制数据流程: 主库在数据更新提交事务之前,将事件异步记录到binlog二进制日志文件中,日志记录完成后存储引擎提交本次事

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

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

  • 基于Docker的Mysql主备搭建的实现步骤

    目录 前期规划: 配置过程: Docker mysql主从配置.我们会在一台centos的虚拟机上,配置mysql主备 前期规划: docker mysql版本 mysql:5.7 docker网络配置,我们会创建名称为mysql的网络,子网掩码为 172.88.0.0/16 docker mysql主对应的容器名称:mysql-master, ip地址:172.88.0.11,映射端口:3307,文件卷配置(配置文件和数据文件持久化)mysql配置文件地址:/usr/local/docker/

  • 基于Docker部署GitLab环境搭建的方法步骤

    注意:建议虚拟机内存2G以上,一定要配置阿里云的加速镜像 1.下载镜像文件 docker pull beginor/gitlab-ce:11.0.1-ce.0 2.创建GitLab 的配置 (etc) . 日志 (log) .数据 (data) 放到容器之外, 便于日后升级 mkdir -p /mnt/gitlab/etc mkdir -p /mnt/gitlab/log mkdir -p /mnt/gitlab/data 3.运行GitLab容器 进入/mnt/gitlab/etc目录,运行一

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

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

  • Docker+K8S 集群环境搭建及分布式应用部署

    1.安装docker yum install docker #启动服务 systemctl start docker.service systemctl enable docker.service #测试 docker version 2.安装etcd yum install etcd -y #启动etcd systemctl start etcd systemctl enable etcd #输入如下命令查看 etcd 健康状况 etcdctl -C http://localhost:2379

  • 基于XML的MyBatis的环境搭建过程详解(IDEA)

    基于XML的MyBatis的环境搭建(IDEA) 主要步骤可概括为创建一个Maven导入依赖编写你一个你需要的实体类和一个持久层接口编写一个SqlMapConfig.xml编写映射配置文件编写测试类测试 学习了黑马的mybatis第一天总结 主要步骤可概括为 创建一个Maven 这里选择maven,然后直接点击next 填入自己的工程名,点击Finish,一个maven工程就创建好了. 导入依赖 在pom.xml中,导入需要的依赖. 编写你一个你需要的实体类和一个持久层接口 以User为了(为了

  • 基于Docker的PHP调用基于Docker的Mysql数据库

    docker简介: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 自从接触docker以来,一直想实现这种玩法.如下是步骤 1:建立基于docker的mysql,参考文章 Mac上将brew安装的MySql改用Docker执行 2:建立基于docker的php image 在当前目录,建立Dockerfile,内容如下 FROM php

  • docker实现mysql主从复制的示例代码

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

  • 基于Docker实现Redis主从+哨兵搭建的示例实践

    目录 1.拉取镜像 2. 编写主 从配置文件 2.1 创建/home/redis/redis_conf目录: 2.2 编写主配置文件 2.3 编写从配置文件 2.4  编写从配置文件 3 编写sentinel配置文件 3.1创建哨兵配置文件 3.2编写哨兵配置文件 4  启动主节点容器 4.1启动主节点容器 4.2 启动从节点容器 5 存在的问题: 6.分别启动每个  docker容器里面的哨兵 6.1进入主节点容器 6.2查看文件 6.3启动主哨兵服务 6.4 启动两个从哨兵服务 6.5进入主

随机推荐