mac(m1) 用docker创建三个mysql做主从复制
先安装docker(m1已适配)启动
因为docker是动态IP,每次启动mysql时IP会变,所以先设置静态ip地址
docker network create --subnet=172.172.0.0/16 docker-static
说明:
172.17.0.0 是自定义的网段(根据自己电脑可随意指定)
docker-static 是自定义的名字(可以随便叫)
可以使用docker network rm docker-static 移除网桥
补: docker默认的有三种网络类型,bridge、host和none
- bridge:网络桥接
- 默认情况下启动、创建容器都是用该模式,所以每次docker容器重启时会按照顺序获取对应ip地址,这就 导致容器每次重启,ip都发生变化
- none:无指定网络
- 启动容器时,可以通过–network=none,docker容器不会分配局域网ip
- host:主机网络
- docker容器的网络会附属在主机上,两者是互通的。
可以通过 docker network ls
可以查看到网络类型中多了个docker-static
下载mysql镜像
docker pull mysql/mysql-server:5.7
创建容器 _(主库,我这里叫mysql3307)
docker run -p 3307:3306 --net docker-static --ip 172.172.0.2 --name mysql3307 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:5.7
可以通过**docker inspect mysql3307
**查看ip地址
说明:
-p 3307:3306: 第一个3307为本地端口号,第二个3306为容器中mysql的端口号
--net docker-static: 为指定ip地址(可以随意指定,必须是docker-static中的网段)
--name: 为mysql起的名称(可以随便叫)
-e MYSQL_ROOT_PASSWORD=123456: 为数据库密码123456
-d mysql/mysql-server:5.7: 镜像文件
因为mysql5.7使用视图工具无法连接,所以我们先赋予mysql权限
1.链接数据库
①.查看id
docker ps
②.进入新建的mysql3307中
docker exec -it d2d898f0d95c /bin/sh
注:d2d898f0d95c 是mysql3307的id
2.赋予权限
①.登录
mysql -uroot -p123456
②修改远程连接权限
mysql>use mysql;
mysql>update user set host = '%' where user ='root';
mysql>flush privileges;
mysql>select 'host','user' from user where user='root';
③输入exit 退出
使用视图工具连接数据库,发现可以连接
使用同样的方法创建第二个和第三个数据库
docker run -p 3308:3306 --net docker-static --ip 172.172.0.3 --name mysql3308 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:5.7
docker run -p 3309:3306 --net docker-static --ip 172.172.0.4 --name mysql3309 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:5.7
—重复上面操作给数据库赋予远程连接权限
创建数据库的主从关系
-
新建好的有三个mysql分别是 mysql3307 | mysql3308 | mysql3309 分别占用3307,3308和3309三个端口号,ip地址分别是172.172.0.2 | 172.172.0.3 | 172.172.0.4
-
创建一个文件夹叫mysql–(我这里创建的目录是/opt/mysql)—根目录下创建三个文件夹与创建的三个mysql对应
-
这里我创建的三个文件夹是
/opt/mysql/3307
/opt/mysql/3308
/opt/mysql/3309
创建文件夹的目的是存放my.cnf文件的
打开终端
1.先把cocker容器中mysql的my.cnf文件复制出来
docker cp mysql3307:/etc/my.cnf /opt/mysql/3307
docker cp mysql3308:/etc/my.cnf /opt/mysql/3308
docker cp mysql3309:/etc/my.cnf /opt/mysql/3309
2.修改配置文件,在my.cnf中加入
主库:3307
#[mysqld] 在该节点后加上
#log-bin=mysql-bin使用binary logging,mysql-bin是log文件名的前缀
#server-id=1唯一服务器ID
log-bin=mysql-bin
server-id=1
两个从库:3308,3309
#[mysqld] 在该节点后加上
#log-bin=mysql-bin使用binary logging,mysql-bin是log文件名的前缀
#server-id=1唯一服务器ID
log-bin=mysql-bin
server-id=2
read-only=1
#[mysqld] 在该节点后加上
#log-bin=mysql-bin使用binary logging,mysql-bin是log文件名的前缀
#server-id=1唯一服务器ID
log-bin=mysql-bin
server-id=3
read-only=1
3.替换配置文件
docker cp /opt/mysql/3307/my.cnf mysql3307:/etc/my.cnf
docker cp /opt/mysql/3308/my.cnf mysql3308:/etc/my.cnf
docker cp /opt/mysql/3309/my.cnf mysql3309:/etc/my.cnf
4.重启
docker restart mysql3307
docker restart mysql3308
docker restart mysql3309
5.用视图工具连接三个mysql
此时查看主库mysql3307的ip地址应该是172.17.0.2
docker inspect mysql3307
6.在数据库中新建查询
主库执行:
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%' IDENTIFIED BY 'backup';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'backup'@'%';
两个从库执行:
stop slave;
CHANGE MASTER TO MASTER_HOST='172.172.0.2',MASTER_PORT=3306,MASTER_USER='backup',MASTER_PASSWORD='backup';
START SLAVE;
大功告成此时主从关系已经配好了!!!
检验:执行查询
SHOW SLAVE STATUS;
Slave_IO_Running 字段为 Yes
Slave_SQL_Running 字段为 Yes
测试:在mysql3307中新建数据库,此时mysql3308和mysql3309将会同步!!!!!