Docker下搭建MySql主从复制
在Docker环境下搭建MySql主从复制,阅读此文章默认读者具备基础的Docker命令操作。
一、环境
1、Docker版本:Docker version 24.0.5, build ced0996
2、MySql:Server version: 5.7.36 MySQL Community Server (GPL)
3、Centos:CentOS Linux release 7.9.2009 (Core)
4、数据库Master端口3307,Slave端口3308
二、搭建主从复制
1、搭建主服务器示例
(1)使用docker命令搭建数据库主服务器,结果如下图:
docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql/mysql-master/log:/var/log/mysql \ -v /mydata/mysql/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7 # 参数说明: # 以下三段都标识挂着容器卷到本地。冒号左边是宿主机地址,右边是mysql容器内的地址 #-v /mydata/mysql/mysql-master/log:/var/log/mysql #-v /mydata/mysql/mysql-master/data:/var/lib/mysql #-v /mydata/mysql/mysql-master/conf:/etc/mysql # 设置环境变量,设置mysql的登录密码 #-e MYSQL_ROOT_PASSWORD=123456 # -d: 后台运行容器并返回容器ID,也即启动守护式容器
(2)进入【/mydata/mysql/mysql-master/conf】目录下新建一个名为【my.cnf】的配置文件,配置内容如下:
[mysqld] ## 设置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 ## 设置数据库字符集 collation_server = utf8_general_ci character_set_server = utf8 [client] ## 设置客户端的数据库字符集 default_character_set=utf8
(3)配置完成后【docker restart [容器ID]】重启MySql实例。
(4)进入mysql-master容器,查看服务是否可用。
(5)在mysql-master实例中创建用于同步的账号。
# 创建同步时使用的账号 CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; # 给同步账号赋予权限 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
(6)使用docker命令搭建数据库从服务器,结果如下图:
# 使用相同的命令,修改下挂载目录和端口,创建数据库从服务器实例 docker run -p 3308:3306 --name mysql-slave \ -v /mydata/mysql/mysql-slave/log:/var/log/mysql \ -v /mydata/mysql/mysql-slave/data:/var/lib/mysql \ -v /mydata/mysql/mysql-slave/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7
(7)进入【/mydata/mysql/mysql-slave/conf】目录下新建一个名为【my.cnf】的配置文件,配置内容如下:[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
## 设置数据库字符集
collation_server = utf8_general_ci
character_set_server = utf8
[client]
## 设置客户端的数据库字符集
default_character_set=utf8
(8)修改完配置文件后使用【docker restart [容器ID]】重启【mysql-slave】服务
(9)在主数据库中查看主从状态
# 查看已经启动的docker服务 docker ps # 进入主数据库实例 docker exec -it 40c03b5cfc8a /bin/bash # 登录数据库 mysql -uroot -p # 查看主从同步状态 show master status
(10) 进入从服务器并配置主从关系。从这里开始从库的容器ID跟之前的从库容器ID不一样了,是因为我不小心删除了原来的容器后又新起的一个MySQL容器。
(11)在从库中使用命令【show slave status \G;】查看主从的状态
(12)在从库中使用命令【start slave;】开启主从同步。出现两个Yes表示成功开启了主从同步。
2、测试主从同步
(1)在主库创建一个db库,再到从库查看这个库是否同步过来。
(2)在主库创建一个user表,并插入一条数据后再到从库查看表信息和数据是否同步。
本文来自博客园,作者:疯子丶pony,转载请注明原文链接:https://www.cnblogs.com/mklblog/p/17616711.html