当前位置: 首页 > news >正文

09-MySQL主从复制

01-主从复制原理

MySQL主从复制是一种用于实现数据备份、读写分离和扩展性的技术。它基于二进制日志(Binary Log)来将主数据库上的更改操作同步到一个或多个从数据库。
MySQL主从复制的基本原理如下:

  1. 主服务器(Master)记录二进制日志:主服务器记录所有对数据库的修改操作,包括更新、插入和删除等,并将这些操作记录在二进制日志中。
  2. 从服务器(Slave)连接到主服务器:从服务器通过配置文件指定主服务器的地址和认证信息,然后与主服务器建立连接。
  3. 从服务器请求复制数据:从服务器向主服务器发送复制请求,请求成为主服务器的一个从服务器。
  4. 主服务器接受复制请求:主服务器接受从服务器的复制请求,并将相关的复制信息记录到主服务器的二进制日志中。
  5. 从服务器获取并应用复制数据:从服务器连接到主服务器后,开始从主服务器的二进制日志中获取复制数据,并将这些数据应用到自己的数据库中,实现数据的同步。
  6. 周期性地重复复制过程:从服务器会周期性地检查主服务器的二进制日志,获取新的复制数据并应用到自己的数据库中,以保持与主服务器的数据同步。

主从复制可以实现以下功能:

  1. 数据备份和恢复:通过主从复制,从服务器作为备份,可以随时恢复到主服务器的数据状态。
  2. 读写分离:主服务器负责处理写操作,从服务器负责处理读操作,从而分担了主服务器的负载。
  3. 高可用性:如果主服务器发生故障,可以快速切换到从服务器,保证系统的高可用性。

02-主从复制实战

2-1 主服务器设置

主服务容器的部署工作大体分为以下 5 步 :

  1. 新建主服务器容器实例 3307
  2. 进入/root/mysql/conf 目录下新建my.cnf
  3. 修改完配置重启主容器实例,进入主容器
  4. 主容器实例内创建数据同步用户

首先依旧得部署数据卷,具体流程工作如下:

mkdir -p /root/mysql/conf
mkdir -p /root/mysql/log
mkdir -p /root/mysql/data
docker run -d -p 3307:3306 --privileged=true -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=8888  --name mysql mysql:5.7

然后在/root/mysql/conf下编辑文件my.cnf,将如下内容写入后重启主容器

[mysqld]
## 设置serverid,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能
log-bin=mall-mysql-bin
##设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
##设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间按,默认为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免从slave端复制中断
## 1062错误是指一些主键重复,1032错误是因为主从数据库不一致
slave_skip_errors=1062

然后我们需要在主容器内创建数据同步用户,创作用户代码如下:

#首先链接mysql服务器
mysql -uroot -p
# 代码将创建一个名为replication_user的用户,并授予其在所有数据库和表上进行复制操作的权限。
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
# 执行以上SQL语句后,刷新MySQL权限以使更改生效:
FLUSH PRIVILEGES;
  • 将password替换为实际的密码。建议使用强密码来保护用户账号。
  • '%'表示该用户可以从任意主机连接到MySQL服务器。如果您只希望特定IP地址或主机名可以连接,请相应地修改连接限制。

2-3 从服务器设置

从服务容器的部署工作大体分为以下 5 步 :

  1. 新建从服务器容器实例 3307
  2. 进入/root/mysql-salve/conf 目录下新建my.cnf
  3. 修改完配置重启从容器实例,进入从容器
  4. 在主数据库中查看主从数据同步状态

首先依旧得部署数据卷,具体流程工作如下:

mkdir -p /root/mysql-slave/cnf
mkdir -p /root/mysql-slave/log
mkdir -p /root/mysql-slave/data
docker run -d -p 3308:3306 --privileged=true -v /root/mysql-slave/log:/var/log/mysql -v /root/mysql-slave/data:/var/lib/mysql -v /root/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=8888  --name mysql-2 mysql:5.7

然后在/root/mysql-slave/conf下编辑文件my.cnf,将如下内容写入后重启从 容器

[mysqld]
## 设置serverid,同一局域网中需要唯一,主机101,从机202
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能
log-bin=mall-mysql-bin
##设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
##设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间按,默认为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免从slave端复制中断
## 1062错误是指一些主键重复,1032错误是因为主从数据库不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
##log_slave_updates表示slave讲复制时间写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super用户权限除外)
read_only=1

然后我们可以在主数据库中查看目前的主从同步状态:
在这里插入图片描述

继而进入mysql-slave容器中,开始在从数据库中配置主从复制。

CHANGE MASTER TO MASTER_HOST='<主服务器IP地址>',MASTER_USER='<主服务器复制用户>',MASTER_PASSWORD='<主服务器复制用户密码>',MASTER_PORT=<主服务器端口>,MASTER_LOG_FILE='<主服务器二进制日志文件>',MASTER_LOG_POS=<主服务器日志位置>;

实际操作中需要注意更多的东西,比如我的实际操作内容是:

CHANGE MASTER TO MASTER_HOST='192.168.254.128',MASTER_USER='slave',MASTER_PASSWORD='king1977',MASTER_PORT=3307,MASTER_LOG_FILE='mall-mysgl-bin.000001',MASTER_LOG_POS=749,MASTER_CONNECT_RETRY=30;

然后我们需要在从数据中查看主从同步状态:**show slave status \G;**,此时可以看到主从状态并未开启,我们需要开启主从同步状态。
在这里插入图片描述

在从数据库中开启主从数据同步命令如下:

start slave;
# 然后重新检查主从同步状态,如果两个状态未同时为YES,可以执行以下内容
# 在备库执行 
stop slave; 
reset slave; 
start slave;

03-主从复制测试

主服务器上创建新的数据库和数据表,输入内容如下:

create database db_01;
use db_01;
crate table tb_01(id int,name varchar(20));

此时主服务器和从服务器数据库内容如下:
主服务器数据库
image.png
从服务器数据库
image.png
至此一主一从的主从复制顺利完成,在后续的学习实战中,我想要实现一主多从的自动化部署,这点后续可以作为学习的重点。

相关文章:

  • idea 一直卡在maven正在解析maven依赖
  • asp.net core 生命周期
  • SpringBoot Kafka消费者 多kafka配置
  • 【星海出品】flask(一)demo
  • 【Nginx39】Nginx学习:upstream服务器组模块
  • 教给孩子们如何认真听讲
  • windowCPU虚拟化已禁用解决方案
  • AIX5.3安装weblogic10.3
  • 已解决:rm: 无法删除“/opt/module/zookeeper-3.4.10/zkData/zookeeper_server.pid“: 权限不够
  • 【23真题】简单!原题很多!211!
  • IEC104 工具和代码库
  • 【使用教程】在Ubuntu下PMM60系列一体化伺服电机通过PDO跑循环同步位置模式详解
  • Android 12.0 内置MTK平台音乐播放器
  • pytorch搭建squeezenet网络的整套工程(升级版)
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Android框架之Volley
  • angular组件开发
  • canvas 绘制双线技巧
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • css的样式优先级
  • IDEA常用插件整理
  • Java基本数据类型之Number
  • PAT A1120
  • php面试题 汇集2
  • React-flux杂记
  • SQL 难点解决:记录的引用
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue UI框架库开发介绍
  • 给github项目添加CI badge
  • 给初学者:JavaScript 中数组操作注意点
  • 基于web的全景—— Pannellum小试
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 详解移动APP与web APP的区别
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • #pragma once与条件编译
  • $.each()与$(selector).each()
  • (3)nginx 配置(nginx.conf)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (三)模仿学习-Action数据的模仿
  • (一)基于IDEA的JAVA基础1
  • (原)Matlab的svmtrain和svmclassify
  • (转)一些感悟
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET 反射 Reflect
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • /bin/bash^M: bad interpreter: No such file or directory
  • /etc/skel 目录作用
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [ JavaScript ] JSON方法