Docker下搭建配置mysql5.7主从复制

最近准备学习下数据库中间件mycat,配置mycat读写分离前提要先配置好mysql主从复制。今天把整个过程说一下,首先环境 服务器为centos7系统,mysql版本5.7。

一、启动容器

1、新建mysql主从容器的挂载目录

(1)mysql-master(主)

//mysql配置文件

mkdir -p /data/docker/mysql-master/conf

//mysql数据文件路径

mkdir –p /data/docker/mysql-master/data

//日志文件路径

mkdir -p /data/docker/mysql-master/logs

(2)mysql-slave(从)

//mysql配置文件

mkdir -p /data/docker/mysql-slave/conf

//mysql数据文件路径

mkdir –p /data/docker/mysql-slave/data

//日志文件路径

mkdir -p /data/docker/mysql-slave/logs

2.启动容器

(1)mysql-master

docker run -p 3307:3306 --name mysql-master \
--restart=always \
-v /data/docker/mysql-master/conf:/etc/mysql \
-v /data/docker/mysql-master/logs:/var/log/mysql \
-v /data/docker/mysql-master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7

(1)mysql-slave

docker run -p 3308:3306 --name mysql-slave \
--restart=always \
-v /data/docker/mysql-slave/conf:/etc/mysql \
-v /data/docker/mysql-slave/logs:/var/log/mysql \
-v /data/docker/mysql-slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7

3、注意事项

1.可能出现日志文件不能写入

chmod 777 /data/docker/mysql-master/logs
chmod 777 /data/docker/mysql-slave/logs

二、主从配置

1、配置主机 mysql-master

因为已经做了外部挂载,所以直接进入挂载目录进行配置即可

vim /data/docker/mysql-master/conf/my.cnf 按i进入插入模式,添加以下内容

[mysqld]

#主服务器唯一ID
server_id=1

#启用二进制日志
log-bin=mysql-bin

#下面的如果要所有数据库都进行复制,就不用写
#设置不要复制的数据库(多个数据库则要重复设置)
 binlog-ignore-db=mysql
 binlog-ignore-db=sys

#设置需要复制的数据库(多个数据库则要重复设置)
binlog-do-db=testdb

#设置 logbin格式
binlog_format=STATEMENT

[mysqld_safe]
log-error=/var/log/mysql/mysql.err

binlog 有三种格式:

Statement(Statement-Based Replication,SBR):每一条会修改数据的 SQL 都会记录在 binlog 中。
Row(Row-Based Replication,RBR):不记录 SQL 语句上下文信息,仅保存哪条记录被修改。
Mixed(Mixed-Based Replication,MBR):Statement 和 Row 的混合体。

然后重启mysql-master容器,让它重新加载配置文件

docker restart 容器id

2、创建拥有主从复制权限的账户

(1)进入mysql-master容器内部

 docker exec -it mysql-master bash

(2)登入mysql

 mysql -u root -proot

(3)创建slave账户,赋予主从复制权限


 CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

3、查看mysql-master状态

show master status\G;

File:binlog日志位置

Position : 节点号(mysql主从复制 是从节点开始复制的,这跟redis不太一样)

4、配置从机 mysql-slave

从机拿到主机的 Binarylog 日志,先写入自己的 Relaylog 再执行到写入数据库.

因为已经做了外部挂载,所以直接进入挂载目录进行配置即可

vim /data/docker/mysql-master/my.cnf 按i进入插入模式,添加以下内容

[mysqld]
log-bin=mysql-slave-bin
#从服务器唯一 ID
server-id=2
#启用中继日志
relay_log=mysql-slave-relay-bin
[mysqld_safe]
log-error=/var/log/mysql/mysql.err

然后重启mysql-master容器,让它重新加载配置文件

docker restart 容器id

5、主从链接

进入从机 mysql-slave 容器内部,并登录mysql

执行下面的代码

change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000013', master_log_pos=154, master_connect_retry=30;

需要注意的是:mysql 的主从复制是从主机的接入点(master_log_pos=154)开始复制,从机对主机之前的所有操作不予以关注,如果存在数据或数据结构差异,应该将主机数据导出 内容并导入从机。

master_host:主机IP,为容器独立IP,可以通过一下命令查询

docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master

或者 在mysql-master容器中:

cat /etc/hosts #最后一行显示 IP

master_port:主机端口

master_log_file:binlog日志位置,刚才查询主机状态获取的

master_log_pos:主机节点位置

master_connect_retry:重新链接主机间隔时间

然后启动从机的主从复制

start slave;

#可能出现的配置问题server-id=0,可能是my.cnf 配置错误或者名称写错

mysql里查看 server_id

SHOW GLOBAL VARIABLES like ‘server_id’;

到这里就完成了mysql 的主从配置。下面简单测试一下

三、mysql主从测试

进入主机 mysql-master 容器登入mysql,创建数据库testdb(因为做主机主从配置时,设置了要复制的数据库为testdb,所以这块也要创建testdb数据库)

create database testdb;

进入从机 mysql-slave 容器登入mysql,执行

show databases;

可以看到从机也有了testdb这个数据库

然后可以在主机testdb中创建个表

CREATE TABLE `mytbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL COMMENT '名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='mytbl表';

进入从机,切换到testdb数据库 use testdb

然后执行

show tables;

发现从机testdb数据库里已经有了mytbl这张表了。

至此就完成了mysql的主从复制 配置。

如何停止从服务和重新配置主从?

Docker下搭建配置mysql5.7主从复制 Comment

发表回复

京ICP备15027918号-1