linux和window中使用docker配置mysql主从配置
如果你的是linux中的docker先安装依赖文件
uname -r
sudo yum update
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
国内阿里云的docker镜像
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新所有的yum源
安装yum-utils,它提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2用于储存设备映射(devicemapper)必须的两个软件包。
紧接着配置一个稳定(stable)的仓库
仓库配置会保存到/etc/yum.repos.d/docker-ce.repo文件中。
一、首先拉取docker镜像,我们这里使用5.7.24版本的mysql:
docker image pull mysql:5.7.24
如出现下图表示网络没有连接,检查你的网络
下图表示拉去成功,可能时间会比较慢
二、启动容器
- master(主)
docker run -p 3339:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.24
- slave(从)
docker run -p 3340:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.24
Master对外映射的端口是3339,Slave对外映射的端口是3340。因为docker容器是相互独立的,每个容器有其独立的ip,所以不同容器使用相同的端口并不会冲突。因为我们宿主主机安装了mysql所以docker中mysql容器不在不映射3306端口。但是在docker的mysql容器中我们应该尽量使用mysql默认的3306端口,否则还需要修改mysql的配置也有可能出现无法通过ip连接docker容器内mysql的问题。
参数说明:
语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
通过run命令创建一个新的容器(container)
- -e, --env=[], 指定环境变量,容器中可以使用该环境变量 这里设置的是mysql的root登录的密码为123456,你也可以进行修改
- -p, --publish=[], 指定容器暴露的端口 【映射】 这里master我映射的的是3339,从映射到宿主主机上是3340端口。
- –name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字,起一个名字后期方便找到该容器。
- -h, --hostname="", 指定容器的主机名
- -d, --detach=false, 指定容器运行于前台还是后台,默认为false
运行效果:
此时你可以通过docker ps 查看正在运行的容器
此时你可以使用navicat查看你的连接,不连接也行
三、修改mysql配置文件
1.通过
docker exec -it mysql1 /bin/bash
2.命令进入到Master容器内部,也可以通过
docker exec -it 容器的id /bin/bash命令进入。
提示容器id为
使用 docker ps 即可看见。
3.cd /etc/mysql切换到/etc/mysql目录下,然后vi my.cnf对my.cnf进行编辑。此时会报出
需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim
执行
apt-get update
,然后再次执行
apt-get install vim
即可成功安装vim。然后我们就可以使用vim编辑my.cnf,在my.cnf中添加如下配置:
注意单词拼写问题
4.配置完成之后,需要重启mysql服务使配置生效。使用
service mysql restart
- 完成重启。重启mysql服务时会使得docker容器停止,我们还需要
docker start mysql1
- 启动容器。
docker run -it mysql1 /bin/bash
7.进入docker容器中的 mysql
mysql -uroot -p123456
8.在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
在docker 的mysql1 容器中运行
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
slave 用户名可以自定义 123456 密码可以自己定义
配置Slave(从)
和配置Master(主)一样,在Slave配置文件my.cnf中添加如下配置:
配置完成后也需要重启mysql服务和docker容器,操作和配置Master(主)一致。
链接Master(主)和Slave(从)
在Master进入mysql,执行
show master status;
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
在Slave 中进入 mysql,执行
change master to master_host='172.18.0.2',
master_user='slave',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos= 2830,
master_connect_retry=30;
- 注意 更换ip,日志文件名称,日志文件位置
命令说明:
master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format=’{{.NetworkSettings.IPAddress}}’ 容器名称|容器id查询容器的ip
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在Slave 中的mysql终端执行show slave status \G;用 [\G 数列查看]于查看主从同步状态。
正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status \G;
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
你可以在mysql1的容器中创建数据库,数据表,mysql2中也会同时创建数据库和数据表
php 代码实现读写分离
<?php
//使用docker容器中的mysql数据库 读写分离
/*$sql="insert into `user` value(null,'李四','123456','1')";*/
/*$sql=" select * from `user`";*/
if(strcasecmp(substr(trim($sql),0,6),'select') == 0){//trim除去字符串两端的空格 substr字符串截取 strcasecmp 比较字符串不区分大小写
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1704phpA;port=3340', 'root', 'root');
$dbh->exec("set names utf8");
$stmt= $dbh->query($sql);
print_r( $stmt->fetchAll(2));
}else{
$dbh = new PDO('mysql:host=127.0.0.1;dbname=1704phpA;port=3339', 'root', 'root');
$dbh->exec("set names utf8");
$res= $dbh->exec($sql);
if($res){
echo "ok";
}
}
?>