主节点配置
1、获取mysql5.7
镜像
docker pull mysql:5.7
2、创建主节点
docker run -d --name mysql-5.7-master \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD="root" \
-v /opt/software/docker/mysql-master/conf/:/etc/mysql/conf.d \
-v /opt/software/docker/mysql-master/data:/var/lib/mysql \
-v /opt/software/docker/mysql-master/logs:/logs docker.io/mysql:5.7
3、修改主节点配置文件
vim /opt/software/docker/mysql-master/conf/my.cnf
将下面的配置写进my.cnf
文件中
[mysqld]
# 同一局域网内需要唯一
server-id=1
# 开启二进制日志功能, 名称随便取
log-bin=master-bin
innodb-file-per-table=ON
skip_name_resolve=ON
4、重启master
节点
docker restart mysql-5.7-master
5、查看master
的bin_log
状态
进入容器
docker exec -it mysql-5.7-master /bin/bash
进入容器后连接容器内的mysql
mysql -u root -p
输入密码,连接上后,查看bin_log
信息
mysql> show global variables like '%log_bin%';

可以看到log_bin
已经开启了。
再查看下日志文件
mysql> show master logs; -- 或者 show binary logs;

6、在master
节点创建有复制权限的用户,用户名为repluser
,密码为replpassword
,授权REPLIACTION SLAVE
,REOPLIATION CLIENT
grant replication slave, replication client on *.* to 'repluser'@'172.17.0.%' identified by 'replpassword';
刷新权限
flush privileges;
172.17.0.%
表示用户repluser
只有在ip地址为172.17.0.xxx
的时候才能连接,为了省事,可以直接设置为%
,可从任意地址访问。这个地址是我docker容器的地址网段,可以通过inspect
命令查看容器环境。如下的命令可得到容器对应的ip地址。
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-5.7-master
执行上述命令后得到master
节点的ip地址:172.17.0.2
,这个地址后面需要配置到从节点中。
从节点配置
这里暂时只配置一主一从,所以从节点只有一个。
1、创建从节点slave
,与创建master
时一样,但换个宿主机端口,3306已被master节点占用了
docker run -d --name mysql-5.7-slave\
-p 3307:3306\
-e MYSQL_ROOT_PASSWORD="root"\
-v /opt/software/docker/mysql-slave/conf/:/etc/mysql/conf.d\
-v /opt/software/docker/mysql-slave/data:/var/lib/mysql\
-v /opt/software/docker/mysql-slave/logs:/logs docker.io/mysql:5.7
2、修改主节点配置文件
# 创建并修改文件
vim /opt/software/docker/mysql-slave/conf/my.cnf
将下面的配置写进my.cnf
文件中,开启中继日志
[mysqld]
relay-log=relay-log
relay-log-index=relay-log.index
# id不能与master一样
server-id=2
innodb_file_per_table=ON
skip_name_resolve=ON
3、重启master
节点
docker restart mysql-5.7-slave
4、查看master
的bin_log
状态
进入容器
docker exec -it mysql-5.7-slave /bin/bash
进入容器后连接容器内的mysql
mysql -u root -p
输入密码,连接上后,查看日志配置信息

5、设置主节点信息,并设置主节点日志文件信息
在上面查看日志信息无误后,先断开当前从节点的mysql
连接,不用退出容器,然后连接到主节点的mysql
。
mysql> exit;
Bye
root@698aa1342290:/# mysql -h 172.17.0.2 -u root -p
Enter password:
输入密码后,连接到master
节点,查看日志信息
mysql> show master logs;

先记住上面的最后一个日志文件信息,接下来断开master
节点的连接,回到slave
节点进行配置。
mysql> CHANGE MASTER TO MASTER_HOST='172.17.0.2',MMASTER_USER='repluser',MASTER_PASSWORD='replpassword', MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=632;
查看状态
mysql> show slave status\G;

可以看到IO线程和SQL线程都没有启动,这是因为没有启动从节点的复制线程,接下来启动它。
mysql> start slave;
start slave
不带参数则同时启动IO线程和SQL线程,相当于start slave io_thread;
+start slave sql_thread;

6、测试
在master
中创建一个数据库,看看slave
中是否也存在这个库。
master
mysql> create database `ms_db` default character set utf8mb4;
slave
mysql> show databases;
如果在slave
中存在数据库ms_db
,则说明测试成功,主从复制已实现。
优化
虽然主从复制是实现了,但还有好多地方需要在实践中进行优化,例如主从同步延迟,事务数据一致性问题等。