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

了解MySQL 高可用架构:主从备份

        为了防止数据库的突然挂机,我们需要对数据库进行高可用架构主从备份是常见的场景,通常情况下都是“一主一从/(多从)”。正常情况下,都是主机进行工作,从机进行备份主机数据,如果主机某天突然意外宕机,从机可以立刻工作而不会数据丢失。  

1.复制原理

        复制是基于源服务器在其二进制日志中跟踪对其数据库的所有更改(更新、删除等)。二进制日志作为从服务器启动开始修改数据库结构或内容(数据)的所有事件的书面记录。通常,不记录SELECT语句,因为它们既不修改数据库结构,也不修改内容。

        连接到源的每个副本都请求一个二进制日志的副本。也就是说,它从源提取数据,而不是源将数据推送到副本。副本还执行它接收到的二进制日志中的事件。这样做的效果是重复在源代码上所做的原始更改。创建表或修改表的结构,并根据最初在源上所做的更改插入、删除和更新数据。 

        因为每个副本都是独立的,所以源二进制日志中的更改在连接到源的每个副本上都是独立发生的。此外,由于每个副本只从源端请求二进制日志的副本,因此副本能够以自己的速度读取和更新数据库副本,并且可以随意启动和停止复制过程,而不会影响更新到源端或副本端的最新数据库状态的能力。 

2.实现方式

       主从同步的原理就是基于 binlog 进行数据同步的。在主从复制过程中,会基于 3 个线程 来操作,一个主库线程,两个从库线程。 MySQL的复制功能使用以下类型的线程实现:
        二进制日志转储线程。源程序创建一个线程,以便在副本连接时将二进制日志内容发送到副本。这个线程可以在源程序上的SHOW PROCESSLIST的输出中被识别为Binlog转储线程。
        从库I/O接收线程。当在副本服务器上发出START REPLICA语句时,副本会创建一个I/O(接收方)线程,该线程连接到源服务器,并要求源服务器发送记录在其二进制日志中的更新。
        从库接收线程读取源的Binlog Dump线程发送的更新(参见上一项),并将它们复制到本地文件中,这些文件包含副本的中继日志。这个线程的状态在SHOW REPLICA STATUS的输出中显示为Slave_IO_running。

        从库SQL应用程序线程。当replica_parallel_workers等于0时,副本创建一个SQL(应用程序)线程来读取复制接收线程写入的中继日志,并执行其中包含的事务。当replica_parallel_workers为N >= 1时,有N个应用程序线程和一个协调器线程,它们依次从中继日志中读取事务,并安排它们由工作线程应用。每个工作者应用协调器分配给它的事务。 

        通过将系统变量replica_parallel_workers设置为大于0的值,可以为副本上的任务启用进一步的并行化。完成此操作后,副本创建指定数量的工作线程来应用事务,外加一个协调器线程,该线程从中继日志中读取事务并将其分配给工作线程。将replica_parallel_workers(slave_parallel_workers)的值设置为大于0的副本称为多线程副本。如果使用多个复制通道,则每个通道都有使用此变量指定的线程数。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【H2O2|全栈】关于CSS(3)CSS基础(三)
  • 大屏自适应缩放解决方案
  • 跨平台集成:在 AI、微服务和 Azure 云之间实现无缝工作流
  • 如何在YoloV8中添加注意力机制(两种方式)
  • PyTest装饰器
  • 腾讯云、阿里云、华为云优惠券领取、查看、使用教程分享
  • C++ 中的 override 和 overload的区别
  • 旋转电连接器航空插头插座的特点
  • 《深度学习》OpenCV轮廓检测 模版匹配 解析及实现
  • QT信号槽原理是什么,如何去使用它?
  • [前端][JS]html中js不同位置的区别
  • 87-java 可轮询锁和定时锁
  • Vue3图片上传报错:Required part ‘file‘ is not present.
  • HarmonyOS NEXT应用开发性能实践总结
  • 有没有视频加字幕免费软件?值得收藏的10款字幕编辑软件推荐!
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Angular 响应式表单 基础例子
  • Apache Spark Streaming 使用实例
  • Java-详解HashMap
  • jdbc就是这么简单
  • laravel 用artisan创建自己的模板
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring Boot快速入门(一):Hello Spring Boot
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring-boot 启动时碰到的错误
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 开发基于以太坊智能合约的DApp
  • 开源SQL-on-Hadoop系统一览
  • 类orAPI - 收藏集 - 掘金
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 云大使推广中的常见热门问题
  • Linux权限管理(week1_day5)--技术流ken
  • 阿里云API、SDK和CLI应用实践方案
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #DBA杂记1
  • #vue3 实现前端下载excel文件模板功能
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (1)Jupyter Notebook 下载及安装
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)二分查找 超详细
  • (java)关于Thread的挂起和恢复
  • (二)springcloud实战之config配置中心
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat批处理(一):@echo off
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net插件开发开源框架