使用docker在虚拟机实现mysql数据库的主从复制
构建数据库的数据和配置目录
主库的数据目录
mkdir -p /usr/local/docker_local/mysql_master/data & mkdir -p /usr/local/docker_local/mysql_master/conf
从库的数据目录
mkdir -p /usr/local/docker_local/mysql_slave/data & mkdir -p /usr/local/docker_local/mysql_slave/conf
配置主从库的配置文件
复制docker实例中的配置文件到之前配置的配置目录
使用docker拉取数据库镜像
docker pull mysql
根据镜像运行数据库实例
docker run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name tem_databse mysql
进入数据库实例
docker exec -it tem_databse /bin/bash
复制配置文件的内容,然后在之前的配置目录生成两个一样的配置文件
分别配置主从配置文件
主机配置文件:
[mysqld]
server-id=1 # 全局唯一,取值[1,2^32-1],默认为1
binlog-do-db=test # 表示需要复制的是哪个库
从机的配置文件:
[mysqld]
server-id=2 # 全局唯一,不能与主库相同
replicate-do-db=test # 与主库相同,表示对该库进行复制
删除原来的用来复制配置文件的docker实例
docker rm -f tem_database
使用主环境的配置文件分别启动主从数据库
启动主库
docker run -d -p 3306:3306 --privileged=true -v /usr/local/docker_local/mysql_master/conf/my.cnf:/etc/my.cnf -v /usr/local/docker_local/mysql_master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name master mysql
启动从库
docker run -d -p 3307:3306 --privileged=true -v /usr/local/docker_local/mysql_slave/conf/my.cnf:/etc/my.cnf -v /usr/local/docker_local/mysql_slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name slave mysql
查看启动成功的两个数据库
docker ps -a
此处是up,说明启动成功
ps:-v参数用来映射主环境和实例环境的配置的位置,MYSQL_ROOT_PASSWORD配置的是数据库root账号的密码
分别创建数据库,并且进行数据备份
进入主机实例
docke exec -it master /bin/bash
登录数据库
mysql -uroot -proot
create database test;
use test;
CREATE TABLE user(
id BIGINT PRIMARY KEY,
name VARCHAR(30) NOT NULL
);
数据备份
如果原本主机中有数据,需要进行数据备份
FLUSH TABLES WITH READ LOCK;
开启主库的另一个终端,使用mysqldump导出:
mysqldump -u root -p --all-databases --master-data > dbdump.db
导出完成后,解除读锁:
UNLOCK TABLES;
查看主机状态
SHOW MASTER STATUS;
需要把File以及Position记录下来,后面从库的配置需要用到。
创建用户
注意创建用户需要加上mysql_native_password,否则会导致从库一直处于连接状态:
CREATE USER 'repl'@'172.17.0.3' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION slave ON *.* TO 'repl'@'172.17.0.3';
这是从库实例登录主库进行日志读取的,具体的HOST地址请根据从库的地址修改,可以先看后面的从库配置部分。
PS:从库数据配置和以上大同小异,需要注意的是,如果从库的实例和主库的实例是使用同一个镜像生成的,需要修改从库的auto.cnf里面的UUID,使其于主库不同,改完之后重启从库。
配置从库,实现主从复制
进入从库
docker exec -it slave /bin/bash && mysql -uroot -proot;
配置主库的连接和同步信息,host账号密码都是之前新建的同步账号的,这里的host就是从库所在实例的host,这里的binlog日志和日志的定位位置,就是之前在主库show master status看到的,数据库每次重启都会生成一个新的binlog日志,所以要对应准确
CHANGE REPLICATION SOURCE TO
source_host='172.17.0.2',
source_user='repl',
source_password='123456',
source_log_file='binlog.000008',
source_log_pos=157;
配置完成后,查看连接情况