拉取mysql 镜像
docker pull mysql:5.7.36
创建容器
创建以下几个文件夹
master
slave1
slave2
创建主数据库
docker run \
--name mysql-master \
-p 3307:3306 \
-v /usr/local/docker/mysql/data/master:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.36
创建从数据库1
docker run \
--name mysql-slave1 \
-p 3308:3306 \
-v /usr/local/docker/mysql/data/slave1:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.36
创建从数据库2
docker run \
--name mysql-slave2 \
-p 3309:3306 \
-v /usr/local/docker/mysql/data/slave2:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.36
tip:参数说明
–name mysql-master :设置容器名称。
-p 3306:3306 :将宿主机的端口映射到容器的端口上。
-v /usr/local/docker/mysql/data/slave1:/var/lib/mysql :将宿主机的目录挂载到容器的目录上,实现数据的持久化。
-e MYSQL_ROOT_PASSWORD=root :设置环境变量,这里是设置了root账号的密码。
-d mysql:5.7.36 :指定创建容器的镜像,并使用守护进程的方式来运行,镜像可以用名称或者ID来指定,使用名称时可以设置标签,当本地找不到对应的镜像时会去线上公共仓库拉取。
配置主从
配置主库
查看主数据库的局域网ip
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
进入主数据库
docker exec -it mysql-master /bin/bash
安装vim
apt-get update
apt-get install -y vim
问题:执行apt-get update
时报错
root@3c04cb20100f:/# apt-get update
Err:1 http://deb.debian.org/debian buster InRelease
Temporary failure resolving 'deb.debian.org'
Err:2 http://security.debian.org/debian-security buster/updates InRelease
Temporary failure resolving 'security.debian.org'
Err:3 http://repo.mysql.com/apt/debian buster InRelease
Temporary failure resolving 'repo.mysql.com'
Err:4 http://deb.debian.org/debian buster-updates InRelease
Temporary failure resolving 'deb.debian.org'
Reading package lists... Done
W: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease Temporary failure resolving 'deb.debian.org'
W: Failed to fetch http://security.debian.org/debian-security/dists/buster/updates/InRelease Temporary failure resolving 'security.debian.org'
W: Failed to fetch http://deb.debian.org/debian/dists/buster-updates/InRelease Temporary failure resolving 'deb.debian.org'
W: Failed to fetch http://repo.mysql.com/apt/debian/dists/buster/InRelease Temporary failure resolving 'repo.mysql.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.
root@3c04cb20100f:/# cat /etc/apt/sources.list
# deb http://snapshot.debian.org/archive/debian/20211220T000000Z buster main
deb http://deb.debian.org/debian buster main
# deb http://snapshot.debian.org/archive/debian-security/20211220T000000Z buster/updates main
deb http://security.debian.org/debian-security buster/updates main
# deb http://snapshot.debian.org/archive/debian/20211220T000000Z buster-updates main
deb http://deb.debian.org/debian buster-updates main
解决
退出数据库,重启docker
root@3c04cb20100f:/# exit
exit
systemctl restart docker
修改主数据库配置
vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0
##新增
server_id = 1
log_bin = mysql-bin
binlog_format = statement
expire_logs_days = 30
binlog_ignore_db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performation_schema
binlog_ignore_db = sys
tip:参数说明
datadir :数据文件存储目录,与创建容器时候挂载的目录要一致。
bind-address :注释掉后允许远程访问。
server_id :服务ID,集群内必须保证唯一。
log_bin :开启二进制日志功能并设置日志文件名称,作为主数据库必须开启。
expire_logs_days :二进制日志过期天数。
binlog_ignore_db :指定不记录日志的数据库,也可以使用binlog_do_db指定需要记录日志的数据库。
重启服务
docker restart mysql-master
mysql -u root -p
#查看二进制日志功能是否开启成功:
show variables like 'log_bin'; // on
#创建同步用的用户 hwy_slave,设置密码为 hwy123456,分配同步权限并查看是否分配成功:
CREATE USER 'hwy_slave'@'%' IDENTIFIED BY 'hwy123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'hwy_slave'@'%';
show GRANTS for 'hwy_slave'@'%';
#查看主服务器状态,记录 File 和 Position 的值
show master status;
File: mysql-bin.000001
Position: 625
配置从库
安装vim,同主数据库。
进入从数据库
docker exec -it mysql-slave1 /bin/bash
修改配置
vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0
server_id = 11
relay_log = mysql-slave-relay
replicate_ignore_db = mysql
replicate_ignore_db = information_schema
replicate_ignore_db = performation_schema
replicate_ignore_db = sys
slave-skip-errors = all
tip:参数说明
server_id :服务ID,集群内必须保证唯一。
relay_log :中继日志,开启后将主数据库的二进制日志先存储到从服务器的本地中继日志文件中,然后再读取中继日志应用到从数据库。
replicate_ignore_db :指定不需要同步的数据库,也可以使用replicate-do-db指定需要同步的数据库。
重启数据库
docker restart mysql-slave1
重新进入从数据库,设置主从
mysql -uroot -proot
CHANGE MASTER TO MASTER_HOST='172.17.0.2',MASTER_PORT=3306,MASTER_USER='hwy_slave',MASTER_PASSWORD='hwy123456',MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=625;
tip:参数说明
MASTER_HOST :主数据库服务所在的主机IP,这里填写的是前面记录的 mysql-master 容器的局域网IP。
MASTER_PORT :主数据库服务绑定的端口。
MASTER_USER :主数据库服务创建的拥有同步权限的用户账号。
MASTER_PASSWORD :授权账号对应的密码。
MASTER_LOG_FILE :需要读取的主数据库二进制日志文件名称。
MASTER_LOG_POS :从主数据库二进制日志指定位置开始读取。
启动主从
mysql> start slave;
查看从库状态
mysql> show slave status \G;