首页 > 技术文章 > docker搭建MySQL主从复制

wkynf 2021-02-09 13:59 原文

前置条件

1:centos环境。

2:安装docker。

拉取最新版的MySQL镜像

docker pull mysql

新建配置文件夹

mkdir -p /hzero/conf/mysql/{master,slave}/{logs,data,conf}

主机配置

进入目录

cd /hzero/conf/mysql/slave/conf

新建my.cnf配置文件

touch my.cnf

my.cnf添加一下内容

vi /hzero/conf/mysql/master/conf/my.cnf
#主从复制-主机配置
[mysqld]
#设置主机启动端口3316端口
port=3316
#主服务器唯一ID
server-id = 1
#启用二进制日志
log-bin=mysql-bin
#设置logbin格式
binlog_format = STATEMENT
#设置mysql的安装目录
#basedir=
#设置mysql数据库的数据的存放目录
datadir=/hzero/conf/mysql/master/data
#允许最大连接数
max_connections=200
#允许连接失败的次数
max_connect_errors=10
#服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用mysql_native_password插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
#忽略大小写
lower-case-table-names = 1
[mysql]
#设置mysql客户端默认字符集
default-character-set=utf8mb4
#MySQL导入导出文件限制
#secure_file_priv =

[client]
#设置mysql客户端连接服务端时默认使用的端口
port=3316
default-character-set=utf8mb4

从机配置

进入目录

cd /hzero/conf/mysql/slave/conf

新建my.cnf配置文件

touch my.cnf

my.cnf添加一下内容

vi /hzero/conf/mysql/slave/conf/my.cnf
#主从复制-从机配置
[mysqld]
#设置主机启动端口3318端口
port=3318
#主服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
#启用从机日志
log-bin=mysql-slave-bin
#设置mysql的安装目录
#basedir=
#设置mysql数据库的数据的存放目录
datadir=/hzero/conf/mysql/slave/data
#允许最大连接数
max_connections=200
#允许连接失败的次数
max_connect_errors=10
#服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用mysql_native_password插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
#忽略大小写
lower-case-table-names = 1
[mysql]
#设置mysql客户端默认字符集
default-character-set=utf8mb4
#MySQL导入导出文件限制
#secure_file_priv =

[client]
#设置mysql客户端连接服务端时默认使用的端口
port=3318
default-character-set=utf8mb4

主机启动

docker run \
  -p 3316:3316 \
  -e MYSQL_ROOT_PASSWORD=password \
  -v /hzero/conf/mysql/master/data:/var/lib/mysql-files:rw \
  -v /hzero/conf/mysql/master/logs:/var/log/mysql:rw \
  -v /hzero/conf/mysql/master/conf/my.cnf:/etc/mysql/my.cnf:rw \
  -v /etc/localtime:/etc/localtime:ro \
  --name mysql3316_master \
  --privileged=true \
  --restart=always \
  -d mysql

从机启动

docker run \
  -p 3318:3318 \
  -e MYSQL_ROOT_PASSWORD=password \
  -v /hzero/conf/mysql/slave/data:/var/lib/mysql-files:rw \
  -v /hzero/conf/mysql/slave/logs:/var/log/mysql:rw \
  -v /hzero/conf/mysql/slave/conf/my.cnf:/etc/mysql/my.cnf:rw \
  -v /etc/localtime:/etc/localtime:ro \
  --name mysql3318_slave \
  --privileged=true \
  --restart=always \
  -d mysql

主数据库配置

#主数据库创建用户slave并授权
#创建用户
 create user 'slave'@'%' identified with mysql_native_password by 'password';
 #授权
 grant replication slave on *.* to 'slave'@'%';
 #刷新权限
flush privileges;
#查询server_id值,# 也可临时(重启后失效)指定server_id的值(主从数据库的server_id不能相同)
show variables like 'server_id';
#查询Master状态,并记录File和Position的值
show master status;

从数据库配置

#查询server_id值
show variables like 'server_id';
#若之前设置过同步,请先重置
stop slave;
reset slave;


 change master to master_host='175.27.137.60',master_port=3316,master_user='slave',master_password='password',master_log_file='mysql-bin.000003',master_log_pos=607;

#启动同步
 start slave;

#若出现错误,则停止同步,重置后再次启动
stop slave;
reset slave;
start slave;

#查询Slave状态
show slave status;

从数据库创建只读账号,否则会导致数据不一致问题

 create user 'only_read'@'%' identified with mysql_native_password by 'password';
 SHOW GRANTS FOR only_read;

grant SELECT on test_replication.* to 'only_read'@'%';

测试

数据库创建数据库及表插入数据库,从数据库即可同步

推荐阅读