引言:

最近因为时间缘故,学校,比赛,面试很久没有更新了,现在开始将会持续更新!!!欧克。我们往下看:


概述:

        主从复制是指将数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。

好处是 :

  1. 主库出现问题,从库可以快速提供服务

  2. 降低主库的压力,实习读写分离,

  3. 可以在从库中去备份文件,避免备份期间影响主库服务 (数据之间存在延迟)  

缺点:

     1. 数据一致性问题 。从库数据同步存在延迟,无法保证实时一致性
     2. 单点故障问题,虽然从库可以接管,但主库宕机期间无法写入的

     3. 资源消耗啊,配置和维护复杂性等...

原理:

        其实之间的数据一致性主要是靠的日志文件中的二进制日志文件 -> Binlog 日志文件,主库对数据的增删改(DDL) 和 对表库结构的更改(DML) 都会记录到这个二进制日志文件中去,然后从库有两组线程,一组IOthread 线程 一组SQLthread 线程,当配置好用户权限后,IOthread线程会发送一个请求来连接指定的主库,对取主库中的Binlog 日志文件的内容,然后写到自己的一个Relay log (中继日志)文件中去,然后另一组线程SQLthread 会去读取这个中继日志文件的数据变化,然后去执行写入到自己的数据库中去就保证了主从复制 !!!


插曲疑问:为什么不直接读取到binlog 日志的内容修改直接写到从库中去呢?还多一个中继日志

这里的中继日志 有点缓冲区的味道,而且有着性能优化作用,写入中继日志也是顺序,直接库表容易数据IO

小插曲: 主从复制如何推事件的 : 

MySQL实际机制长连接+文件事件监听低(无轮询)毫秒级

        主从复制依赖于从库 I/O 线程主动连接主库并请求 binlog 数据。主库通过 Binlog Dump 线程响应请求,并在有新数据时立即发送(利用阻塞等待机制实现高效“准推送”),而不是主库主动推送或持续通知从库。 

Binlog Dump : 主库收到从库的请求后,会为这个特定的从库连接创建一个专门的 Binlog Dump 线程。每个成功连接的从库在主库上都有自己的 Binlog Dump 线程。

  • Binlog Dump 线程读取主库上的 binlog 文件。

  • 它检查从库请求的 binlog 文件名和位置:

    • 如果请求的位置在当前的 binlog 文件内,则从这个位置开始读取后续事件。

    • 如果请求的位置在更早的 binlog 文件(主库可能已经进行了 binlog 轮转,旧的 binlog 文件可能已被删除或归档),Binlog Dump 线程会尝试找到最早可用的 binlog 文件开头,或者报错(如果文件不可用)。

如图:

从上图来看,复制分成三步:

  1. Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。

  2. 从库读取主库的二进制日志文件 Binlog,写入到从库的中继日志 Relay Log。

  3. slave重做中继日志中的事件,将改变反映它自己的数据。

搭建:

这里我就直接使用了虚拟机通过Docker 来创建2个容器来模拟主从库,其效果也是一致的 !!!

1. 拉取MySQL镜像

docker pull mysql:8.0

 

2. 创建网络(这里方便让容器可以互相通信,后续主库连接使用)

docker network create mysql-replication-net

3. 启动主服务器(Master)

docker run -d --name mysql-master \--network mysql-replication-net \-e MYSQL_ROOT_PASSWORD=rootpassword \-p 3306:3306 \-v mysql-master-data:/var/lib/mysql \mysql:8.0 \--server-id=1 \--log-bin=mysql-bin \--binlog-format=ROW \--character-set-server=utf8mb4 \--collation-server=utf8mb4_unicode_ci

参数:

--name mysql-master     为容器指定名称 mysql-master,便于后续管理

--network mysql-replication-net 

 --server-id=1 指定集群服务下 的 id 为1 从库不能重复 

 --read-only=0   这里没有指定,默认就是0表示读写 1 表示只读

--log-bin=mysql-bin 这里显示启用二进制日志,指定日志文件的前缀为mysql-bin ,MySQL 8.0 默认就开启了

--binlog-format=ROW 这里指定二进制日志文件记录方式为 ROW 模式 (默认也就是ROW)

如图创建并且启动一个主库:

  4. 配置主服务器

        4.1: 接入主服务器容器:

docker exec -it mysql-master mysql -uroot -prootpassword

        4.2 : 创建远程连接账号,并授予主从复制权限:

CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'replpassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

注: 这里我测试环境,同时指定插件为mysql_native_password,避免 MySQL 8.0 默认的 caching_sha2_password 导致的从库连接问题(无需额外配置 SSL)。

4.3 :查看二进制日志的坐标

SHOW MASTER STATUS;

这里记住二进制日志文件,还有行数,后续便于从库定位,决定从哪里开始复制!!! 

5. 启动从服务器(Slave)

docker run -d --name mysql-slave \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-p 3307:3306 \
-v mysql-slave-data:/var/lib/mysql \
mysql:8.0 \
--server-id=2 \
--log-bin=mysql-bin \
--binlog-format=ROW \
--relay-log=mysql-relay-bin \
--log-slave-updates=1 \
--read-only=1 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

 如图:

参数:

这里的 --read-only =1 表示当前的库只是只读,同时指定--server-id = 2 表示当前的服务id 不要重复即可!

6. 配置从服务器

6.1进入从服务器容器:

docker exec -it mysql-slave mysql -uroot -prootpassword

6.2 执行sql语句 (来连接主库)

这里的参数要和上面的一致

CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='replpassword',
MASTER_LOG_FILE='mysql-bin.000006',
MASTER_LOG_POS= 544;

 -- 检查从服务器状态

7. 开始测试: 

首先我们从库主库开始都只有系统表如下:

我们开始操作主库: 

创建一个hz_mn库, 同时在里面创建一个学生表,student 表,然后插入一些数据即可

如下:

CREATE DATABASE IF NOT EXISTS hz_mn;USE hz_mn;CREATE TABLE IF NOT EXISTS student (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255),age INT
);INSERT INTO student(name, age) VALUES('hz', 19);SELECT * FROM student;

如图: 

docker exec -it mysql-master mysql -uroot -prootpassword

然后去查看从库:

docker exec -it mysql-slave mysql -uroot -prootpassword

可以看到 从库 已经同步成功了,也出现了相应的库hz_mn 和表 student,查询student表的情况:

select  * from student;

欧克,没有问题,我们主从复制也就搭建完成了  !!! 

总结:

        主从复制是MySQL高可用架构的基础,理解其原理并掌握搭建方法对于数据库管理员至关重要。通过合理配置,可以实现读写分离、负载均衡、数据备份等多种应用场景。

欧克,我们下次再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911684.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911684.shtml
英文地址,请注明出处:http://en.pswp.cn/news/911684.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux Shell脚本中basename和dirname的详细用法教程

在Linux Shell脚本中,basename和 dirname是两个非常实用的命令,常用于处理文件路径和名称。本文将详细介绍这两个命令的用法,并提供丰富的示例代码,以帮助您更好地理解和应用它们。 一、basename命令 1.1 基本用法 basename命令…

3D世界里的“盗梦空间”!在方块里再造一个世界?高级特效get✅

有没有想过,游戏里的镜子、传送门、或者屏幕上播放的实时3D动画是怎么实现的? 答案就是一项黑科技——渲染目标(Render Targets)。它允许我们不直接渲染到屏幕,而是“偷偷地”渲染到一张幕后的贴图上,然后…

浅析一种基于深度学习算法的维吾尔文OCR技术的实现原理及其应用场景

维吾尔文OCR技术是一种基于人工智能和深度学习技术的维吾尔文光学字符识别工具,能够快速、准确地将印刷体或手写体维吾尔文转换为可编辑、可搜索的数字化文本。该技术适用于政府、教育、出版、金融等多个行业,助力维吾尔文信息的高效处理与智能化管理。 …

如何使用MQTTX软件来进行MQTT协议的测试

下载MQTTX软件 下载地址及说明文档开始使用 - MQTTX 文档,比较详细 为什么使用MQTTX 何时要使用MQTTX软件呢?用来检测物联网模块上云的数据就很方便,当然云上如果有日志系统的话也是可以用的。 物联网模块,以利尔达模块为例 NT26-KCN系列…

ELK 和 OpenShift 中的 EFK

ELK 和 OpenShift 中的 EFK 确实是同类日志解决方案的不同实现,核心功能相似但组件略有差异。以下是详细对比和解释: 1. ELK vs EFK:核心区别 组件ELK 栈EFK 栈(OpenShift 默认)日志收集Logstash(Java 实现…

Python UDP Socket 实时在线刷卡扫码POS消费机门禁控制服务端示例源码

本示例使用的设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1bk8Qc9r&ftt&id17021194999 一、服务端绑定IP开启UDP端口接收消费机提交的请求 import sys import os import socket import time import datetimeIpList[] if sys.pl…

对于高考边界的理解以及未来就业层级的学习与思考

目录 一、2024年高考全国多少考生,文化课,文科理科,分别总分多少分?清北得多少分能上?二、1342万人里面,有多少人能上清北,多少能上985,多少能上211,多少能上二本&#x…

JVM调优实战 Day 4:JVM类加载机制

【JVM调优实战 Day 4】JVM类加载机制 文章内容 在Java虚拟机(JVM)的运行过程中,类加载机制是整个程序启动和运行的基础。它决定了Java类是如何被动态加载到JVM中,并为后续的字节码执行做好准备。理解JVM类加载机制不仅有助于我们…

R 语言中的判断语句

R 语言中的判断语句 在R语言编程中,判断语句是执行条件逻辑的基础。它们允许程序根据特定的条件执行不同的代码块。本文将深入探讨R语言中的几种常见判断语句,包括if语句、if-else语句和switch语句,并探讨它们的用法和场景。 1. if语句 if…

从设备自动化到智能管控:MES如何赋能牛奶饮料行业高效生产?

万界星空科技全新推出的:新一代智能化MES系统,深度融合AI大数据技术,实现生产全流程可视化、智能排产、实时质量追溯与设备互联,助力企业降本增效30%。 现开放免费试用名额,体验智能化生产管理的高效与便捷&#xff01…

TDengine 技术参数配置大全

1. 背景 TDengine 的 taos.cfg 中配置项及使用 SQL 命令 alter 修改的系统变量之间的关系如何,哪些是持久存储项,哪些设置是临时项,这章将详细说明。 本文是技术参考资料,请收藏。 2.定义 1. 全局配置参数 全局配置参数&#…

无人机神经网络模块运行与技术难点

一、神经网络模块的运行方式 1. 分层处理架构 感知层 多模态数据融合:通过八元数卷积网络(OCNN)统一处理LiDAR、摄像头、IMU等异构传感器数据,将点云坐标(x/y/z)、图像RGB与光流信息编码至8维虚部&#…

前端react框架实现打包时间动态加入配置展示在指定页面

注意: 当前方法特定为 create-react-app 构建框架,其他的构建流程不同,不能直接照搬 react-scripts 的方式。 ✅ 目标: 在 React 打包(build)时,自动将当前时间写入代码中某个变量或 console…

原子操作(CAS)

原子操作 原子操作原理什么是原子操作?原子性原子变量相关接口内存序 shared_ptr的实现 原子操作原理 什么是原子操作? 原子操作其实就是指在多线程的环境下,确保对共享变量的操作不会被干扰,从而避免了竞态条件。 我们都知道&…

马克思主义基本原理期末复习下

二十、资本的原始积累 所谓资本原始积累,就是以暴力手段使生产者与生产资料分离资本快速集中于少数人手中,资本主义得以快速发展的历史过程。具体过程其一,用暴力手段夺取农民的土地,如英国圈地运动在国外建立殖民地,…

体育数据api接口,足球api篮球api电竞api,比赛赛事数据api

在体育行业,数据驱动一切,从内容分发到竞猜预测,从用户互动到商业变现,背后少不了一个关键词:数据接口(API)。无论是实时比分、比赛事件、历史统计,还是球员详情、战绩排名&#xff…

Harmony 状态监听 @Monitor和@Computed

Monitor与Computed装饰器在ArkUI状态管理中的协同应用 一、装饰器概述 1. Monitor装饰器 Monitor是ArkUI状态管理V2中的核心装饰器,用于深度监听状态变量的修改: 支持监听嵌套类属性、多维数组项和对象数组中的指定项变化能够获取变化前后的值进行比…

同济大学多模态感知具身导航全面综述

作者: I-Tak Ieong, Hao Tang 单位:同济大学计算机学院,北京大学计算机学院 论文标题: Multimodal Perception for Goal-oriented Navigation: A Survey 论文链接:https://arxiv.org/pdf/2504.15643 主要贡献 基于…

2025年CCF先进音频技术竞赛

由中国计算机学会主办、CCF语音对话与听觉专委会承办、语音之家协办、华为终端有限公司赞助的CCF先进音频技术大赛正式启动。大赛旨在推动国内高等院校及科研院所在音频技术领域的专业人才培养,支持学生科技创新,选拔优秀人才。 赛事官网:ht…

手撕线程池

线程池的目的: 1.复用线程,减少频繁创建和销毁的开销 创建和销毁线程是昂贵的系统操作,涉及内核调度、内存分配; 使用线程池预先创建一批线程,在多个任务间循环复用,避免资源浪费,提高性能。 …