docker配置mysql 主从复制

  • 前言
  • 配置前准备
  • 1.创建两个数据库
  • 2.获取主库容器的ip地址
  • 主库配置
  • 1.编辑my.cnf配置文件
  • 2.重启容器
  • 3.查看二进制日志是否开启
  • 4.查看主节点的server id
  • 5.创建有复制权限的用户slave
  • 6.查看File和Position字段的值
  • 从库配置
  • 1.编辑my.cnf配置文件
  • 2.重启容器
  • 3.进入从数据库设置主数据库信息
  • 4.启动主从复制
  • 5.查看主从同步状态
  • 6.设置从库只读
  • 测试
  • 1.主库中创建数据库
  • 2.测试从库是否只读



前言

主从数复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。

且从库可以用做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失 。随着架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

读写分离,使数据库能支撑更大的并发 。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

接下来我们将讲述使用Docker配置MySQL的主从数据库,安全带系好,发车咯!!!

配置前准备

1.创建两个数据库

在配置mysql主从数据库前,我们需要拥有两个mysql数据库容器,分别作为我们的主从数据库。因此,我们需要先创建两个容器,分别命名为mysql-master 作为主库,mysql-slave 作为从库。(具体创建docker容器的命令可参考如下)

# 创建主库容器
docker run -p 3301:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d hub.c.163.com/library/mysql
# 创建从库容器
docker run -p 3302:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d hub.c.163.com/library/mysql
2.获取主库容器的ip地址

在后续的配置中,我们需要使用到主库容器的ip地址,因此,我们需要使用如下的docker命令获取容器的ip地址:

# 获取主库容器的ip地址
docker inspect mysql-master

docker安装mysql并自动配置主从 docker mysql 主从配置_mysql


使用如下命令分别进入容器

# 进入主库容器
docker exec -it mysql-master bash
# 进入从库容器
docker exec -it mysql-slave bash

由于从docker拉取的镜像是最简的镜像,所以容器中是没有安装vim编辑器的,但在后续的配置中,我们需要使用vim编辑器对mysql的配置文件进行修改,因此,我们需要在两个容器中都安装vim编辑器 ,安装vim编辑器的命令如下:

apt-get update
apt-get install vim

等待vim编辑器安装完毕后,我们的准备工作也就完成啦,接下来将进入正式配置主从数据库的环节。

主库配置

1.编辑my.cnf配置文件

首先我们需要对主库的mysql配置文件进行修改,配置文件一般在/etc/mysql/my.cnf 或者/etc/my.cnf ,小伙伴们需要按照自己的情况进行修改。因为我这边mysql配置文件在/etc/mysql/my.cnf ,所以使用该路径进行举例。使用vim命令,编辑my.cnf文件,在 [mysqld] 下添加如下信息:

# 同一局域网内注意要唯一
server-id=100
# 开启二进制日志功能,可以随便取
log-bin=mysql-bin

docker安装mysql并自动配置主从 docker mysql 主从配置_数据库_02

2.重启容器

修改完成后,保存文件,退出容器并重启

docker安装mysql并自动配置主从 docker mysql 主从配置_mysql_03

3.查看二进制日志是否开启
SHOW GLOBAL VARIABLES LIKE '%log%';

docker安装mysql并自动配置主从 docker mysql 主从配置_mysql_04

4.查看主节点的server id
SHOW GLOBAL VARIABLES LIKE '%server%';

docker安装mysql并自动配置主从 docker mysql 主从配置_数据库_05

5.创建有复制权限的用户slave
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%' IDENTIFIED by '123456';
# 刷新配置
FLUSH PRIVILEGES;

docker安装mysql并自动配置主从 docker mysql 主从配置_mysql_06

6.查看File和Position字段的值
show master status;

docker安装mysql并自动配置主从 docker mysql 主从配置_mysql_07


注意: 主库重启后,Position字段的值将会发生改变,因此,到测试阶段前,我们最好不要再对主库做其他操作

从库配置

1.编辑my.cnf配置文件

在 [mysqld] 下加入如下信息

##设置server_id,注意要唯一
server-id=101  
#开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
#relay_log配置中继日志
relay_log=edu-mysql-relay-bin

docker安装mysql并自动配置主从 docker mysql 主从配置_数据库_08

2.重启容器

docker安装mysql并自动配置主从 docker mysql 主从配置_mysql_09

3.进入从数据库设置主数据库信息

进入从数据库,执行如下命令(命令参数说明:master_host 是主库的ip地址;master_user 在主库设置的具有复制权限的用户名;master_log_file 主库配置环节中File字段的值,master_log_pos 主库配置环节中Position字段的值)

change master to master_host='172.17.0.5', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=856, master_connect_retry=30;
4.启动主从复制
start slave;
5.查看主从同步状态
show slave status \G;

docker安装mysql并自动配置主从 docker mysql 主从配置_mysql_10

6.设置从库只读
# 开启只读
show global variables like "%read_only%";
# 对所有用户生效,包括super用户(不建议使用)
flush tables with read lock;
# 只对普通用户生效,如slave用户
set global read_only=1;
show global variables like "%read_only%";
# 关闭只读
unlock tables;
set global read_only=0

docker安装mysql并自动配置主从 docker mysql 主从配置_数据库_11

测试

1.主库中创建数据库

在 主库 中执行create database test; ,创建数据库test

docker安装mysql并自动配置主从 docker mysql 主从配置_mysql_12


此时我们在 从库中执行show databases;

查看从库中所有的数据库(可以发现,从库中已经多了一个test数据库)

docker安装mysql并自动配置主从 docker mysql 主从配置_docker_13

2.测试从库是否只读

因为从库我们设置的权限是只读,因此,从库是不具备删除数据库的功能的,那么接下来我们使用命令drop database test; 尝试删除test数据库

docker安装mysql并自动配置主从 docker mysql 主从配置_docker_14


可以看到,mysql给我们报错显示,我们不可以对数据库进行删除。