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版本,以避免兼容性问题。

乘风破浪会有时,直挂云帆济沧海!!!

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

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

相关文章

Mac 删除ABC 输入法

参考链接:百度安全验证 Mac下删除系统自带输入法ABC,正解!_mac删除abc输入法-CSDN博客 ABC 输入法和搜狗输入法等 英文有冲突~~ 切换后还会在英文状态,可以删除 ;可能会对DNS 输入有影响,但是可以通过复…

Mac——Cpolar内网穿透实战

摘要 本文介绍了在Mac系统上实现内网穿透的方法,通过打开远程登录、局域网内测试SSH远程连接,以及利用cpolar工具实现公网SSH远程连接MacOS的步骤。包括安装配置homebrew、安装cpolar服务、获取SSH隧道公网地址及测试公网连接等关键环节。 1. MacOS打开…

Unity中对象池的使用(用一个简单粗暴的例子)

问题描述:Unity在创建和销毁对象的时候是很消耗性能的,所以我们在销毁一个对象的时候,可以不用Destroy,而是将这个物体隐藏后放到回收池里面,当再次需要的时候如果回收池里面有之前回收的对象,就直接拿来用…

【再谈设计模式】模板方法模式 - 算法骨架的构建者

一、引言 在软件工程、软件开发过程中,我们经常会遇到一些算法或者业务逻辑具有固定的流程步骤,但其中个别步骤的实现可能会因具体情况而有所不同的情况。模板方法设计模式(Template Method Design Pattern)就为解决这类问题提供了…

【大模型】Langchain-Chatchat-v0.3.1 的环境配置

1 Langchahin-chatchat的工程简介 本项目是利用 langchain 思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 本项目的最新版本中可使用 Xinference、Ollama 等框架接入 GLM-4-Chat、 Qwen2-In…

jenkins的作用以及操作

一 jenkins 1.1 概念 1.2 流程 1.2.1 流程 1.2.2 配置 1.3 jenkins容器自动化部署

【UE5 C++课程系列笔记】29——在UE中使用第三方库的流程

目录 前言 步骤 一、新建插件 二、创建第三方库 三、使用第三方库 前言 主要就是介绍如何将普通C++工程生成的头文件和.dll导入到UE中去使用。 步骤 一、新建插件 1. 打开插件浏览器选项卡 2. 打开插件创建器 3. 选择“第三方库”,这里命名为“MyThirdPartyLibrary…

Mybatis——Mybatis开发经验总结

摘要 本文主要介绍了MyBatis框架的设计与通用性,阐述了其作为Java持久化框架的亮点,包括精良的架构设计、丰富的扩展点以及易用性和可靠性。同时,对比了常见持久层框架,分析了MyBatis在关系型数据库交互中的优势。此外&#xff0…

【数据结构-堆】【二分】力扣3296. 移山所需的最少秒数

给你一个整数 mountainHeight 表示山的高度。 同时给你一个整数数组 workerTimes,表示工人们的工作时间(单位:秒)。 工人们需要 同时 进行工作以 降低 山的高度。对于工人 i : 山的高度降低 x,需要花费 workerTimes…

网络传输层TCP协议

传输层TCP协议 1. TCP协议介绍 TCP(Transmission Control Protocol,传输控制协议)是一个要对数据的传输进行详细控制的传输层协议。 TCP 与 UDP 的不同,在于TCP是有连接、可靠、面向字节流的。具体来说,TCP设置了一大…

玩转大语言模型——langchain调用ollama视觉多模态语言模型

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…

3 前端: Web开发相关概念 、HTML语法、CSS语法

文章目录 前言:导学1 Web开发相关概念2 Web标准(网页标准)3 软件架构(CS/BS)(1)C/S: Client/Server 客户端 / 服务器端(2)B/S: Browser/Server 浏览器 / 服务器端VSCode配置前段开发环境一、HTML概念1 概念2 HTML快速入门(1)语法快速入门(2)VSCode一个 !(快捷键…

STM32如何测量运行的时钟频率

前言 环境: 芯片:STM32F103C8T6 Keil:V5.24.2.0 一、简介STM32F103C8T6的时钟源 ①HSI 内部高速时钟,RC振荡器,频率为8MHz,精度不高。②HSE 外部高速时钟,可接石英/陶瓷谐振器,频率范围为4MHz~16MHz&…

项目实战--网页五子棋(用户模块)(1)

接下来我将使用Java语言,和Spring框架,实现一个简单的网页五子棋。 主要功能包括用户登录注册,人机对战,在线匹配对局,房间邀请对局,积分排行版等。 这篇文件讲解用户模块的后端代码 1. 用户表与实体类 …

【HTML+CSS+JS+VUE】web前端教程-16-HTML5新增标签

扩展知识 div容器元素,也是页面中见到的最多的元素 div实现

Codeforces Round 995 (Div. 3)【题解】D ~ G

比赛地址传送门 D.Counting Pairs 注意到确定一个数后&#xff0c;第二个数可以一个范围内任选。故排序二分查找上下界后计数 #include <bits/stdc.h> #define int long long using namespace std; typedef pair<int, int> PII; const int N 4e5 10;int n, x, …

【Linux】Linux基础命令(二)

locate命令 locate命令可以用于快速查找文件的路径&#xff0c;比如我要查找所有.cpp文件的路径&#xff1a; sudo locate *.cppless 命令 less命令和more命令类似&#xff0c;都是查看文件内容&#xff0c;但less命令更强大 可以使用光标上下&#xff08;左右&#xff09;…

自动化构音障碍严重程度分类:基于声学特征与深度学习的研究 学习技术

自动化构音障碍严重程度分类 原文名称&#xff1a;Automated Dysarthria Severity Classification:A Study on Acoustic Features and Deep Learning Techniques 摘要 本文比较了不同深度学习技术和声学特征在构音障碍严重程度分类中的应用。研究评估了深度神经网络&#xff0…

【NLP】ELMO、GPT、BERT、BART模型解读及对比分析

文章目录 一、基础知识1.1 Word Embedding&#xff08;词嵌入&#xff09;1.2 词嵌入模型1.3 神经网络语言模型NNLM 二、ELMO2.1 ELMO的提出2.2 ELMO核心思想2.3 ELMO的优缺点 三、GPT3.1 Transformer3.2 GPT简介3.3 GPT模型架构3.4 预训练及微调3.5 GPT和ELMO对比 四、BERT4.1…

EasyExcel(二)导出Excel表自动换行和样式设置

EasyExcel(一)导出Excel表列宽自适应 背景 在上一篇文章中解决导出列宽自适应,然后也解决了导出列宽不可超过255的问题。但是实际应用场景中仍然会有导出数据的长度超过列宽255。这时导出效果就会出现如下现象: 多出列宽宽度的内容会浮出来,影响后边列数据的显示。 解决…