最近准备学习下数据库中间件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
因为已经做了外部挂载,所以直接进入挂载目录进行配置即可
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