基础环境
1.一台装有Centos的虚拟机
2.docker容器
3.mysql镜像
安装docker
执行命令
yum install docker
成功后输入,出现下图安装成功
启动Docker
启动Docker并设置为开机自启动
systemctl start docker.service
systemctl enable docker.service
安装MySQL
使用Docker拉取MySQL镜像
docker pull mysql:5.7.13
运行主容器
docker run --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
–name 为容器指定名称,这里是master
-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3306端口映射到主机的3306端口
-e 设置环境变量,这里是指定root账号的密码为root
-d 后台运行容器,并返回容器ID
mysql:5.7.13 指定运行的mysql版本
检验是否启动成功
docker ps -a
显示所有的容器,包括未运行的(我这里已经下好了两台)
使用Navicat连接测试
执行SQL
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by 'backup';
show grants for 'backup'@'%';
出现如下信息表示授权成功
这里账号指的是从机使用的账号,通过这个账号去连接主机,也可以直接使用root账号
修改MySQL配置环境
创建配置文件目录
目录结构如下
/usr/local/mysql/master
/usr/local/mysql/slave1
拷贝一份MySQL配置文件
docker cp master:/etc/mysql/my.cnf /usr/local/mysql/master/my.cnf
进到master目录下,已存在拷贝的my.cnf
log-bin=mysql-bin
server-id=1
log-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀
server-id=1 唯一服务器ID,非0整数,不能和其他服务器的server-id重复
将修改后的文件覆盖Docker中MySQL中的配置文件
docker cp /usr/local/mysql/master/my.cnf master:/etc/mysql/my.cnf
重启 mysql 的docker , 让配置生效
docker restart master
启动后,重新测试连接,连接成功表示主容器配置成功
运行MySQL从容器
首先运行从容器
docker run --name slave1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
与主容器相似,拷贝配置文件至slave1目录修改后覆盖回Docker中
log-bin=mysql-bin
server-id=2
别忘记,重启slave1容器,使配置生效
配置主从复制
使用Navicat连接slave1后新建查询,执行以下SQL
CHANGE MASTER TO
MASTER_HOST='ip',
MASTER_PORT=3306,
MASTER_USER='backup',
MASTER_PASSWORD='backup';
START SLAVE;
MASTER_HOST 填Navicat连接配置中的ip应该就可以
MASTER_PORT 主容器的端口
MASTER_USER 同步账号的用户名
MASTER_PASSWORD 同步账号的密码
检查是否配置成功
show slave status;
CHANGE MASTER TO
MASTER_HOST=‘连接Navicat的ip’,
MASTER_PORT=正确的端口,
MASTER_USER=‘正确的用户名’,
MASTER_PASSWORD=‘正确的密码’;
START SLAVE;
接着上文,我们说成功一半,并没有说成功了,那么另一半在于Slave_IO_Running与Slave_SQL_Running
如果都是Yes,那么恭喜你,可以测试主从复制的效果了,如果有一个不是Yes,一半是重启从容器后,事务回滚引起的,那么给出解决方法如下
stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;
执行后,再次观察三个关键字段应该就都没问题了
测试主从复制
首先,在主实例中创建一个测试数据库打开(刷新)从实例,可见test库已存在在test库中创建一个表t_test,添加一个id测试字段向表中添加几个数据刷新从库,可见t_test表及其中1、2、3、4数据已存在至此,一个具备主从复制的一主两从的MySQL就已搭建完成。