基于 docker 搭建 mysql 主从复制架构

说明

本文会基于 docker 来搭建一套 一主两从 的 mysql 主从架构.
阅读本文之前, 需要对 docker 的相关知识有一定了解.

基本部署信息如下所示:

名称对外端口对内端口容器名称Mysql 版本
master33063306mymysql5.6
slave0133403306mymysql-slave5.6
slave0233413306mymysql-slave25.6

搭建过程

整个搭建过程肯定不会很顺利, 文中提到的问题你不一定会遇到, 你遇到的问题文中也不一定会提到, 需要在实践过程中 “见招拆招”.

建议先总览一遍全文, 再去动手操作.

1. 拉取镜像

本文使用的 mysql 版本是 5.6, 当然你也可以选择其他临近的版本.

docker pull mysql:5.6

2. 启动容器

# 启动 master 节点
docker run -p 3306:3306 --name mymysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

# 启动 slave01 节点
docker run -p 3340:3306 --name mymysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

# 启动 slave02 节点
docker run -p 3341:3306 --name mymysql-slave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

3. 查看 mysql 状态

docker ps

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrIeb0Ff-1620362630941)(/Users/zhanggaopei/Library/Application Support/typora-user-images/image-20210506102040534.png)]

4. 使用 mysql 客户端连接服务端

这一步纯粹是为了充分验证 mysql 安装结果

可以使用 navicat 之类的 mysql 客户端依次登陆连接, 验证安装结果.

5. 配置 master 节点

从第 5 步开始, 就需要处处小心谨慎.

5.1 进入 docker 容器
# 6184e4f13e02 为容器 id
docker exec -it 6184e4f13e02 /bin/bash
5.2 修改 master 节点的配置文件, 即 my.cnf

通过 vim 编辑器编辑配置文件

vi /etc/mysql/my.cnf

如果提示没有 vi 命令, 还需要安装 vim

# 如果如下命令报错, 可以先执行 apt-get update, 然后再次执行如下命令
# 如果还是有问题, 请自行百度.
apt-get install vim

进入 vi 编辑器后, 追加如下配置到 my.cnf 文件

[mysqld]
# 同一局域网内要唯一
server-id=101
# 开启 binlog 
log-bin=mysql-bin
5.3 在 master 上创建一个主从同步的用户, 并授权

这个步骤的目的是, 让 slave 节点可以通过此用户名去连接到 master 做数据同步.

# 通过如下命令连接 mysql 服务端, 然后会提示输入密码
mysql -uroot -p;
# 输入密码后, 进入 mysql 命令行, 去创建用户名及密码
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 赋予相应权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 刷新权限
FLUSH PRIVILEGES;

6. 配置 SLAVE01

6.1 修改 slave01 的 mysql 配置

进入 slave01 的容器中, 找到 my.cnf 文件, 追加如下配置:

[mysqld]
## 设置server_id,注意要唯一
server-id=102
## 开启二进制日志功能,以备 Slave 作为其它 Slave 的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin  
6.2 连接 master 和 slave01

进入slave01 容器的 mysql 命令行中, 执行如下 sql 命令:

change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=2830, master_connect_retry=30;

字段说明:

  • master_host 每个 docker 容器都有一个独立ip, 可以通过如下命令去查看.

    # mymysql 为容器名称
    docker inspect --format='{{.NetworkSettings.IPAddress}}' mymysql
    
  • master_user 和 master_password 为前面创建的用户名和密码

  • master_port 为对外开放的端口号

  • master_log_file 和 master_log_pos 可以通过如下命令得知

    # 进入到 master 容器, 进入到 mysql 命令行, 执行如下命令
    show master status;
    

在这里插入图片描述

6.3 查看 slave 状态

在 slave 节点上, 通过 show slave status; 验证连接结果

如下图所示:

在这里插入图片描述

  • 如果连接成功会显示两个yes,

  • 如果显示两个 no, 需要执行下, start slave

  • 如果上面显示 Connecting 下面显示 yes , 证明有问题.

      通常报错信息是 ```error connecting to master xxxxx ```
    
      排查思路如下:
    
      * 检查两个容器端口是否是通的、防火墙是不是开着.
      * 检查上面创建的 slave 用户以及对应的权限是否创建成功.
      * 检查自己的执行命令的参数是不是写错了.
    
      出现上述问题, 网上给出的解决方案一般就是上面三个,
      我当时是把创建的用户删了, 重新创建, 问题就解决了. 原因未明. 
    

7. 配置 SLAVE02

7.1 修改 slave02 的 mysql 配置文件
[mysqld]
## 设置server_id, 注意要唯一
server-id=103
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin 
7.2 连接 master 和 slave02

步骤同 slave01 一样

8. 验证部署结果

在 master 节点上执行一条插入语句, 然后查看两个 slave 节点上是否把数据同步过来.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值