一、环境搭建

虚拟机环境:centos7 IP:192.168.37.134  用户名:root   密码:123

启动3个容器,一个是master,端口是3307,另外两个是slaver,端口是3308和3309

docker pull mysql:5.7

docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7
docker run -p 3308:3306 --name mysql-slaver1 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7
docker run -p 3309:3306 --name mysql-slaver2 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7

 

docker部署mysql 主从配置 docker部署mysql集群_运维

 二、配置mysql-master

进入mysql-master容器,修改/etc/mysql/my.cnf,添加

[mysqld]
server-id=3307  ##自定义id号,不要重
log-bin=mysql-bin  ##开启二进制日志

 

docker部署mysql 主从配置 docker部署mysql集群_数据库_02

docker部署mysql 主从配置 docker部署mysql集群_docker部署mysql 主从配置_03

docker部署mysql 主从配置 docker部署mysql集群_数据库_04

docker部署mysql 主从配置 docker部署mysql集群_开发工具_05

 注意:在使用vim时,可能会出现not found,需要apt-get install vim

修改好my.cnf后,需要重启一下mysql,重启一下mysql-master容器,重新进入容器

service mysql restart
docker start mysql-master
docker exec -it mysql-master /bin/bash

docker部署mysql 主从配置 docker部署mysql集群_运维_06

 进入容器后,登录mysql,为slaver分配一个账号

CREATE USER 'slave'@'%' IDENTIFIED BY '123abc';  ##用户名是slave,密码是123abc
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';  ##指定访问权限

docker部署mysql 主从配置 docker部署mysql集群_mysql_07

查看当前主机状态,注意:查看完状态后就不要再进行其他的操作了,slaver会引用mster的Position编码,每次操作Position都会变。

docker部署mysql 主从配置 docker部署mysql集群_docker部署mysql 主从配置_08

到这里,master就配置完成了,等待slaver的连接。

 三、配置mysql-slaver

以mysql-slaver1为例

进入容器和配置master一样

修改/etc/mysql/my.cnf文件,添加

[mysqld]
server-id=3308  ##id号,自定义,不要重就行
log-bin=mysql-slave-bin   ##开启二进制日志功能
relay_log=edu-mysql-relay-bin  ##配置中继日志

docker部署mysql 主从配置 docker部署mysql集群_开发工具_09

然后是重启mysql,重启容器,重新进入容器,登录mysql进行下一步配置

service mysql restart
docker start mysql-slaver1
docker exec -it mysql-slaver2 /bin/bash
mysql -u root -p

 执行命令进行master的连接,需要配置master的ip,用户名,密码,日志文件和当前版本号

change master to master_host='192.168.37.134', master_user='slave', master_password='abc123', master_port=3307, master_log_file='mysql-bin.000001', master_log_pos= 789, master_connect_retry=30;

docker部署mysql 主从配置 docker部署mysql集群_开发工具_10

查看连接状态

show slave status \G;

docker部署mysql 主从配置 docker部署mysql集群_docker部署mysql 主从配置_11

可以看到当前状态是未开启主从复制,接下来开启,再查看状态

start slave;
show slave status \G;

docker部署mysql 主从配置 docker部署mysql集群_运维_12

docker部署mysql 主从配置 docker部署mysql集群_开发工具_13

当看到这个的时候,说明我们的配置出现了问题,原因是密码写错了,出现这种情况一般就是在连接配置的时候出现了问题。现在改回来重新执行如下代码

stop slave;  #修改之前需要先stop一下
change master to master_host='192.168.37.134', master_user='slave', master_password='123abc', master_port=3307, master_log_file='mysql-bin.000001', master_log_pos= 789, master_connect_retry=30;
start slave;
show dlave status \G;

docker部署mysql 主从配置 docker部署mysql集群_docker部署mysql 主从配置_14

docker部署mysql 主从配置 docker部署mysql集群_运维_15

当看到两个Yes的时候,说明slave配置成功了,并且已经开启了主从复制。

mysql-slaver2配置相同。

四、测试

mysql-master上创建一个数据库,创建表,插入数据

create database test charset utf8;
use test;
create table user(id int(11),name varchar(255))charset utf8;
insert into user(id,name) values(100,'tom'),(101,'jerry');

docker部署mysql 主从配置 docker部署mysql集群_开发工具_16

在其中一台mysql-slaver1上查看数据

docker部署mysql 主从配置 docker部署mysql集群_数据库_17

五、说明一下

1. mysql是按/etc/my.cnf

-> /etc/mysql/my.cnf

-> /usr/local/mysql/etc/my.cnf

-> ~/.my.cnf的顺序读取配置文件的。

如果几个配置文件中都有相同的参数,mysql会以读取的最后一个文件配置参数为准。

2. 集群结构

docker部署mysql 主从配置 docker部署mysql集群_mysql_18

当前的结构是slaver1和slaver2作为master的从机,需要在slaver1和slaver2上配置master的相关信息。

也可以使用串行结构

docker部署mysql 主从配置 docker部署mysql集群_开发工具_19

只不过是slaver2把slaver1认为是master,配置的是slaver1的相关信息

 

在spring项目中,可以配置两个数据源,一个读,一个写。然后DAO层的类分别注入不同的数据源,产生读的bean和写的bean,service调用的时候注入指定的bean就可以啦。