docker-compose文件
bash
version: "2"
services:
mysql-master:
#network_mode: "host"
environment:
MYSQL_ROOT_PASSWORD: "你数据库的密码"
image: "docker.io/mysql:latest"
restart: always
container_name: mysql-master
ports:
- "3307:3306"
volumes:
- ./mysql/master/db:/var/lib/mysql
- ./mysql/master/conf/my.cnf:/etc/my.cnf
- ./mysql/master/init/init.sql:/docker-entrypoint-initdb.d/init.sql
command: --max_connections=1000 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password
mysql-slave:
#network_mode: "host"
environment:
MYSQL_ROOT_PASSWORD: "数据库密码"
image: "docker.io/mysql:latest"
restart: always
container_name: mysql-slave
ports:
- "3308:3306"
volumes:
- ./mysql/slave/db:/var/lib/mysql
- ./mysql/slave/conf/my.cnf:/etc/my.cnf
- ./mysql/slave/init/init.sql:/docker-entrypoint-initdb.d/init.sql
command: --max_connections=1000 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password
挂载目录如下:
docker-compose文件与mysql文件夹同级
主机挂载文件配置
conf文件夹: my.cnf文件如下:
ini
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
binlog-ignore-db=mysql
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
log-bin=mall-mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=101 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
binlog-do-db=user #需要进行主从同步的数据库
replicate-ignore-db=mysql #不需要进行主从同步的数据库
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
init文件夹: init.sql文件是数据库初始化时执行的sql语句。
如下:
sql
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '主机数据库密码';
flush privileges;
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%';
FLUSH PRIVILEGES;
分别创建两个角色,第一个用于数据库远程登录,第二个用于数据库从机角色。 db文件夹没有文件。
从机挂载文件配置
结构与主机一样,稍微修改一下挂载文件:
conf中的my.cnf
ini
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
binlog-do-db=user
replicate-ignore-db=mysql
init.sql:
sql
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '从机数据库密码';
flush privileges;
创建一个角色用于远程登录就好。
开始部署
进入到docker-compose文件夹:
启动: docker-compose up -d
可以用命令:docker exec -it 容器id /bin/bash
进入两个数据库容器内部,
然后用 mysql -u root -p
命令登录
这里我navicat远程连接进行演示:
对于主机的配置:
1.执行create database user;
,创建user数据库(刚刚主机my.init文件中指出的需要同步的数据库)
2.执行show master status;
记下第一列和第二列的内容,后面会有用。
从机的配置
1.执行create database user;
,创建user数据库(这一步其实也可以放到init.sql文件里面一起执行)
2.执行
ini
CHANGE MASTER TO MASTER_HOST='主机数据库的ip地址',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='上面查出来的第一列的文件名',MASTER_LOG_POS=第二列的数字;
比如我这里是: CHANGE MASTER TO MASTER_HOST='主机ip',MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_PORT=3307,MASTER_LOG_FILE='mall-mysql-bin.000010',MASTER_LOG_POS=156;
3.执行:start slave;
开始主从同步
4.执行:show slave status;
如果出现两个yes即为成功:
此时对user数据库进行任意操作,从机都会进行同步。