Mysql--运维篇--主从复制和集群(主从复制I/O线程,SQL线程,二进制日志,中继日志,集群NDB)
一、主从复制
MySQL的主从复制(Master-Slave Replication)是一种数据冗余和高可用性的解决方案,它通过将一个或多个从服务器(Slave)与主服务器(Master)同步来实现。主从复制的基本原理是:在主服务器上记录所有的数据变更操作(如INSERT、UPDATE、DELETE等),然后这些变更被传输到从服务器,并在从服务器上重放这些操作,从而保持数据的一致性。
1、主从复制的工作原理
(1)、二进制日志 (Binary Log)
- 主服务器上的所有更改都会被记录到二进制日志中。
- 二进制日志包含所有对数据库结构或数据进行更改的操作,以及每个事件的时间戳和执行时间。
(2)、I/O线程(IO Thread)
- 从服务器启动一个I/O线程连接到主服务器,并请求获取二进制日志中的更新。
- 主服务器接收到这个请求后,会创建一个二进制日志转储线程(Binlog Dump Thread),将二进制日志的内容发送给从服务器的I/O线程。
- I/O线程接收到的数据会被写入到从服务器的中继日志(Relay Log)中。
(3)、SQL线程(SQL Thread)
- 从服务器上的SQL线程读取中继日志中的事件,并在本地数据库上重放这些事件,以使从服务器的数据与主服务器保持一致。
- SQL线程可以并行地应用多个表上的事件,提高复制效率(取决于配置和MySQL版本)。
(4)、位置跟踪
- 为了确保从服务器能够正确地应用主服务器上的所有更改,主服务器和从服务器之间需要维持一个位置跟踪机制。通常,这通过二进制日志文件名和位置(即日志序列号,LSN)来实现。
- 每个从服务器都有自己的master.info文件,其中保存了当前正在读取的主服务器二进制日志的位置信息。
(5)、心跳检测
- 从服务器定期向主服务器发送心跳包,以监测连接状态。
- MySQL 5.7引入了半同步复制,其中主服务器只有在至少一个从服务器确认已经接收到并记录下最新的二进制日志事件之后才会提交事务。这种方式提高了数据的安全性和一致性。
2、实现主从复制的步骤
准备工作:
- 备份主服务器:确保主服务器上有最新的备份,以便在出现问题时可以从备份中恢复。
- 确定主服务器的二进制日志位置:在开始复制之前,记录下主服务器当前的二进制日志文件名和位置。可以通过SHOW MASTER STATUS;命令查看。
(1)、配置主服务器
1、启用二进制日志
确保主服务器配置文件(通常是my.cnf或my.ini)中有以下设置。
配置示例:
[mysqld]
server-id=1
log-bin=mysql-bin
解释:
- server-id必须为唯一的正整数(主从集群中不能重复),用于标识每个服务器实例。
- log-bin指定了二进制日志的前缀名称。
2、重启MySQL服务
使配置生效。
命令示例:
systemctl restart mysqld;
3、创建复制用户
在主服务器上创建一个专门用于复制的用户,并授予适当的权限。
sql示例:
CREATE USER 'replication_user'@'%' IDENTIFIED with mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;
解释:
- 创建用户replication_user,%表示用户可以通过任何ip地址连接到Mysql,使用密码password认证。
- 授予复制所需的权限给replication_user用户。
- 刷新权限,使更改立即生效
(2)、配置从服务器
1、设置唯一server-id
在从服务器的配置文件中设置不同的server-id值,例如server-id=2。确保每个从服务器的server-id都是唯一的。
2、指定主服务器信息
使用CHANGE MASTER TO命令配置从服务器连接到主服务器的信息,包括主机名、端口、用户名、密码以及二进制日志文件名和位置。
sql示例:
CHANGE MASTER TOMASTER_HOST='master_host_ip',MASTER_USER='replication_user',MASTER_PASSWORD='password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=12345;
注意:
这里的MASTER_LOG_FILE和MASTER_LOG_POS应该对应于你在主服务器上记录的二进制日志位置。
3、启动复制
执行START SLAVE;命令启动复制进程。你可以使用SHOW SLAVE STATUS;检查复制的状态,确保没有错误。

(3)、验证复制
- 测试数据同步:在主服务器上插入一些测试数据,然后检查从服务器是否也有了相同的数据。
- 监控复制状态:定期使用SHOW SLAVE STATUS;检查从服务器的复制状态,特别关注以下几个字段:
- Slave_IO_Running: 应该是Yes,表示I/O线程正在运行。
- Slave_SQL_Running: 应该是Yes,表示SQL线程正在运行。
- Last_Error: 如果为空,则说明没有遇到错误。
- Seconds_Behind_Master: 显示从服务器落后主服务器的秒数,理想情况下应接近0。
示例:
SHOW SLAVE STATUS;
运行结果:

(4)、注意事项
- 网络稳定性:确保主服务器和从服务器之间的网络连接稳定可靠,因为任何中断都可能导致复制失败。
- 性能影响:虽然主从复制本身不会显著影响主服务器的性能,但在高并发写入的情况下,可能会增加一些负担。因此,合理规划硬件资源和优化查询非常重要。
- 延迟问题:由于网络延迟或其他因素,从服务器可能会落后于主服务器。如果延迟过大,可能需要考虑调整复制策略或优化系统配置。
- 安全性:保护好复制用户的凭据,避免泄露,并且只赋予必要的权限。
- 故障转移:当主服务器发生故障时,可以手动将从服务器提升为主服务器,但这通常涉及到更复杂的配置和管理,比如设置自动故障转移机制或者使用集群技术。
二、集群
MySQL集群(MySQL Cluster)是一种高可用性和可扩展性的解决方案,它通过分布式的架构来提供数据冗余、故障转移和负载均衡。MySQL Cluster使用NDB(Network Database)存储引擎,这与传统的InnoDB或MyISAM存储引擎不同,NDB是专门为分布式环境设计的。
原理示意图:

1、MySQL Cluster的核心组件
(1)、管理节点(Management Node):
- 管理节点负责配置和监控整个集群的状态。它不直接参与数据处理,而是作为集群的“大脑”,协调其他节点的工作。
- 每个管理节点运行ndb_mgmd守护进程,并且通常建议至少有两个管理节点以实现高可用性。
(2)、数据节点(Data Node):
- 数据节点是存储实际数据的片段。为了保证高可用性,每个数据副本都会被分片并分布在多个数据节点上。即使某个节点发生故障,其他节点仍然可以继续提供服务。
- 数据节点运行ndbd或ndbmtd守护进程(多线程版本)。根据硬件资源和性能需求,可以选择单线程或多线程模式。
(3)、SQL节点(SQL Node)
- SQL节点是应用程序与MySQL Cluster交互的接口。它们执行SQL查询并将结果返回给客户端。SQL节点可以是普通的MySQL服务器实例,运行mysqld守护进程。
- 一个集群中可以有多个SQL节点,以便于负载均衡和提高并发处理能力。
(4)、API节点(API Node)
- API节点允许应用程序通过编程接口(如C++、Java等)直接访问NDB存储引擎,而不需要经过SQL解析层。这对于某些高性能要求的应用场景非常有用。
- API节点不是必须的,但提供了额外的灵活性和性能优势。
2、MySQL Cluster的工作原理
- 数据分片 (Sharding):MySQL Cluster采用哈希分片的方式将表中的行分配到不同的数据节点。每个分片都包含至少一份完整的数据副本,确保了即使某个节点失效,数据仍然可用。
- 同步复制:所有写操作都会立即同步到所有的数据副本上,确保了数据的一致性。读操作可以在任意一个数据节点上执行,因为每个节点都持有相同的数据副本。
- 自动故障检测和恢复:管理节点会定期检查各个数据节点的健康状态。如果发现某个节点不可用,它会自动将流量重新路由到健康的节点,并尝试重启失败的节点。
- 在线扩展:可以通过添加新的数据节点和SQL节点来水平扩展集群,而无需停机。这使得MySQL Cluster非常适合需要动态调整资源的应用场景。
3、配置和部署MySQL Cluster
(1)、安装软件包
首先,你需要安装MySQL Cluster的相关软件包。可以从官方MySQL网站(https://dev.mysql.com/downloads/cluster/)下载适用于你操作系统的安装包,或者使用包管理器进行安装。
需要下载和安装的软件包括:
1、MySQL Cluster管理节点(Management Node)软件包
- mysql-cluster-community-management-server(对于社区版)
- mysql-cluster-enterprise-management-server(对于企业版)
这些软件包包含了管理节点所需的ndb_mgmd守护进程,用于配置和监控集群。
2、MySQL Cluster数据节点(Data Node)软件包
- mysql-cluster-community-data-node(对于社区版)
- mysql-cluster-enterprise-data-node(对于企业版)
这些软件包包含了数据节点所需的ndbd或ndbmtd守护进程,用于存储和处理数据。ndbmtd是多线程版本,适用于高性能需求的场景。
3、MySQL Cluster SQL节点(SQL Node)软件包
- mysql-cluster-community-server(对于社区版)
- mysql-cluster-enterprise-server(对于企业版)
这些软件包包含了标准的MySQL服务器(mysqld),并且启用了对NDB存储引擎的支持。SQL 节点是应用程序与MySQL Cluster交互的接口,负责解析SQL 查询并将结果返回给客户端。
4、MySQL Cluster客户端工具(Client Tools)
- mysql-client 或 mysql-cluster-community-client(对于社区版)
- mysql-cluster-enterprise-client(对于企业版)
这些软件包提供了常用的 MySQL 客户端工具,如mysql命令行客户端、mysqladmin等,用于管理和操作MySQL Cluster。
5、MySQL Cluster开发库(Development Libraries)
- mysql-cluster-community-devel(对于社区版)
- mysql-cluster-enterprise-devel(对于企业版)
这些软件包包含了开发库和头文件,允许你编写使用NDB API的应用程序,直接与NDB存储引擎进行交互。
6、MySQL Cluster备份工具(Backup Tools)
- mysql-cluster-community-backup(对于社区版)
- mysql-cluster-enterprise-backup(对于企业版)
这些软件包提供了专门的备份工具,帮助你管理和恢复 MySQL Cluster 的数据。
7、MySQL Cluster监控工具(Monitoring Tools)
- mysql-cluster-community-monitor(对于社区版)
- mysql-cluster-enterprise-monitor(对于企业版)
这些软件包提供了监控工具,帮助你实时监控 MySQL Cluster 的状态和性能。
(2)、配置管理节点
编辑配置文件(通常是config.ini),定义集群的拓扑结构,包括管理节点、数据节点和SQL节点的数量及地址。
示例:
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=800M
IndexMemory=184M[TCP DEFAULT][MYSQLD]
# 可以添加多个SQL节点
[MYSQLD][NDB_MGMD]
NodeId=1
HostName=management_node_ip[NDBD]
NodeId=2
HostName=data_node_1_ip[NDBD]
NodeId=3
HostName=data_node_2_ip
(3)、启动管理节点
在管理节点上启动管理守护进程:
ndb_mgmd -f /path/to/config.ini --initial
–initial选项用于初始化配置,之后可以省略。
(4)、启动数据节点
在每个数据节点上启动数据守护进程:
ndbd
对于多线程版本,使用ndbmtd命令。
(5)、配置SQL节点
在每个SQL节点上,编辑MySQL配置文件(my.cnf或my.ini),指定集群连接参数:
[mysqld]
ndbcluster
ndb-connectstring=management_node_ip
然后启动MySQL服务。
(6)、创建数据库和表
登录到任何一个SQL节点,创建数据库和表,并指定使用NDB存储引擎:
示例:
CREATE DATABASE my_cluster_db;
USE my_cluster_db;CREATE TABLE my_table (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(50),PRIMARY KEY (id)
) ENGINE=NDBCLUSTER;
4、监控和维护
- 管理命令:使用ndb_mgm工具可以连接到管理节点,查看集群状态、停止或启动节点等。例如:
ndb_mgm
show
-
日志分析:检查管理节点和数据节点的日志文件,了解集群的运行情况和潜在问题。
-
性能优化:根据应用的需求,调整配置参数(如内存分配、线程数等),以获得最佳性能。
-
备份和恢复:定期备份集群数据,并制定灾难恢复计划。可以使用mysqldump工具或NDB专用的备份工具。
5、注意事项
-
网络要求:MySQL Cluster对网络延迟非常敏感,因此建议使用低延迟、高带宽的网络连接。此外,尽量减少跨广域网(WAN)的部署,除非你已经采取了适当的措施来保证网络稳定性。
-
资源消耗:由于数据会被复制到多个节点,MySQL Cluster会占用更多的磁盘空间和内存资源。确保你的硬件配置能够满足集群的需求。
-
适用场景:虽然MySQL Cluster提供了高可用性和可扩展性,但它并不适合所有类型的应用。特别是对于那些涉及大量复杂查询、事务或大对象存储的应用,可能需要考虑其他解决方案。
-
版本兼容性:确保所有节点使用相同的MySQL Cluster版本,以避免兼容性问题。
乘风破浪会有时,直挂云帆济沧海!!!
相关文章:
Mysql--运维篇--主从复制和集群(主从复制I/O线程,SQL线程,二进制日志,中继日志,集群NDB)
一、主从复制 MySQL的主从复制(Master-Slave Replication)是一种数据冗余和高可用性的解决方案,它通过将一个或多个从服务器(Slave)与主服务器(Master)同步来实现。主从复制的基本原理是&#…...
设计模式 行为型 状态模式(State Pattern)与 常见技术框架应用 解析
状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,使得对象看起来好像修改了它的类。这种设计模式的核心思想是将对象的状态和行为封装成不同的状态类,通过状态对象的行为改变来避免…...
计算机网络 (38)TCP的拥塞控制
前言 TCP拥塞控制是传输控制协议(Transmission Control Protocol,TCP)避免网络拥塞的算法,是互联网上主要的一个拥塞控制措施。 一、目的 TCP拥塞控制的主要目的是防止过多的数据注入到网络中,使网络能够承受现有的网络…...
鸿蒙面试 2025-01-09
鸿蒙分布式理念?(个人认为理解就好) 鸿蒙操作系统的分布式理念主要体现在其独特的“流转”能力和相关的分布式操作上。在鸿蒙系统中,“流转”是指涉多端的分布式操作,它打破了设备之间的界限,实现了多设备…...
【关于for循环的几种写法】
关于for循环的几种写法 在 C 中,for(int i 0; i < n; i) 是一种常见的循环写法,用于遍历从 0 到 n-1 的索引。如果你希望简化这种写法,可以使用以下几种方法: 1. 使用范围 for 循环 如果你需要遍历一个容器(如数…...
Apache和PHP:构建动态网站的黄金组合
在当今的互联网世界,网站已经成为了企业、个人和机构展示自己、与用户互动的重要平台。而在这些动态网站的背后,Apache和PHP无疑是最受开发者青睐的技术组合之一。这一组合提供了高效、灵活且可扩展的解决方案,帮助您快速搭建出强大的网站&am…...
免费开源的下载工具Xdown
软件介绍 Xdown是一款功能强大的开源免费下载工具,专为PC端用户设计,支持多种协议和下载方式。 1、多线程下载 Xdown支持最高128线程的并发下载,能够将文件分割成多个部分同时下载,从而显著提升下载速度。 2、多种协议支持 该…...
Three.js 数学工具:构建精确3D世界的基石
文章目录 前言一、向量(Vectors)二、矩阵(Matrices)三、四元数(Quaternions)四、欧拉角(Euler Angles)五、颜色(Colors)六、几何体生成器(Geometr…...
如何明智地提问
如何明智地提问的重要总结,让我为主要观点添加一些具体的实践建议: 提问前的准备工作 尝试在 Google、Stack Overflow 等平台搜索相似问题阅读相关文档和错误日志尝试自己调试和排查问题记录下已尝试过的解决方案 选择合适的提问平台 Stack Overflow…...
Microsoft Sql Server 2019 函数理解
说到函数,首先和存储过程作个比较吧,两者有一个共同点都是预编译优化后存储在磁盘中,所以效率 要比T-SQL高一点点。值得注意的是,存储过程可以创建或访问临时表,而函数不可以; 同时函数不可 以修改表中的数…...
自定义日期转换配置
文章目录 1.日期问题出现原因以及解决方案概述1.图示2.三种解决方案概述1.对于表单数据 application/x-www-form-urlencoded2.对于JSON数据1.使用JsonFormat注解2.自定义Jackson日期转换配置 2.解决方案common-web-starter1.目录2.BaseController.java 使用InitBinder解决表单数…...
“AI智能服务平台系统,让生活更便捷、更智能
大家好,我是资深产品经理老王,今天咱们来聊聊一个让生活变得越来越方便的高科技产品——AI智能服务平台系统。这个系统可是现代服务业的一颗璀璨明珠,它究竟有哪些魅力呢?下面我就跟大家伙儿闲聊一下。 一、什么是AI智能服务平台系…...
SQL美化器优化
文章目录 1.目录2.代码 1.目录 2.代码 package com.sunxiansheng.mybatis.plus.inteceptor;import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.*; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.*…...
我的128天创作之路:回顾与展望
大家好呀!今天来和你们分享一下我的创作历程😁。 一、机缘 最开始创作呢,是因为在学习 C 的 STL 时,像 string、list、vector 这些模板可把我折腾得够呛,但也让我学到了超多东西!我就想,要是把我…...
内核配置参数整理
#参考网页 linux5.2 <.config>文件注释 详细解释 CONFIG_ARMy:启用ARM架构支持,这是ARM处理器专用的内核配置选项。 CONFIG_ARM_HAS_SG_CHAINy:启用对散列表(scatter-gather)链的支持…...
SpringBoot整合Easy-es
一.什么是Easy-Es Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称…...
于交错的路径间:分支结构与逻辑判断的思维协奏
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一节内容很多,文章字数达到了史无前例的一万一,我们要来学习分支与循环结构中…...
Linux之读者写者模型与特殊锁的学习
目录 读者写者模型 特殊锁 悲观锁 自旋锁 在前几期,我们学习了多线程的生产者和消费者模型,生产者和消费者模型中,有三种关系,两个角色,一个场所,那么读者写者模型和生产者消费者模型有什么关联吗&…...
回溯专题 记录
回溯的题目按照这套模板进行; 我感觉整体逻辑还是递归,只不过有了pop_back才是回溯概念; class Solution {public:vector<int> path;vector<vector<int>> ans;void backtracking(int n,int k,int startindex){if(path.…...
使用 Python 实现自动化办公(邮件、Excel)
目录 一、Python 自动化办公的准备工作 1.1 安装必要的库 1.2 设置邮件服务 二、邮件自动化处理 2.1 发送邮件 示例代码 注意事项 2.2 接收和读取邮件 示例代码 三、Excel 自动化处理 3.1 读取和写入 Excel 文件 示例代码 3.2 数据处理和分析 示例代码 四、综合…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...
组合模式:构建树形结构的艺术
引言:处理复杂对象结构的挑战 在软件开发中,我们常遇到需要处理部分-整体层次结构的场景: 文件系统中的文件与文件夹GUI中的容器与组件组织结构中的部门与员工菜单系统中的子菜单与菜单项组合模式正是为解决这类问题而生的设计模式。它允许我们将对象组合成树形结构来表示&…...
Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
在 MyBatis 中使用 useGeneratedKeys"true" 获取新插入记录的自增 ID 值,可通过以下步骤实现: 1. 配置 Mapper XML 在插入语句的 <insert> 标签中设置: xml 复制 下载 运行 <insert id"insertUser" para…...
