1.下载镜像,这里使用MySQL8.0.18
docker pull mysql:8.0.18
2.主库
创建my.cnf
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
#expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
创建容器
sudo docker run -d --privileged=true \
-v /community/mysql/master/conf:/etc/mysql \
-v /community/mysql/master/logs:/var/log/mysql \
-v /community/mysql/master/data:/var/lib/mysql \
-v /community/mysql/master/my.cnf:/etc/mysql/my.cnf \
-p 3306:3306 --name=mysql -e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.18
参数说明
参数 | 说明 |
---|
-d | 后台运行 |
-v | 挂载文件或文件夹 |
-p | 端口映射 |
-e | 环境变量设置 |
–privileged=true | 拥有root权限 |
–name | 容器名称 |
创建数据同步用户
# 进入容器内部,并连接mysql
docker exec -it mysql mysql -uroot -p
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';
3.从库
创建从库容器
sudo docker run -d --privileged=true \
-v /community/mysql/slave1/conf:/etc/mysql \
-v /community/mysql/slave1/logs:/var/log/mysql \
-v /community/mysql/slave1/data:/var/lib/mysql \
-v /community/mysql/slave1/my.cnf:/etc/mysql/my.cnf \
-p 3305:3306 --name=mysqlslave -e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.18
4. 主从同步
查看主库状态
# 进入容器内部,并连接mysql
docker exec -it mysql mysql -uroot -p
mysql> show master status;
+-----------------------+------------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+------------+--------------+------------------+-------------------+
| mall-mysql-bin.000003 | 1044876395 | | mysql | |
+-----------------------+------------+--------------+------------------+-------------------+
配置从库
# 进入容器内部,并连接mysql
docker exec -it mysqlslave mysql -uroot -p
change master to master_host='10.0.0.165',\
master_user='slave', master_password='123456',\
master_port=3306, master_log_file='mall-mysql-bin.000003', \
master_log_pos=1044876395, master_connect_retry=30;
参数 | 说明 |
---|
master_host | 主库IP |
master_user | 同步的用户 |
master_password | 同步的密码 |
master_port | 同步的端口 |
master_log_file | show master status;查出来的File |
master_log_pos | show master status;查出来的Position |
master_connect_retry | 连接失败重试的时间间隔,单位为秒。 |
show slave status \G;
start slave;
- 当Slave_IO_Running和Slave_SQL_Running都为YES时就是成功
5.测试
6.增加新节点
停止一个从库的主从复制
# 进入容器内部,并连接mysql
docker exec -it mysqlslave mysql -uroot -p
# 停止主从同步
stop slave;
# 查看从库状态
show slave status \G;
备份当前从库的所有数据
mysqldump -uroot -p --all-databases > sqlfile.sql
- ps: 之前创建容器的时候,映射有文件夹,这条命令可以在有映射文件夹的地方执行,这样能直接在外面拿到sqlfile.sql ,也可以使用docker cp命令将sqlfile.sql文件拷贝出来
将导出的数据,导入新库里面
source /var/log/mysql/sqlfile.sql;
设置主库同步
change master to master_host='10.0.0.165', \
master_user='slave', master_password='123456',\
master_port=3306, master_log_file='mall-mysql-bin.000004', \
master_log_pos=37642095, master_connect_retry=30;
参数 | 说明 |
---|
master_log_file | 对应从库状态查询出来的Relay_Master_Log_file |
master_log_pos | 对应从库状态查询出来的Exec_Master_Log_Pos |
开启同步
start slave;
- 查看状态
show slave status \G;
开启第一步关闭的从库的主从复制