【MySQL】使用docker配置主从复制(主库和从库都是全新的情况)

原创
03/26 12:26
阅读数 129

这篇文章只是让大家了解一下mysql的主从复制,并且实现了一个案例
但是这个案例不是典型的案例
后面会在写其他的配置方法

主从复制解决的问题

  • 数据分布
  • 负载均衡
  • 备份
  • 高可用和故障切换

在这个案例中,我们只实现了备份 。其他几个点,我们后边一个一个实现,就不写概念了

主从复制是如何工作的

这里写的只是简单的实现过程,具体细节是很麻烦的,建议大家都去了解了解

  • 主库会把数据的更改记录在一个二进制文件
  • 从库会把主库的二进制文件复制到复制到自己的中继日志上(MySQL的日志类型有6中,不清楚的可以看看这篇文章【MySQL】日志分类
  • 从库读取中继日志的时间,然后重新放到备库的数据库上

开始准备

这是使用docker安装MySQL的流程
这里我们假定大部分配置采用默认值即可,在主库和备库都是全新
安装并且拥有同样的数据时这样的假设是合理的。接下来我们将展示如何一步步配置复制:假设有服务
器server1(IP地址172.10.0.2)和服务器server2(IP地址172.10.0.3)

【Docker】安装MySQL8.0

在使用docker把MySQL8.0的主节点安装好后在创建俩个MySQL的从节点

分别执行下面语句,这俩个语句分别是创建mysql_slave 和 mysql_slave1的容器

docker run -itd --name mysql-slave -p 3307:3306  --net mynetwork --ip 172.10.0.3 -e MYSQL_ROOT_PASSWORD=123456  mysql

docker run -itd --name mysql-slave1 -p 3308:3306  --net mynetwork --ip 172.10.0.4 -e MYSQL_ROOT_PASSWORD=123456  mysql

在这里插入图片描述

可以看到我们现在创建了三个MySQL的容器

  • 第一个是mysql-master
  • 第二个是mysql-slave
  • 第三个是mysql-slave1

然后三台节点都进入到各自的容器里
docker exec -it id /bin/bash

开始配置主从复制

创建账号

# 创建一个账号
CREATE USER 'master'@'172.10.0.%' IDENTIFIED WITH mysql_native_password BY '123456';
# 给予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'master'@'172.10.0.%';

修改主节点和从节点的配置文件在/etc.mysql/my.cnf
添加
server-id=1
这个server_id 主机跟从机的值坚决不可以一样 一般这个值是根据ip地址的后几位来确定

在这里插入图片描述

授权给从节点

CHANGE MASTER TO
MASTER_HOST='172.10.0.2',
MASTER_USER='master',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=0;

然后查看主从同步状态
Slave_IO_State、Slave_IO_Running和Slave_SQL_Running这三列
显示当前备库复制尚未运行。

在这里插入图片描述

开启主从复制

# 开启主从同步
start slave

# 停止主从复制
stop slave

然后在查看一下主从同步状态
在这里插入图片描述

最后一步开始测试主从复制

先给master创建一个数据库 kaka_test_master_slave

create datebase kaka_test_master_slave;

在这里插入图片描述

然后查看mysql_slave的数据库看有没有创建出来kaka_test_master_slave这个数据库

在这里插入图片描述

测试添加数据

创建表和添加测试数据

CREATE TABLE IF NOT EXISTS `phone` (
`phoneid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (phoneid)
);

INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20))); I
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));

在这里插入图片描述
在这里插入图片描述

查看mysql_slave的数据状态
数据一切正常

在这里插入图片描述

总结:

  • 在这个案例中
  • 我们只配置了一个master_slave 从机
  • master_slave1这个从机没有配置
  • 配置跟master_slave是一致的
  • 在配置过程中我们需要注意几个问题
  • 第一个:给主机创建用户和给予权限时版本不同是有区别的
  • 第二个:在从机的my.cnf里边配置的server_id没有生效问题(咔咔暂时是用set global方式来做的,但是数据库重启就会失效),这个问题在这篇文章写完解决
  • 第三个:对docker的配置一定要对啊!要不就完犊子了

博主微信欢迎交流

在这里插入图片描述

展开阅读全文
打赏
0
0 收藏
分享
加载中
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部