Mysql系列学习〖一〗基于Docker的Mysql主从复制搭建
一. 前置工作
1.1 安装docker
我都docker版本号
[root@iz2zec8miiew8671q6vst1z ~]# docker -v
Docker version 1.13.1, build 7f2769b/1.13.1
1.2 拉取mysql镜像
安装mysql博客
参考我之前的博客拉取镜像即可,先不要run
二. 集群搭建
我们基于阿里云搭建mysql主从
2.1 主从运行
master:
docker run -p 3301:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- –name 重命名
- -p 端口映射 宿主机端口:容器端口
- -e MYSQL_ROOT_PASSWORD=123456 设置密码
- -d 选择我们之前拉取的镜像
slave:
docker run -p 3302:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
此时docker ps 即可出现如下运行的实例
此时去客户端navicat去测一下能连接上就ok
2.2 Master配置
进入docker里面的实例去配置
docker exec -it 333bab234866/bin/bash //333bab234866为容器ID
docker exec -it mysql-master /bin/bash //mysql-master为容器名称
切换到如下目录
这里容器会没有vim 先下载一个
apt-get update
apt-get install vim
下载完后去编辑当前目录下的 my.cnf 文件,添加如下
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=master-bin
binlog-format=ROW // 二级制日志格式,有三种 row,statement,mixed
binlog-do-db=数据库名 //同步的数据库名称,如果不配置,表示同步所有的库
下图为我自己修改的
修改完后,重启mysql服务刷新配置
service mysql restart
- 此处容易重启失败,我这踩了坑,要是容器启动不起来,那就肯定是配置的原因,但是你又没办法进去,此时需要你手动将刚才容器配置错误的文件拉出来,修改完后在改进去
参照此处命令即可 - 也可以将my.cnf 清空再复制回去
然后重启docker容器
docker start mysql-master
使用docker命令重新进入到Master容器内部:
docker exec -it mysql-master /bin/bash
在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。登录到mysql客户端:
mysql -uroot -p123456
创建新用户授权
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
Query OK, 0 rows affected (0.00 sec)
三. 配置Slave
参照Master先修改my.cnf 然后重启mysql服务,然后在重启容器
修改my.cnf 为如下
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=mysql-relay-bin
read_only=1 ## 设置为只读,该项如果不设置,表示slave可读可写
四. 开启主从复制功能
进去Master的mysql 输入show master status
记录下如下数据,在之后复制有需要
再进去Slave的mysql 输入以下
change master to master_host='172.18.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='master-bin.000001', master_log_pos=617, master_connect_retry=30;
命令解释如下
- master_host: 主机IP 若为两台阿里云就写公网IP即可,若为一台输入一下命令获取
docker inspect --format='{ {.NetworkSettings.IPAddress}}' 容器名称 | 容器id查询容器的IP
- master_port:Master的端口号,指的是容器的端口号
- master_user:用于数据同步的用户
- master_password:用于同步的用户的密码
- master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
- master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
- master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在Slave 中的mysql终端执行show slave status \G;用于查看主从同步状态。
上图为未开启主从模式
-
Slave_IO_Running 和 Slave_SQL_Running是查看主从是否运行的关键字段,默认为NO,表示没有进行主从复制。
-
使用start slave;开启主从复制过程,然后再次查询主从同步状态show slave status \G;
使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。
以上为正常开启,可以自己去试试哦\
五. 踩坑
- mysql同步报错 Error ‘Operation CREATE USER failed for ‘zhangsan’@’%’’ on query. 点击此处