0%

基于docker搭建mysql主从

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

一、搭建虚拟机

  1. 拉取镜像 docker pull mysql:5.7
  2. 创建主节点 docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  3. 创建从节点 docker run -p 3308:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  4. 使用navicat连接测试,主机写主机IP或localhost或127.0.0.1
    主节点
    从节点
  5. 进入主节点 docker exec -it mysql-master /bin/bash
  6. 进入从节点 docker exec -it mysql-slave /bin/bash

二、虚拟机初始配置

  1. 升级apt库,否则无法安装应用 apt-get update
  2. 安装ping命令 apt-get install inetutils-ping
  3. 安装ifconfig命令 apt-get install net-tools
  4. 安装ps命令 apt-get install procps

三、主节点设置

  1. 编辑/etc/mysql/my.cnf,加入以下内容:
1
2
3
4
5
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
  1. 重启mysql服务 service mysql restart
  2. 启动docker容器 docker start mysql-master
  3. 进入容器 docker exec -it mysql-master /bin/bash
  4. 新建主从复制用户 CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
  5. 授予slave用户权限 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
  6. 查看主节点状态 show master status;

四、从节点设置

  1. 编辑/etc/mysql/my.cnf,加入以下内容:
1
2
3
4
5
6
7
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
  1. 重启mysql服务 service mysql restart
  2. 启动docker容器 docker start mysql-slave
  3. 进入容器 docker exec -it mysql-slave /bin/bash
  4. 复制准备 change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= n, master_connect_retry=30;
    • master_log_pos=n,n值为show master status结果中Position值
  5. 开始执行复制 start slave;
  6. 查看复制状态 show slave status \G;,SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。

五、遇到的问题

  1. Slave_SQL_Running: No

原因

  • 程序可能在slave上进行了写操作
  • 也可能是slave机器重起后,事务回滚造成的

解决方法一

  • stop slave ;
  • set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
  • start slave ;

解决方法二

  • 停止从库复制 stop slave;
  • 查看主库状态 show master status;
  • 重新配置准备,修改File和Position对应的值 change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= n, master_connect_retry=30;