Bootstrap

基于Docker搭建MySQL一主一从


本篇基于Mac(m1)验证

准备 master 实例

1. Docker创建并启动MySQL master实例

docker run -d \
-p 3306:3306 \
-v /Users/111/aurora/mysql/master/conf:/etc/mysql/conf.d \
-v /Users/111/aurora/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name aurora-mysql-master \
mysql:8.0.29

2. 创建MySQL master实例配置文件

vim /Users/111/aurora/mysql/master/conf/my.cnf
====== 配置内容如下 ======
# 服务器唯一id,默认值1
server-id=1
# 设置日志格式,默认值ROW
binlog_format=STATEMENT
# 二进制日志名,默认binlog
log-bin=binlog
# 设置需要复制的数据库,默认复制全部数据库
binlog-do-db=db_user
# 设置不需要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=infomation_schema
binlog-ignore-db=sys
binlog-ignore-db=performance_schema
====== 重启MySQL容器 ======
docker restart aurora-mysql-master

binlog格式说明:

  • binlog_format=STATEMENT:日志记录的是主机数据库的写指令,性能高,但是now()之类的函数以及获取系统参数的操作会出现主从数据不同步的问题。
  • binlog_format=ROW(默认):日志记录的是主机数据库的写后的数据,批量操作时性能较差,解决now()或者 user()或者 @@hostname 等操作在主从机器上不一致的问题。
  • binlog_format=MIXED:是以上两种level的混合使用,有函数用ROW,没函数用STATEMENT,但是无法识别系统变量。

3. 命令行登录MySQL master实例

#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it aurora-mysql-master env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p123456

#如果客户端版本过低,可以通过修改默认密码校验方式来解决,笔者使用DataGrip没有此问题。
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

4. master中创建slave用户

#创建slave用户
CREATE USER 'aurora_slave'@'%';
#设置密码
ALTER USER 'aurora_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
#授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'aurora_slave'@'%';
#刷新权限
FLUSH PRIVILEGES;

5. 检查master状态

执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

show master status;

在这里插入图片描述

准备 slave 实例

想要配置多个slave,重复此步骤。

1. Docker创建并启动MySQL slave实例

docker run -d \
-p 3307:3306 \
-v /Users/111/aurora/mysql/slave1/conf:/etc/mysql/conf.d \
-v /Users/111/aurora/mysql/slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name aurora-mysql-slave1 \
mysql:8.0.29

2. 创建MySQL slave实例配置文件

vim /Users/111/aurora/mysql/slave1/conf/my.cnf
====== 配置内容如下 ======
# 服务器唯一id,每台服务器的id必须不同。
server-id=2
# 中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin
====== 重启MySQL容器 ======
docker restart aurora-mysql-slave1

3. 登录从库实例配置主从关系

#进入容器:
docker exec -it aurora-mysql-slave1 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p123456

#执行如下命令,MASTER_USER是创建master时设置的slave名称,
#MASTER_LOG_FILE,MASTER_LOG_POS分别对应「检查master状态」,结果截图中的File,Position
CHANGE MASTER TO MASTER_HOST='192.168.3.29', 
MASTER_USER='aurora_slave',MASTER_PASSWORD='123456', MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000005',MASTER_LOG_POS=157; 

主从同步相关指令

启动 slave 的复制功能

start slave;
-- 查看状态(不需要分号)
show slave status\G

两个关键进程,下面两个参数都是Yes,则说明主从配置成功!笔者这个失败了,接下来查原因。
在这里插入图片描述
失败原因如下:

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; 
these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave 
but this does not always make sense; please check the manual before using it).
-- 查看下server_id
show variables like 'server_id';

在这里插入图片描述
上一小节配置的slave的server-id=2貌似没生效,下面手动设置sever_id。设置完再次查看sever_id,已变为2,接下来启动slave并查看状态,两个Yes,至此配置成功。

-- 和配置文件里的server_id一致
set global server_id=2;

在这里插入图片描述

停止和重置 slave 的复制功能

-- 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。
stop slave; 

-- 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
reset slave;

-- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;
reset master;

数据验证

在主机中执行以下SQL,在从机中查看数据库、表和数据是否已经被同步。

CREATE DATABASE aurora;
USE aurora;
CREATE TABLE elephant (
 id BIGINT AUTO_INCREMENT,
 uname VARCHAR(30),
 PRIMARY KEY (id)
);
INSERT INTO elephant(uname) VALUES('xiaobai');
;