文章目录
MySQL主从复制介绍
MySQL的主从复制(Master-Slave Replication)是一种数据同步技术,用于将数据从一个MySQL主服务器(Master)复制到一个或多个从服务器(Slave)。这种架构可以提供以下优势:
1.读写分离:主从复制可以将数据库的读写操作分离。主服务器执行写操作和更新,而从服务器只执行读操作,这有助于提高系统的性能和可扩展性。
2.数据备份:从服务器可以作为主服务器的备份,防止数据丢失。当主服务器发生故障时,可以切换到从服务器,保证业务的连续性。
3.负载均衡:通过将读操作分配到多个从服务器上,可以平衡负载,提高系统的吞吐量和响应速度。
4.扩展性:主从复制可以轻松地添加更多的从服务器,以满足不断增长的业务需求。
主从复制的过程如下:
主服务器将数据更改记录到二进制日志(Binary Log)中。
从服务器连接到主服务器,并请求主服务器发送二进制日志中的更改事件。
主服务器将二进制日志中的事件发送给从服务器,从服务器将这些事件写入到自己的中继日志(Relay Log)中。
从服务器读取中继日志中的事件,并将这些更改应用到自己的数据库中,从而实现与主服务器的数据同步。
总之,MySQL的主从复制是一种常见的数据同步技术,用于提高系统的性能、可扩展性和数据安全性。
一、环境准备
MySQL版本:8.0及以上
Docker-compose环境
创建主库目录及数据目录【用于挂载】
mkdir -p /data/master/database
mkdir -p /data/master/docker
创建从库目录及数据目录【用于挂载】
mkdir -p /data/slave/database
mkdir -p /data/slave/docker
二、配置文件
my.cnf配置文件
主库配置
vim /data/master/docker/mysql/conf/my.cnf
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
# #主库----start--- 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
# #主库----end---
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
从库配置
vim /data/slave/docker/mysql/conf/my.cnf
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
# #从库----start---
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
# #从库----end---
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
Dockerfile配置
主库配置
vim /data/master/docker/mysql/Dockerfile
# 使用官方的mysql作为基础镜像
FROM mysql:8.0.19
# 设置mysql用户和组
ENV MYSQL_ROOT_USER: root \
MYSQL_ROOT_PASSWORD: 123456\
MYSQL_ROOT_HOST: localhost
# 定义数据目录
ENV MYSQL_DATA_DIR=/var/lib/mysql
# 创建数据目录
RUN mkdir -p $MYSQL_DATA_DIR && chown -R mysql:mysql $MYSQL_DATA_DIR
# 暴露mysql的端口号
EXPOSE 3306
从库配置
vim /data/slave/docker/mysql/Dockerfile
# 使用官方的mysql作为基础镜像
FROM mysql:8.0.19
# 设置mysql用户和组
ENV MYSQL_ROOT_USER: root \
MYSQL_ROOT_PASSWORD: 123456\
MYSQL_ROOT_HOST: localhost
# 定义数据目录
ENV MYSQL_DATA_DIR=/var/lib/mysql
# 创建数据目录
RUN mkdir -p $MYSQL_DATA_DIR && chown -R mysql:mysql $MYSQL_DATA_DIR
# 暴露mysql的端口号
EXPOSE 3306
docker-compose.yml配置
主库
vim /data/master/docker-compose.yml
version: '3.0'
# 服务容器配置
services:
mysql:
restart: always
build:
context: ./docker/mysql
ports:
- "3306:3306"
volumes:
- /data/master/database/data:/var/lib/mysql
- /data/master/database/logs:/var/log/mysql
- ./docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
- ./docker/mysql/conf/conf.d:/etc/mysql/conf.d
environment:
MYSQL_ROOT_PASSWORD: 123456
从库
vim /data/slave/docker-compose.yml
version: '3.0'
# 服务容器配置
services:
mysql:
restart: always
build:
context: ./docker/mysql
ports:
- "4306:3306"
volumes:
- /data/slave/database/data:/var/lib/mysql
- /data/slave/database/logs:/var/log/mysql
- ./docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
- ./docker/mysql/conf/conf.d:/etc/mysql/conf.d
environment:
MYSQL_ROOT_PASSWORD: 123456
三、实操
1.启动容器【主库和从库】
cd /data/master
docker-compose up -d --build
容器正常启动、MySQL服务正常启动如下
2.连接并操作主从库
连接主库
docker-compose exec -it mysql bash
mysql -u root -p
在主库创建用户并授权
CREATE USER ‘slave’@‘%’ IDENTIFIED BY ‘123456’;
GRANT REPLICATION SLAVE ON . TO ‘slave’@‘%’;
刷新权限
FLUSH PRIVILEGES;
查看主服务器状态(显示如下图)
show master status;
连接从库
pass
订阅主从关系命令如下【以下命令要在MySQL控制台执行】
change master to master_host=‘MySQL主服务器IP地址’,master_port=3306,master_user=root,master_password=‘123456’,master_log_file=‘mysql-bin.000010’,master_log_pos=4580;
#配置详解
/*
change master to
master_host=‘MySQL主服务器IP地址’,
master_user=‘之前在MySQL主服务器上面创建的用户名’,
master_password=‘之前创建的密码’,
master_log_file=‘MySQL主服务器状态中的二进制文件名’,
master_log_pos=‘MySQL主服务器状态中的position值’;
*/
#启用从库
start slave;
#查看从库状态(如下图)
show slave status\G;
3.测试主从
测试步骤省略
总结
1.这种方式适用于全新的主从搭建,如果主库存在了一段时间才开始搭建从库同步主从的话,需要做一次主库的全量备份作为从库的基础数据源,在重新恢复新的主从,不然主从同步会出错。
2.记一次已经存在主从,需要重新搭建主库的情况下,如果主库配置参数一致的话需要stop slave,先把从库停掉,不然主库容器无法启动。
3.从库容器重新构建(up -d --build)/重启不影响主从(无需再订阅主从)