拉取mysql镜像
这里拉取的是mysql 5.7版本的镜像
1 | docker pull mysql:5.7 |
启动两个MySQL容器
启动两个MySQL容器,一个作为master,一个作为slave
master节点,将本地的 3307端口映射到容器的3306端口,密码为123456
1 | docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 |
slave节点,将本地的 3308端口映射到容器的3306端口,密码为123456
1 | docker run -p 3308:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 |
启动完成之后,可通过docker ps
查看是否启动成功。
登录到mysql中
登录到master
节点中
1 | mysql -uroot -h127.0.0.1 -P3307 -p123456 |
再启动一个命令窗口,进入到 slave
节点
1 | mysql -uroot -h127.0.0.1 -P3308 -p123456 |
配置master
通过docker exec进入容器内部
1 | docker exec -it mysql-master /bin/bash |
修改my.cnf文件
1 | echo -e "[mysqld]\nserver-id=100\nlog-bin=mysql-bin" >> etc/mysql/my.cnf |
其实也就是新增下面两句配置
1 | [mysqld] |
重启mysql服务
1 | service mysql restart |
重启时容器会退出,我们需要重新启动一次容器
1 | docker start mysql-master |
配置slave
和master一样,修改my.cnf
文件
1 | echo -e "[mysqld]\nserver-id=101\nlog-bin=mysql-slave-bin\nrelay_log=edu-mysql-relay-bin" >> etc/mysql/my.cnf |
其实也就在文件中加入下面的配置
1 | [mysqld] |
然后重启mysql服务
1 | service mysql restart |
重启过程中,容器会自动退出,我们需要重新启动一次容器
1 | docker start mysql-master |
下一步在Master数据库创建数据同步用户,授予用户slave
REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
1 | CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; |
将slave链接到master
先去master
中查看下binlog的状态
1 | mysql -uroot -h127.0.0.1 -P3307 -p123456 |
查看状态
1 | show master status; |
File
和Position
字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值也会变化。
进入到slave
中
1 | mysql -uroot -h127.0.0.1 -P3308 -p123456 |
链接到master
1 | change master to master_host='172.17.0.2', |
注:
master_host
Master的地址,指的是容器的独立ip,可以通过下面命令查看1
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
master_port
容器的端口号,指的是容器内部运行mysql的端口号master_user
是我们在master中配置的用户主从复制的用户名master_log_file
是上一步中从master中查出File字段的值master_log_pos
是复制起始点,如果为0,为从头复制
开启主从复制
在 slave 中查看主从复制状态,可以看到目前主从复制是还没有开启的。
1 | show slave status \G; |
开启主从复制
1 | start slave; |
再次查看,我们看到主从复制已经开启了。
测试主从复制
我们在master中创建一个数据库,看是否在slave中也会创建
进入到master中的mysql执行创建数据库命令
1 | create database test default character set utf8; |
然后进入到slave节点中查看是否有该数据库
1 | show databases; |
我们看到从库中已经创建了test
数据库,至此我们的主从MySQL集群架构已经搭建完毕了。