目录
前言
本文介绍如何基于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文件太大后恢复数据时间过长