问:MySQL主从同步的机制梳理?

news2024/12/29 10:47:53

MySQL主从复制是一种数据库复制技术,通过将一个MySQL数据库服务器(主节点)的数据复制到一个或多个其他MySQL数据库服务器(从节点),实现数据的自动同步。这种技术不仅提高了数据的可用性,还能通过读写分离提升系统的性能。本文将介绍MySQL主从数据库节点复制的过程理。

准备阶段

1. 环境准备

首先,需要准备两台主机,其中一台作为主服务器(Master),另一台作为从服务器(Slave),并确保两台主机都装有MySQL数据库。例如,主服务器的IP地址可以是192.168.198.140,端口号为3306;从服务器的IP地址可以是192.168.168.141,端口号也为3306。

2. 配置MySQL

在主服务器上,编辑MySQL配置文件(通常是/etc/my.cnf),启用二进制日志(Binary Log)功能,并设置唯一的server-id。例如:

[mysqld]
server-id=1
log-bin=mysql-bin

在从服务器上,同样编辑MySQL配置文件,设置唯一的server-id(不同于主服务器的ID),但不需要启用二进制日志功能,因为从服务器不需要记录自身的数据变更。

[mysqld]
server-id=2

完成配置后,重启MySQL服务以使更改生效。

3. 创建复制账号

在主服务器上,创建一个专门用于复制的MySQL用户,并授予复制权限。例如:

CREATE USER 'repl'@'192.168.198.%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.198.%';
FLUSH PRIVILEGES;

4. 备份主库数据

在进行复制之前,需要对主库的数据进行备份,以便在从库上恢复相同的数据。可以使用mysqldump工具来备份数据库。例如,如果主库上有一个名为school的数据库,可以使用以下命令进行备份:

mysqldump -uroot -p'root_password' -B school > /backup/mysql_bak.$(date +%F).sql.gz

备份完成后,将备份文件传输到从服务器。

复制阶段

1. 初始化从库

在从服务器上,创建一个与主库相同的数据库(例如school),并导入主库的备份数据。

mysql -uroot -p'root_password' < /backup/mysql_bak.$(date +%F).sql.gz

2. 配置从库复制

在从服务器上,执行以下SQL命令来配置复制关系:

CHANGE MASTER TO
    MASTER_HOST='192.168.198.140',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=120;

其中,MASTER_LOG_FILEMASTER_LOG_POS是从主服务器上获取的当前二进制日志文件名和位置,可以使用以下命令在主服务器上查看:

SHOW MASTER STATUS;

3. 启动从库复制

在从服务器上,启动复制线程:

START SLAVE;

然后,可以通过以下命令查看复制状态,确保I/O线程和SQL线程都在正常运行:

SHOW SLAVE STATUS\G

如果Slave_IO_RunningSlave_SQL_Running都是Yes,则表示复制配置成功。

确认阶段

1. 测试数据同步

在主服务器上,插入、更新或删除一些数据,然后在从服务器上检查这些更改是否已同步。例如,可以在主服务器上执行以下SQL命令:

USE school;
INSERT INTO student (name, age) VALUES ('Alice', 20);

然后,在从服务器上执行相同的查询来验证数据是否已同步:

USE school;
SELECT * FROM student WHERE name = 'Alice';

如果查询结果包含刚刚插入的数据,则表示数据同步成功。

2. 验证读写分离

为了充分利用主从复制的优势,通常会将写请求发送到主服务器,将读请求发送到从服务器。这可以通过应用程序的数据库连接配置来实现。例如,在Java应用程序中,可以配置两个数据源,一个指向主服务器,另一个指向从服务器,并根据操作类型(读或写)选择合适的数据源。

主从数据同步过程

在这里插入图片描述

1. 数据同步流程

MySQL主从复制的核心原理是将主服务器上的二进制日志复制到从服务器,并在从服务器上执行这些日志中的操作。具体流程如下:

  • 主服务器记录变更:当主服务器上的数据发生更改时(例如,执行INSERT、UPDATE或DELETE操作),这些更改会被记录到二进制日志中。二进制日志是一个记录了所有对数据库产生变更的语句的日志文件。
  • 从服务器请求日志:从服务器上的I/O线程会定期或根据配置实时连接到主服务器,请求最新的二进制日志内容。主服务器上的log dump线程会负责发送这些日志给从服务器。
  • 从服务器应用日志:从服务器上的I/O线程接收到主服务器发送的二进制日志后,会将其写入到中继日志(Relay Log)中。然后,从服务器上的SQL线程会读取中继日志,解析其中的二进制日志事件,并在从服务器上执行相应的数据变更操作,以使从服务器上的数据与主服务器保持一致。

2. 关键组件

  • 二进制日志(Binary Log):主服务器上记录所有数据变更操作的日志文件。
  • 中继日志(Relay Log):从服务器上存储从主服务器接收到的二进制日志副本的日志文件。
  • I/O线程:从服务器上的线程,负责连接到主服务器并请求二进制日志内容。
  • Log Dump线程:主服务器上的线程,负责发送二进制日志给从服务器。
  • SQL线程:从服务器上的线程,负责读取中继日志并执行其中的数据变更操作。

3. 问题和对策

  • 数据延迟:由于从服务器的复制是异步进行的,因此从服务器上的数据可能会有一定的延迟。这可以通过使用半同步复制来减轻,半同步复制要求主服务器在返回写操作成功给客户端之前,至少等待一个从服务器确认已经收到并应用了这些变更。
  • 网络故障:网络问题可能导致从服务器无法及时获取主服务器的二进制日志。这可以通过在网络层面进行冗余配置(例如使用双网卡、多路径路由等)来增强网络的可靠性。
  • 数据一致性问题:在某些情况下(例如,从服务器上的SQL线程执行失败),可能会导致数据不一致。这可以通过定期检查和校验主从服务器上的数据来及时发现和解决。此外,使用GTID(Global Transaction ID)复制也可以提高数据的一致性,因为GTID是基于事务的唯一标识来跟踪和复制事务的。
  • 性能瓶颈:当数据量非常大时,复制过程可能会对主服务器的性能产生影响。这可以通过优化MySQL的配置(例如增加缓冲区大小、调整日志格式等)来缓解。此外,使用级联复制(即将多个从服务器连接到一个或多个中间从服务器)也可以分散主服务器的负载。

综上所述,MySQL主从复制是一种强大且灵活的数据同步技术,通过合理的配置和优化,可以实现高效、稳定的数据同步和读写分离,从而提高系统的可用性和性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物联网低功耗广域网LoRa开发(一):LoRa物联网行业解决方案

一、LoRa的优势以及与其他无线通信技术对比 &#xff08;一&#xff09;LoRa的优势 1、164dB链路预算 、距离>15km 2、快速、灵活的基础设施易组网且投资成本较少 3、LoRa节点模块仅用于通讯电池寿命长达10年 4、免牌照的频段 网关/路由器建设和运营 、节点/终端成本低…

【Linux】sudo make install 命令往系统中安装了什么 指定目录进行安装

前情提要 假如我们通过源码安装的方式&#xff0c;安装一个动态库&#xff0c;风格往往是这样的&#xff1a; # 克隆仓库 git clone https://github.com/xxx.git# 进入仓库目录 cd xxx编译 # ... 可能有一些校验代码完整性的sh命令# 构建 mkdir build cd build cmake ..# 编…

基于YOLOv5的人群密度检测系统设计与实现

大家好&#xff0c;本文将介绍基于改进后的YOLOv5目标检测模型&#xff0c;设计并实现人群密度检测系统。 使用YOLOv5的源代码&#xff0c;在此基础上修改和训练模型&#xff0c; 数据集选用crowdhuman数据集。对yolov5源码中的文件进行修改&#xff0c;更换主干网络、改进损失…

zabbix搭建钉钉告警流程

目录 zabbix实验规划 zabbix实验步骤 1 使用钉钉添加一个自定义的机器人 ​编辑2在zabbix-server上编写钉钉信息发送脚本&#xff0c;设置钉钉报警媒介 设置钉钉报警媒介​编辑​编辑 在添加消息模板​编辑​编辑​编辑 3设置动作条件 触发后的行为&#xff1a;重新添加一…

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5 1. 安装 Oracle Database 23ai2. 连接 Oracle Database 23c3. 重启启动后&#xff0c;手动启动数据库4. 重启启动后&#xff0c;手动启动 Listener5. 手动启动 Pluggable Database6. 自动启动 Pluggable Database7. 设置开…

vxe-table 3.10+ 进阶高级用法(一),根据业务需求自定义实现筛选功能

vxe-table 是vue中非常强大的表格的&#xff0c;公司项目中复杂的渲染都是用 vxe-table 的&#xff0c;对于用的排序。筛选之类的都能支持&#xff0c;而且也能任意扩展&#xff0c;非常强大。 默认筛选功能 筛选的普通用法就是给对应的列指定参数&#xff1a; filters&#…

机器学习笔记2 - 机器学习的一般流程

image.png 1、数据基本处理 数据集的划分 根据用途可将获取到的数据划分为训练集和测试集&#xff0c;有时还会有验证集。一般而言训练集用于训练模型&#xff0c;测试集用于测试模型的效果&#xff08;泛化误差&#xff09;。严格来讲&#xff0c;测试集的数据不能直接或间接&…

鸿蒙进阶篇-type、typeof、类

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

log4j异常堆栈文件输出

目的&#xff1a;log4j异常堆栈关联到traceId一句话中&#xff0c;方便搜索 1、获取堆栈后一起打印 private void logException(Throwable t, ProceedingJoinPoint joinPoint) {if (this.printErrorStackSys) {StringWriter sw new StringWriter();PrintWriter pw new Print…

ReactPress:构建高效、灵活、可扩展的开源发布平台

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。ReactPress&#xff0c;作为一款融合了现代Web开发多项先进技术的开…

【笔记】Springboo项目启动失败

application run failed org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name adviceMapper defined in file 原因是mybatisplus和springboot的版本不匹配 修改后&#xff1a; springboot mybatisplus 成功

PET-文件包含

include发生错误报warning&#xff0c;继续执行。require发生错误直接error&#xff0c;不继续执行 无视扩展名&#xff0c;只要能解析&#xff0c;就能当可执行文件执行&#xff0c;哪怕文件后缀或没后缀 1 条件竞争 pass17 只需要知道tmp的路径。把xieshell.jpg上传&…

强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习&#xff0c;本科时已经学习过了&#xff0c;但是感觉还是有些概念和算法没有学懂学透&#xff0c;所以想重新系统性的学习一下&#xff0c;记录了整个学习过程&#xff0c;而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…

HTB:Photobomb[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行端口开放扫描 再次使用nmap对靶机开放端口进行脚本、服务扫描 使用ffuf进行简单的子域名扫描 使用浏览器直接访问该域名 选取一个照片进行下载&#xff0c;使用Yakit进行抓包 USER_FLAG&#xff1a;a9afd9220ae2b5731…

Golang | Leetcode Golang题解之第560题和为K的子数组

题目&#xff1a; 题解&#xff1a; func subarraySum(nums []int, k int) int {count, pre : 0, 0m : map[int]int{}m[0] 1for i : 0; i < len(nums); i {pre nums[i]if _, ok : m[pre - k]; ok {count m[pre - k]}m[pre] 1}return count }

【Vue】Vue3.0(二十)Vue 3.0 中mitt的使用示例

上篇文章 【Vue】Vue3.0&#xff08;十九&#xff09;Vue 3.0 中一种组件间通信方式-自定义事件 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月11日12点23分 文章目录 一、mitt 在…

降SAR需求分析

1、需求分析 在信息技术领域&#xff0c;SAR 可能代表 "Specific Absorption Rate"&#xff0c;即特定吸收率。这是用于衡量无线设备&#xff08;如手机&#xff09;辐射对人体的吸收程度的标准。国外认证机构针对手机有相关辐射值要求&#xff0c;比如通话场景等&am…

如何学习VBA_3.2.14:字符串的处理

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

Processing Modflow软件安装,建立地下水-地面沉降数值模型的流程与步骤(构造沉降、抽水沉降、采空沉降等);三维地质建模数据处理

目前&#xff0c;地面沉降问题是我国较为常见的环境地质问题&#xff0c;其巨大的破坏力严重影响城市建筑安全和交通轨道运行。围绕地面沉降的防控与治理&#xff0c;是工程地质、环境地质、轨道交通设计等相关技术人员十分关注的领域&#xff0c;而数值模拟技术是评估防控效果…

Leetcode刷题Python之3258.统计满足k约束的子字符串I

提示&#xff1a;暴力解法简单易懂能通过。 文章目录 一、题目描述示例分析 二、解题思路三、代码实现代码解析 总结 一、题目描述 给定一个二进制字符串 s&#xff08;即字符串中只包含字符 0 和 1&#xff09;以及一个整数 k。要求计算出 s 中满足 “k 约束” 的子字符串数量…