Docker搭建MySQL主从复制(一主一从)

上一篇博客写了MYSQL主从复制原理 : MySQL(13)---MYSQL主从复制原理

这篇我们来写 Docker搭建MYSQL主从复制(一主一从)

一、Docker安装MYSQL

说明 系统为阿里云服务器,操作系统为CentOS7.6。MYSQL版本 8.0.22

1、安装Docker

sudo apt-get update
sudo apt install docker.io

2、拉取MySQL的镜像

# 没有指定版本代表拉取最新版本 目前这里最新的是8.0.22。如果想指定版本可以docker pull mysql:5.7 代表下载5.7版本
docker pull mysql

运行完以上命令之后,镜像就已经下载下来了,可以用 docker images 命令查看是否已经下载成功

3、第一次启动MySQL

docker run -p 3306:3306 --name MYSQL8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

参数说明

-p 3306:3306:  将容器内的3306端口映射到实体机3306端口
--name MYSQL8: 给这个容器取一个容器记住的名字
-e MYSQL_ROOT_PASSWORD=123456: docker的MySQL默认的root密码是随机的,这是改一下默认的root用户密码
-d mysql:latest: 在后台运行mysql:latest镜像产生的容器

之后的第二次启动直接用 docker start MYSQL8 即可。

4、连接navicat

新装了MYSQL8.0后再用navicat连接就会报2059的错误。上网查了发现是8.0之后MYSQL更改了密码的加密规则,只要在命令窗口把加密方法改回去即可。

1) 首先使用以下命令进入MySQL的Docker容器

# MYSQL8是上面启动的时候 为该容器起的名称
docker exec -it MYSQL8 bash

2)然后登录MySQL

#这里的密码就是上面设置的密码
mysql -uroot -p123456

3)最后运行以下SQL即可

alter user 'root'@'%' identified by '123456' password expire never;
alter user 'root'@'%' identified with mysql_native_password by '123456';
flush privileges;

这样就可以通过navicat工具连接当前数据库了。这里顺便看下当前MYSQL的版本,通过 select version();

明显可以看到当前MYSQL的版本是 8.0.22

注意 我这边Master库和Slave库不在同一个服务器,所以Slave安装MYSQL的步骤和Master一样就可以了。一定要记住Msater库和Slave库的MYSQL版本号要一致

二、配置Master和Slave

这里假设主从服务器的IP如下

1、配置Master

因为是通过Docker部署的MYSQL,所以要进入Docker内部修改MYSQL配置文件

# MYSQL8是上面启动的时候 为该容器起的名称
docker exec -it MYSQL8 bash

进入容器后,切换到 /etc/mysql 目录下,使用vim命令编辑 my.cnf 文件。

注意 此时用vim 命令会报 vim: command not found,因此我们需要在Docker内部安装vim工具。安装步骤推荐一篇博客:vi: command not found

在my.cnf添加如下配置

## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

添加完后保存,同时退出当前Docker容器。因为修改了配置文件,所以要重启下该MYSQL,这里重启下该Docker容器就好了。

#  MYSQL8是上面启动的时候 为该容器起的名称
docker restart MYSQL8

这个时候我们通过工具连接该MYSQL服务器,你可以通过navicat或者Sequel pro等等,连接登上后。

创建用户并授权

--为从库服务器 设置用户名和密码(表明从服务器的ip必须为47.00.00.02,账号为slave 密码123456
CREATE USER 'slave'@'47.00.00.02' IDENTIFIED BY '123456';
grant replication slave, replication client on *.* to 'slave'@'47.00.00.02'; --设置权限
flush privileges; --权限生效

至此,Master配置完成。

2、配置从库

和上面一样进入到 etc/mysql 路径,使用vim命令编辑 my.cnf 文件:

## 设置server_id,注意要唯一 和master也不能一样
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## 设置为只读,该项如果不设置,表示slave可读可写
read_only = 1

配置完成后也需要重启Docker容器。

#  MYSQL是上面启动的时候 为该容器起的名称
docker restart MYSQL8

3、开启Master-Slave主从复制

上面两步Master和Slave都配置成功了,而且Master也为Slave读取Master数据专门设置了一个账号,下面就来实现同步。

进入Master库

查看Master状态

--通过该命令可以查看master数据库当前正在使用的二进制日志及当前执行二进制日志位置
show master status

记住File和Position,后面Slave库会在这个文件这个位置进行同步数据。此时一定不要操作Master库,否则将会引起Master状态的变化,File和Position字段也将会进行变化。

进入Slave库

执行SQL

change master to
master_host='47.00.00.01',
master_user='slave',
master_password='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=156 ;

命令说明

master_host :Master库的地址,指的是容器的独立ip,可以通过:
master_port :Master的端口号,指的是容器的端口号(默认3306)
master_user :用于数据同步的用户
master_password :用于同步的用户的密码
master_log_file :指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos :从哪个 Position 开始读,即上文中提到的 Position 字段的值

使用start slave命令开启主从复制过程

start slave;  -- 顺便提供下其它命令 stop slave 停止slave。reset slave重启slave。 reset master重启master。

启动之后我们来看下有没有成功。

show slave status命令

从这张图很明显看出,对于Slave的两个线程都成功了,那就说明整个MYSQL主从搭建成功了。如果有一个为NO,那就需要到后面看错误日志,是什么原因出错了,解决下就好了。

Slave_IO_Running: 从服务器中I/O线程的运行状态,YES为运行正常
Slave_SQL_Running: 从服务器中SQL线程的运行状态,YES为运行正常

三、测试

这里简单做一个测试

1、只在Mater 创建一张User表

现在 只在Mater 创建一张User表,如果现在Slave也同样生成这张User表,那就说明成功了。

CREATE TABLE `user` (
`id` bigint NOT NULL COMMENT '主键',
`user_name` varchar(11) NOT NULL COMMENT '用户名',
`password` varchar(11) NOT NULL COMMENT '密码',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户表';

实际测试结果是成功的。

注意

这里如果我们先手动在Slave创建这张User表,然后再到Master创建User表那就出事情了。我们按照上面的步骤创建完后,去Slave通过 show slave status 查看

发现 SQL线程都变NO了。原因很简单,错误日志也说明了(Error 'Table 'user' already exists')。因为你在Master创建User表的SQL会记录到bin-log日志中,然后Slave

去读取这个操作,然后写入Slave中的时后发现这个SQL执行失败,因为你Slave已经存在该User表,然后这整个主从复制就卡在这里了。这是个很严重的问题。

所以一旦搭建主从复制成功,只要在Master做更新事件(update、insert、delete),不要在从数据做,否则会出现数据不一致甚至同步失败。

2、Master插入一条数据

INSERT INTO `user` (`id`, `user_name`, `password`, `create_time`)
VALUES
(0, '张三', '123456', '2020-11-25 04:29:43');

再去Slave数据库查看

发现从数据库已经写入成功了。

总结:在搭建的过程可能还有其它的问题出现 你只要在Slave服务器,通过show slave status,如果两个IO是否为YES就代表是否成功,如果有为NO的,

后面有字段说明是什么原因导致的,你再根据相关错误信息去查询下解决方案,那就可以了。

参考

1、Docker安装MySQL8.0

2、MySQL主从同步机制和同步延时问题追查

3、Docker搭建MySQL主从复制

别人骂我胖,我会生气,因为我心里承认了我胖。别人说我矮,我就会觉得好笑,因为我心里知道我不可能矮。这就是我们为什么会对别人的攻击生气。
攻我盾者,乃我内心之矛(33)

MySQL(14)---Docker搭建MySQL主从复制(一主一从)的更多相关文章

  1. Docker搭建MySQL主从复制

    Docker搭建MySQL主从复制 主从服务器上分别安装Docker 1.1 Docker 要求 CentOS 系统的内核版本高于 3.10 [root@localhost ~]# uname -r ...

  2. Docker搭建MySQL的PXC集群

    原文:Docker搭建MySQL的PXC集群 一.简介 PXC属于一套近乎完美的mysql高可用集群解决方案,相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galer ...

  3. 手把手教你 Docker搭建mysql并配置远程访问

    一.使用docker部署mysql 1.在docker中搜索要安装的mysql docker search mysql (这步其实可以跳过O(∩_∩)O哈哈~) 2.拉取mysql镜像 docker ...

  4. Docker容器启动Mysql,Docker实现Mysql主从,读写分离

    Docker容器启动Mysql,Docker实现Mysql主从,读写分离 一.Docker文件编排 二.配置主从复制 2.1 配置master 2.2 配置slave 三.验证主从复制 3.1 mas ...

  5. 【docker】【mysql】docker安装mysql,阿里云docker镜像加速器,docker搜索查看远程仓库上的镜像,docker拉取镜像,查看本地所有镜像,查看容器的运行状况,查看容器的详细信息

    在docker上安装mysql有两种方式 1.通过Dockerfile构建 2.直接在docker hub上拉取镜像安装 =================本篇采用方法2=============== ...

  6. 基于Docker搭建MySQL主从复制

    摘要: 本篇博文相对简单,因为是初次使用Docker,MySQL的主从复制之前也在Centos环境下搭建过,但是也忘的也差不多了,因此本次尝试在Docker中搭建. 本篇博文相对简单,因为是初次使用D ...

  7. 基于 Docker 搭建 MySQL 主从复制

    本篇博文相对简单,因为是初次使用Docker,MySQL的主从复制之前也在Centos环境下搭建过,但是也忘的也差不多了,因此本次尝试在Docker中搭建. 根据网上教程走还是踩了一些坑,不过所幸最终 ...

  8. docker 搭建 MYSQL并且完成主从复制

    mysql主从复制逻辑: 1.从库执行start slave 开启主从复制. 2.从库请求连接到主库,并且指定binlog文件以及位置后发出请求. 3.主库收到从库请求后,将信息返回给从库,除了信息日 ...

  9. Docker搭建 MySQL 主从复制

    为什么选 Docker 搭建主从复制需要两个以上的MySQL, 使用 Docker 非常方便.如果以前没用过,找个简单的文档看看,熟悉一下命令. 搭建过程 1.下载镜像 docker pull mys ...

随机推荐

  1. absolute与relative 的超越

    relative 超越了自身而已,所有位置的变化是相对于正常流下自身的表现而言 absolute  超越了父容器,位置信息是基于父容器的位置而言

  2. 绝对定位元素left、right、top、bottom值与其margin和宽高的关系

    绝对定位元素(position: absolute)在其相对定位元素(即文档流中最近的非静态定位祖先元素)中,定位祖先元素的宽度为W,垂直高度为H,则存在以下关系: 元素水平方向 width + le ...

  3. Cache一致性和内存模型

    -------------------------------

  4. 分库分表神器 Sharding-JDBC,几千万的数据你不搞一下?

    今天我们介绍一下 Sharding-JDBC框架和快速的搭建一个分库分表案例,为讲解后续功能点准备好环境. 一.Sharding-JDBC 简介 Sharding-JDBC 最早是当当网内部使用的一款 ...

  5. Kernel RBD的QOS配置方案

    前言 关于qos的讨论有很多,ceph内部也正在实现着一整套的基于dmclock的qos的方案,这个不是本篇的内容,之前在社区的邮件列表看过有研发在聊qos的相关的实现的,当时一个研发就提出了在使用k ...

  6. centos6安装calamari

    安装操作系统 首先安装操作系统centos6,安装过程选择的是base server,这个不相同不要紧,出现缺少包的时候去iso找出来安装就可以了 calamari的简单介绍 首先简单的介绍下cala ...

  7. Ubuntu 12.10设置root用户登录图形界面

    Ubuntu 12.04默认是不允许root登录的,在登录窗口只能看到普通用户和访客登录.以普通身份登陆Ubuntu后我们需要做一些修改,普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终端 ...

  8. CSS属性(字体与文本属性)

    1.字体属性 (1)font-family 把要对这个网站要设置的字体都写上,如果这个浏览器支持第一个字体,则会用,如果不支持则会尝试第二个,如果设置的字体系统都不支持则会使用系统默认的字体作为网站的 ...

  9. 吉他自学用Guitar Pro好不好?

    很多人心中都有一个吉他梦,可苦于没有坚持下来.其实一个人自学吉他过程是非常枯燥的.经常手上被磨得都是茧,但是也不清楚自己弹的到底对不对. 如果不跟着老师练习,那很有可能就走了歪路或者是无法长期坚持.所 ...

  10. 如何用EasyRecovery恢复U盘乱码的文件

    大多数用户在遇到U盘文件乱码的情况时,都显得有点手足无措,甚至会删除乱码文件,这样就导致了乱码文件数据的丢失.针对这种情况,我们应该怎么正确处理呢? 图1:U盘乱码 U盘文件乱码原因: 想要解决问题, ...