1、导入mysql8镜像
docker load -i mysql8.tar
2、创建主节点
docker run -id --name=mysql-master -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -e TZ=Asia/Shanghai -v /etc/mysql/master/config:/etc/mysql/conf.d -v /etc/mysql/msater/data:/var/lib/mysql mysql:8.0
3、在/etc/mysql/master/config
创建配置文件my.cnf
# 文件名必须为my.cnf 不能为mysqld.cnf
touch /etc/mysql/master/config my.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
init_connect='SET collation_connection = utf8mb4_0900_ai_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_0900_ai_ci
[client]
default-character-set=utf8mb4
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
## 设置server_id,同一局域网中需要唯一
server_id=1002
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
### 开启二进制日志功能
log-bin=mysql-bin
### 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
### 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=row
### 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
### 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
### 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_skip_errors=1062
skip_name_resolve=1
skip_symbolic_links=1
4、重启主节点并进入主节点容器
docker restart mysql-master
docker exec -it mysql-master bash
5、进入mysql
mysql -uroot -p
输入密码进入后执行以下sql创建从节点用户
use mysql;
CREATE USER 'slave'@'%' IDENTIFIED with mysql_native_password BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;
查看主节点状态
show master status;
记录下file、position
6、退出主节点容器,创建从节点容器
# 注意映射的目录不可以与主节点一致,否则容器报错启动不了
docker run -id --name=mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -e TZ=Asia/Shanghai -v /etc/mysql/slave/config:/etc/mysql/conf.d -v /etc/mysql/slave/data:/var/lib/mysql mysql:8.0
7、在/etc/mysql/slave/config
创建my.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
init_connect='SET collation_connection = utf8mb4_0900_ai_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_0900_ai_ci
#[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
## 设置server_id,同一局域网中需要唯一
server_id=102
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=row
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_skip_errors=1062
## relay_log配置中继日志
relay_log=mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
skip_name_resolve=true
skip_symbolic_links=true
rpl_semi_sync_slave_enabled=1
[client]
default-character-set=utf8mb4
8、重启从节点,进入从节点容器,进入mysql(不再赘述)
9、执行sql
-- host为主节点容器的IP地址
-- user为刚刚在主节点创建的用户
-- password主节点用户密码
-- port主节点的端口
-- log_file 刚刚在主节点执行show master status 时打印出来的file字段
-- log_pos刚刚在主节点执行show master status 时打印出来的position字段
change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=617, master_connect_retry=10;
10、查看主从同步状态
在从节点mysql内执行show slave status;
Slave_IO_Running、Slave_SQL_Running为yes时才表示主从同步已开启
在docker下Slave_IO_Running 一直为connecting或NO基本上是配置文件映射错了,请仔细检查!!!!
11、开启mysql半同步模式(只讲做法,不讲原理,原理请移步mysql官网)
推荐使用连接工具直接连接主库与从库操作,避免来回用命令操作容器,麻烦。
①主节点需要安装rpl_semi_sync_master
插件,默认情况下是需要手动安装的
install plugin rpl_semi_sync_master soname 'semisync_master.so';
如果报这个错就说明已经安装过了
在主节点配置文件增加这一行配置
rpl_semi_sync_master_enabled=1
加好后重启主节点容器
②从节点需要安装rpl_semi_sync_slave
插件,默认情况下是需要手动安装的
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
在从节点配置文件增加这一行配置
rpl_semi_sync_slave_enabled=1
加好后重启从节点容器
③在主节点执行sql
show status like '%rpl_semi%';