基于docker部署mysql主从复制集群

前言

本文介绍如何基于docker部署一主一从的mysql集群

部署mysql

首先我们先启动两个mysql容器,安装docker的步骤在此不做介绍

1、先直接启动一个mysql容器
docker run --name testMysql -p 8901:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.29
2、把配置文件拷贝出来,因为我们主从架构需要用到配置文件,使用考虑使用挂载的方式修改配置文件
docker cp testMysql:/etc/mysql/mysql.conf.d/mysqld.cnf /usr/local/
mysql-cluster/master/config/mysqld.cnf
docker cp testMysql:/etc/mysql/mysql.conf.d/mysqld.cnf /usr/local/
mysql-cluster/slave/config/mysqld.cnf
3、删除我们刚才的容器,我们仅仅是为了拿到配置文件
docker stop testMysql
docker rm testMysql
4、修改配置文件内容

master的mysqld.cnf新增内容

log-bin=/var/lib/mysql/mysql-bin
server_id=1

slave的mysqld.cnf新增内容

log-bin=/var/lib/mysql/mysql-bin
server_id=1

log-bin:主从复制基于mysql的binlog文件实现,这里指定binlog的路径
server_id:区分不同的mysql节点,集群内该id不能相同

配置需要加到[mysqld]标签下才能生效,修改后如图
在这里插入图片描述

5、启动master和slave节点
docker run --name master -p 8901:3306 -v /usr/local/mysql-cluster/master/mysql:/var/lib/
mysql -v /usr/local/mysql-cluster/master/config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.29

docker run --name slave -p 8902:3306 -v /usr/local/mysql-cluster/slave/mysql:/var/lib/
mysql -v /usr/local/mysql-cluster/slave/config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.29
6、进入master容器内

执行:docker exec -it master /bin/sh

连接mysql,执行:mysql -uroot -p123456

为slave创建角色,并且配置权限

CREATE USER 'repl'@'121.40.54.206' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'121.40.54.206';
FLUSH PRIVILEGES;

如果有多个slave节点,使用同一个用户,也可以把IP设置成通配符的方式,例如192.168.44.*

在这里插入图片描述

7、获取binlog名字和position

接下来要获取最新的binlog文件名和position

show master status;

在这里插入图片描述

记住file名字和position,后面会用到。
这个时候master不要发生写操作,否则position和file可能会变化。

8、开启主从同步

配置slave连接到master

slave进入容器:docker exec -it slave /bin/sh
连接mysql,执行:mysql -uroot -p123456

连接到master,master_log_file和master_log_pos从上面master的状态获取

change master to master_host='121.40.54.206',master_port=8901, master_user='repl', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=771;

执行以下命令

stop slave;                                                      
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;                                                      

再查看slave状态
show slave status\G;

在这里插入图片描述
当看到IO线程(Slave_IO_Running)和SQL线程(Slave_SQL_Running)都是YES,那么基本上已经配置成功了

如果是NO,可以查看slave容器的日志来排除异常

docker logs slave -f
在这里插入图片描述
我们这里启动正常,没有异常出现

9、测试是否主从配置成功

我们用navcat客户端连接上我们启动的两个数据库,然后在端口8901的数据库新建了一个mytest的数据库以及一张testtable的表,然后查看8902端口的数据库,可以看到正常的同步了
在这里插入图片描述

总结

配置主从时需要注意以下几点:

  • 1、确保客户端不要有任何写的操作
  • 2、先确保做主从的数据库之间的数据保持一致

扩展:
docker安装的mysql,存在多个配置文件

主配置文件:/etc/mysql/my.cnf

my.cnf的内容显示包含/etc/mysql/conf.d和/etc/mysql/mysql.conf.d两个文件夹的配置

所以以下配置也会生效:

  • 1、/etc/mysql/conf.d/mysql.cnf
  • 2、/etc/mysql/mysql.conf.d/mysqld.cnf

区别在于mysql.cnf里面一般配置[mysql]标签相关的配置,mysqld.cnf里面一般配置[mysqld]标签相关的配置,我们对服务端的一些配置主要是数据[mysqld]的,所以我们一般挂载/etc/mysql/mysql.conf.d/mysqld.cnf的配置文件即可

binlog日志文件的作用有以下几点

  • 1、做主从集群,使用binlog进行数据同步
  • 2、做数据恢复,binlog记录了一条条写sql语句的记录,所以当我们数据被删库后,比如我们在今天9点被删库了,首先我们使用之前最近的备份数据进行恢复,然后我们缺少最近的备份到今天9点的数据,所以我们只要找到这直接的SQL,让mysql重新执行一遍即可达到恢复最新数据。注意定期备份数据是必然的,因为binlog文件太大后恢复数据时间过长
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值