目录结构
先按照这个目录结构创建。
mysql.conf 配置,mysql的基础可以在此添加
mysql配置
mysql-master下conf配置
bash
[mysqld]
# 设置服务器唯一标识号
server-id=1
# 启用二进制日志
log-bin=master-bin
# 指定需要复制的数据库
binlog-do-db=test_db
# 指定二进制日志的格式为行级别
binlog-format=row
# 启用 GTID 模式
gtid-mode=ON
# 强制 GTID 一致性检查
enforce-gtid-consistency=ON
mysql-slave下conf配置
bash
[mysqld]
# 设置服务器唯一标识号
server-id=2
# 启用二进制日志
log-bin=slave-bin
# 指定需要复制的数据库
binlog-do-db=test_db
# 指定二进制日志的格式为行级别
binlog-format=row
# 启用 GTID 模式
gtid-mode=ON
# 强制 GTID 一致性检查
enforce-gtid-consistency=ON
注意我指定了数据库为test_db
docker一键部署配置
bash
version: '3.8'
services:
mysql-master:
image: mysql:latest
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码
MYSQL_DATABASE: test_db # 要创建的数据库名称
ports:
- "3001:3306" # 映射到主服务器的端口
volumes:
- ./mysql-master/data:/var/lib/mysql # 挂载数据目录
- ./mysql-master/config/mysql.conf:/etc/mysql/conf.d/mysql.conf # 挂载主服务器的配置文件
- ./mysql-master/log:/var/log/mysql # 挂载日志目录
command: --server-id=1 --log-bin=master-bin --binlog-do-db=test_db --binlog-format=row --gtid-mode=ON --enforce-gtid-consistency=ON # 主服务器的命令参数
mysql-slave:
image: mysql:latest
container_name: mysql-slave
environment:
MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码
MYSQL_DATABASE: test_db # 要创建的数据库名称
ports:
- "3002:3306" # 映射到从服务器的端口
volumes:
- ./mysql-slave/data:/var/lib/mysql # 挂载数据目录
- ./mysql-slave/config:/etc/mysql/conf.d # 挂载从服务器的配置文件
- ./mysql-slave/log:/var/log/mysql # 挂载日志目录
command: --server-id=2 --log-bin=slave-bin --binlog-do-db=test_db --binlog-format=row --gtid-mode=ON --enforce-gtid-consistency=ON --skip-slave-start # 从服务器的命令参数
depends_on:
- mysql-master # 确保主服务器先启动
注意:我使用的mysql用户为默认root,可以自行创建其他用户访问数据库。
在mysql文件夹下执行
docker-compose up -d
如上图所示表示mysql创建成功。
主从配置
获取主服务器状态信息
在主服务下执行,进入容器
bash
#进入容器内部
docker-compose exec mysql-master bash
#输入用户密码
mysql -u root -p
#为了避免从服务复制出现权限不足的情况需要执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 查看状态
SHOW MASTER STATUS;
如上图所示,需要记下 File
和 Position
的值。
如不配置ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
会出现 如下错误
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.3.150' IDENTIFIED BY '123456'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY '123456'' at line 1
配置从服务器复制
在从服务器下执行,进入容器
bash
#进入容器
docker-compose exec mysql-slave bash
#输入用户密码
mysql -u root -p
#配置从服务器复制
CHANGE MASTER TO MASTER_HOST='192.168.3.150', MASTER_USER='root', MASTER_PASSWORD='123456',MASTER_PORT=3001, MASTER_LOG_FILE='master1-bin.000003', MASTER_LOG_POS=478;
注意
- MASTER_HOST='192.168.3.150': 如果在同一个docker 环境下,可以替换成主容器名称,即mysql-master
- MASTER_PORT=3001:如果不指定端口默认端口为3306。
- MASTER_LOG_FILE='master1-bin.000003', MASTER_LOG_POS=478; 必须指定主服务器的
File
和Position
值。
配置成功后可以查看主从状态:
bash
#查看主从配置状态
SHOW REPLICA STATUS\G;
如果从服务器正在运行作为主服务器的复制进程,则应该会看到 Slave_IO_Running
和 Slave_SQL_Running
字段都显示为 Yes
。您还可以查看 Master_Log_File
和 Read_Master_Log_Pos
字段,以获取关于当前复制位置的信息。如上图所示,已经配置成功。
可能会出现的错误:
Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
这个错误通常意味着从服务器无法找到在二进制日志索引文件中找到主服务器的第一个日志文件名。
重新初始化从服务器并重新开始复制过程就可以解决。
bash
#停止复制
STOP SLAVE;
#清除从服务器上的复制信息
RESET SLAVE;
#启动复制
START SLAVE;
现在mysql-master为主数据库,mysql-slave为从数据库。实现互为主从,反过来再配置一遍即可。
获取从服务器状态信息
从服务器下执行
bash
#为了避免从服务复制出现权限不足的情况需要执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 查看状态
SHOW MASTER STATUS;
如上图所示,主从信息是有变化的,同时记录 File
和 Position
的值。
配置主服务器复制
在主服务下执行
bash
#配置主服务器复制
CHANGE MASTER TO MASTER_HOST='192.168.3.150', MASTER_USER='root', MASTER_PASSWORD='123456',MASTER_PORT=3002, MASTER_LOG_FILE='slave-bin.000003', MASTER_LOG_POS=1855;
#开始复制
START SLAVE;
#查看主从配置状态
SHOW REPLICA STATUS\G;
如上图所示,即主从配置成功。
测试主从复制
在其中一个数据添加数据
另外一个数据库查询
做了个gif。