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

Linux运维:mysql主从复制原理及实验

当一台数据库服务器出现负载的情况下,需要扩展服务器服务器性能扩展方式有向上扩展,垂直扩展。向外扩展,横向扩展。通俗的讲垂直扩展是将一台服务器扩展为性能更强的服务器。横向扩展是增加几台服务器。

主从复制好比存了1000块钱在主上,在从上查不到,主从复制就是主和从数据一致。

复制的功能:负载均衡读操作,备份,高可用和故障切换,数据分布,MySQL升级。

一、主从复制架构和原理

1.1 mysql主从复制

读写分离

复制:每个节点都有相同的数据集,向外扩展,基于二进制日志的单向复制

1.2 复制的功能

负载均衡读操作

备份

高可用和故障切换

数据分布

MySQL升级

1.3复制结构和主从复制原理

一主一从,和一主多从。

主从复制的相关程序。

1.3.1 两个日志三个线程:

日志:二进制日志,中继日志(主上的二进制日志)

线程:dump线程,io线程,sql线程

主服务器:mysqldump线程,传输二进制日志给从

从服务器:io线程:接收主的二进制日志,写入中继日志;sql线程:读取中继日志,写入数据库。

1.3.2 原理:

1.主节点负责用户的写操作,用户发起写操作,会修改数据库

2.数据库修改后,会更新主节点上的二进制日志

3.主服务器会产生一个dump线程,一边读取二进制日志一边将二进制日志通过网络传给从服务器

4.从服务器会开启io线程,接收主服务器的二进制日志

5.io线程会将主服务器的二进制日志写入中继日志,这时只是生成了一个文件,并没有同步

6.从服务器再开启sql线程将中继日志中操作写入数据库完成更新

主从数据就保持一致了!

主从复制相关线程:

dump Thread:为每个slave的I/O Thread启动一个dump线程,用于向其发送binary log events从节点

I/O Thread:向master请求二进制日志事件,并保存于中继日志中

SQL Thread:从中继日志中读取日志事件,在本地完成同步操作。

主数据更新 -> 写入bin log -> slave服务器线程 -> io Thread -> 写入Relay Log -> SQL Thread -> 从数据库更新。这样就主从一致了。

yum安装数据库:

二、主从复制

2.1 主-从复制

Node3作为主192.168.114.30,Node4作为从192.168.114.40

2.2 主节点配置:

(1)启用二进制日志

主节点配置:启用二进制日志

(2)为当前节点设置一个全局唯一的ID号

[mysqld]

server-id=                        #区分自己的日志和别人的日志

log-basename=master        #可选项,设置datadir中日志名称,确保不依赖主机名

(3)查看从二进制日志的文件和位置开始进行复制

show master status;

(4)创建有复制权限的用户账号

grant replication slave on *.* 'repluser'@'HOST' identified by 'repluser';

2.3 从节点配置:

(1)启动中继日志

[mysqld]

server-id=

log-bin=

(2) 使用有复制权限的用户账号连接至主服务器,并启用复制线程

mysql> CHANGE MASTER TO
 MASTER_HOST='192.168.114.10',
 MASTER_USER='test',
 MASTER_PASSWORD='ABC123',
 MASTER_PORT=3306,
 MASTER_LOG_FILE='mysql-bin.000002',
 MASTER_LOG_POS=448;

show slave status;

2.4 实际操作:一主一从

Node3作为主:

在文件最后添加两条配置。

[root@Node3 ~]#:vim /etc/my.cnf
......
server-id=30
log-bin=/data/mysql/mysql-bin

建立目录并修改权限:

[root@Node3 ~]#:mkdir -p /data/mysql
[root@Node3 ~]#:chown -R mysql.mysql /data

重启数据库:

systemctl restart mysqld

登录并新建同步用户:

mysql -uroot -pabc123

master状态,查看同步文件和同步位置:763

Node4作为从:

[root@Node4 ~]#:vim /etc/my.cnf
......
server-id=40
log-bin=/data/mysql/mysql-bin

建立目录:

[root@Node4 ~]#:mkdir /data/mysql -p
[root@Node4 ~]#:chown -R mysql.mysql /data

重启:systemctl start mysqld

主上查看节点:449

主上查看二进制文件,我们指定了在/data/mysql/下:

[root@Node3 ~]#:ls /data/mysql/
mysql-bin.000001  mysql-bin.000002  mysql-bin.index

这个是最新的。

登录数据库添加主的信息,有模版,注意修改:

help change master to;

mysql> help change master to;
......
CHANGE MASTER TOMASTER_HOST='source2.example.com',MASTER_USER='replication',MASTER_PASSWORD='password',MASTER_PORT=3306,MASTER_LOG_FILE='source2-bin.001',MASTER_LOG_POS=4,MASTER_CONNECT_RETRY=10;
#这里是模版,要根据自己环境修改

开启IO线程以及SQL线程:start slave;

 查看从服务器的状态:都是yes就是正常状态。如果有错就清空主从配置:reset slave all;

这里还有个状态:Seconds_Behind_Master: 0   代表与主服务器的信息差,0代表同步

2.5 验证

先看从上的数据库:

在主上创建一个数据库,看从上是否也有这个数据库:

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

在从上查看:

也有了test数据库。实现主从复制!

可以看到主从建立了连接

三、案例:(主从复制+完备)

假设主节点的数据库已经运行了一段时间,产生了一定量的数据,主从复制只能复制开启后数据,那之前的数据如何处理?

把之前的那些数据做好完全备份。之后的数据通过主从复制实现备份。再结合在一起。(快照,重新还原到mysql)

安装好数据库之后,把一个数据库文件拖进来/data/下。把数据库hellodb_innodb.sql文件导进数据库中。

 进入数据库查看:

开启二进制日志:

[root@Node3 ~]#:vim /etc/my.cnf
......
server-id=30
log-bin=/data/mysql/log/mysql-bin

建立路径:

[root@Node3 ~]#:mkdir /data/mysql/log -p
[root@Node3 ~]#:chown -R mysql.mysql /data
[root@Node3 ~]#:systemctl restart mysqld

 完全备份:-A是把所有的数据库都备份在/data/下取名为all.sql。-F备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件。

mysqldump -uroot -pabc123 -A -F --master-data=1 --single-transaction > /data/all.sql

创建个登录用户,并授权:

由于之前在备份的时候加入了--master-data=1选项,就添加了主从复制的选项000002文件的619位置往后开始主从复制

000002文件619位置之前的配置由备份文件自行实现

接下来把备份的文件远程拷贝到Node4主机上:

scp /data/all.sql 192.168.114.40:/opt

从Node4上:

开启二进制日志:

[root@Node4 ~]#:vim /etc/my.cnf
......
server-id=40
log-bin=/data/mysql/log/mysql-bin

建立路径并重启数据库:

[root@Node4 ~]#:mkdir /data/mysql/log/ -p
[root@Node4 ~]#:chown -R mysql.mysql /data
[root@Node4 ~]#:systemctl restart mysqld

这时先看一下数据库:是没有hellodb数据库的。

修改备份脚本:

vim /opt/all.sql

找到CHANGE MASTER TO这一行,做以下修改:

进入数据库:把/opt/all.sql备份文件导入进来:source /opt/all.sql

开启从。查看从节点的状态

再次查看数据库:

模拟故障:

我们在从上给数据库中的表teachers插入一条数据:那么是第5条数据了

在主上也插入同样的数据:

按说这一条应该是第6条数据。

在从上查看节点状态:发现主从复制就失败了。出现了一个错误!

这时在主上再插入一条数据:

这里的err按说是第6条数据,lisi是第7条数据。

由于前面的错误,导致在从上就不会再显示了,提示主键重复,整个都down掉了。需要解决故障问题。先看一下从上的表数据:

通过show slave status\G;查看,显示主键重复!

重启一下,就是两个yes了:start slave;

在主上插入一条数据:

mysql> insert into teachers values(null,'lisi2',20,'M');
Query OK, 1 row affected (0.00 sec)

查看主上的数据:

在从上查看是否有lisi2:

mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | err           |  24 | F      |
|   6 | lisi          |  21 | M      |
|   7 | lisi2         |  20 | M      |
+-----+---------------+-----+--------+

同步了!

四、级联

级联与一主一从一样,就在从后面再加一台服务器。作为从

主1--主2--从1

主2上要做的操作:在/etc/my.cnf中最下面添加一个:

[root@Node2 ~]#:vim /etc/my.cnf
......
log_slave_updates    #级联操作必须加

由于中间的服务器是前面的从也是后面的主,对于后面来说,中间的这个也需要建立一个用户:

mysql> grant replication slave on *.* to test@'192.168.114.%' identified by 'Admin@123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

这样是为了给后面从服务器指定节点。

后面可以跟两台从服务器:

在/etc/my.cnf中只需要配置一个server-id即可:

7-3:7-2上:show master stauts;
CHANGE MASTER TOMASTER_HOST='192.168.114.20',MASTER_USER='test',MASTER_PASSWORD='Admin@123',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
start slave;
7-4:7-2上:show master stauts;
CHANGE MASTER TOMASTER_HOST='192.168.114.20',MASTER_USER='test',MASTER_PASSWORD='Admin@123',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=449;
start slave;

验证:

在Node1主上创建一个数据库lxd;

在中间的从服务器(也是后面两台的主)也同步了Node1主的数据:

Node1主创建数据库:

mysql> create database lxd;
Query OK, 1 row affected (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lxd                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

Node2从:(也是后面两台的主)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lxd                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

实现级联同步!

---end---

相关文章:

Linux运维:mysql主从复制原理及实验

当一台数据库服务器出现负载的情况下,需要扩展服务器服务器性能扩展方式有向上扩展,垂直扩展。向外扩展,横向扩展。通俗的讲垂直扩展是将一台服务器扩展为性能更强的服务器。横向扩展是增加几台服务器。 主从复制好比存了1000块钱在主上&…...

022-GeoGebra中级篇-几何对象之直线与坐标轴

本文主要介绍一下GeoGebra中直线的常见输入方式,比如工具栏输入、表达式输入、函数输入,最后再把坐标轴的调用简单介绍一下。内容比起传统的教学更偏向于实战一些,若感兴趣欢迎继续阅读。 目录 一、直线1. 关于工具栏绘制(1&#…...

node js安装、配置(Windows版)

目录 node js 安装 node js 全局配置 1、全局安装路径 2、全局缓存路径 3、修改环境变量 pnpm安装、卸载 全局安装pnpm 验证pnpm版本 卸载pnpm 1、移除全局安装的包 2、移除pnpm cli 脚本直接安装 npm安装的使用命令直接卸载 node js 安装 cmd 查看是否存在&…...

go语言day08 泛型 自定义错误处理 go关键字:协程

泛型: 抛错误异常 实现error接口类型 用java语言解释的话,实现类需要重写error类型的抽象方法Error().这样就可以自定义异常处理。 回到go语言,在Error()方法中用*argError 这样一个指针类来充当error接口的实现类。 在f2()方法中定义返回值…...

MySql性能调优01-[数据结构和索引]

数据结构和索引 什么是索引索引的种类常见索引数据结构和区别二叉树 红黑树 什么是索引 索引的种类 在Mysql中索引是在存储引擎层实现的,而不是在服务层实现的 按数据结构分:Btree索引、Hash索引、Full-text索引按存储结构分:聚簇索引、非聚…...

【算法入门-栈】逆波兰表达式求值

📖逆波兰表达式求值 ✅描述✅扩展:什么是逆波兰表达式✅题解方法一:栈✅题解方法二(数组模拟栈) 今天又刷了一道题,奥利给 刷题地址: 点击跳转 ✅描述 给定一个逆波兰表达式,求表达…...

【史上最全面ESP32教程】http通信

文章目录 前言HTTP协议是什么?HTTP协议的特点HTTP协议的常见应用 esp32 使用http通信通信流程基础使用HTTPClient 常用的函数函数介绍:void end(void);bool connected(void);void setReuse(bool reuse);void setUserAgent(const String& userAgent);…...

*算法训练(leetcode)第二十七天 | 56. 合并区间、738. 单调递增的数字、968. 监控二叉树

刷题记录 56. 合并区间*738. 单调递增的数字*968. 监控二叉树 56. 合并区间 leetcode题目地址 排序后遇到有重合的区间选择最大的区间保存即可,结果集中保存的是离当前区间最近的区间,因此使用当前区间与结果集中的最后一个集合比较查看是否有重合&…...

OpenJudge 奇数求和

目录 描述思路样例输入样例输出CodeCC 总时间限制: 1000ms 内存限制: 65536kB 描述 计算非负整数 m 到 n(包括m 和 n )之间的所有奇数的和,其中,m 不大于 n,且n 不大于300。例如 m3, n12, 其和则为:357911…...

【排序 - 快速排序】

快速排序(Quick Sort)是一种高效的排序算法,它基于分治(Divide and Conquer)的策略。这种排序算法的核心思想是选择一个基准元素,将数组分割成两部分,使得左边的元素都小于等于基准元素&#xf…...

pytest使用报错(以及解决pytest所谓的“抑制print输出”)

1. 测试类的类名问题 #codingutf-8import pytestclass TestClass1:def setup(self) -> None:print(setup)def test_01(self) -> None:print(test_01111111111111111111111)def test_02(self) -> None:print(test_02)以上述代码为例,如果类名是Test开头&am…...

开源项目编译harbor arm架构的包 —— 筑梦之路

GitHub - amy5200/harbor-arm64 先做个记录,空了再验证...

[笔记] SKF Enveloping FAQ 用户指南

文档编号:Application Note CM3013 1.名词解释: 1.1cavitationWhat Is Cavitation? | Pumps & Systems 叶片在液体中扰动形成的超声波 1.2 stiff machinehttps://suspensionlist.com/the-pros-and-cons-of-stiff-vs-soft-suspension-systems/ …...

宪法学学习笔记(个人向) Part.3

宪法学学习笔记(个人向) Part 3 3. 国家基本制度 3.1 国家性质 3.1.1 国家性质概述 国家性质的概念 国家性质也称国体,或国家的阶级本质,是指各个阶级在国家中的地位(哪个阶层是统治阶层,哪个阶层是被统治阶层,哪个…...

联想拯救者Y7000 IRX9 笔记本接口功能介绍

适用机型:Legion Y7000 IRX9; 83JJ; USB(3.2 Gen 1)Type-接口摄像头开关组合音频插孔 多用于USB Type-C接口 以太网接口 多用途USB Type-C接口(支持USB Power Delivery)HDMI接口USB(3.2 Gen 1&…...

【ESP32】打造全网最强esp-idf基础教程——16.SmartConfig一键配网

SmartConfig一键配网 一、SmartConfig知识扫盲 在讲STA课程的时候,我们用的是代码里面固定的SSID和密码去连接热点,但实际应用中不可能这么弄,我们得有办法把家里的WiFi SSID和密码输入到设备里面去,对于带屏带输入设备还…...

MD5加密和注册页面的编写

MD5加密 1.导入包 npm install --save ts-md5 2.使用方式 import { Md5 } from ts-md5; //md5加密后的密码 const md5PwdMd5.hashStr("123456").toUpperCase(); 遇见的问题及用到的技术 注册页面 register.vue代码 <template><div class"wappe…...

【Android组件】封装加载弹框

&#x1f4d6;封装加载弹框 ✅1. 构造LoadingDialog✅2. 调用LoadingDialog 效果&#xff1a; ✅1. 构造LoadingDialog 构造LoadingDialog类涉及到设计模式中的建造者模式&#xff0c;进行链式调用&#xff0c;注重的是构建的过程&#xff0c;设置需要的属性。 步骤一&#x…...

Spring源码二十:Bean实例化流程三

上一篇Spring源码十九&#xff1a;Bean实例化流程二中&#xff0c;我们主要讨论了单例Bean创建对象的主要方法getSingleton了解到了他的核心流程无非是&#xff1a;通过一个简单工厂的getObject方法来实例化bean&#xff0c;当然spring在实例化前后提供了扩展如&#xff1a;bef…...

前端导出文件时,后端代码出错如何将错误信息返回给前端展示

功能说明&#xff1a;前端导出excel时&#xff0c;后端出现异常&#xff0c;比如sql异常&#xff0c;或者创建excel时出现的异常&#xff0c;希望将这些异常信息返回给前端查看。 框架&#xff1a;vue3 axios Springboot 实现难度分析&#xff1a;前端导出excel&#xff0c…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...