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---

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

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

相关文章

Android14之获取包名/类名/服务名(二百二十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

深度学习-梯度下降算法-NLP(五)

梯度下降算法 深度学习中梯度下降算法简介找极小值问题数学上求最小值梯度梯度下降算法 找极小值问题在深度学习流程中深度学习整体流程图求解损失函数的目标权重的更新 深度学习中梯度下降算法简介 找极小值问题 引子: 我们训练一个人工智能模型,简单…

磁致伸缩液位计原理和特点

工作原理 磁致伸缩液位计的工作原理基于磁性材料在外部磁场作用下的尺寸变化来进行液位测量。该液位计主要由电子变送器、浮球(浮子)、探测杆(测杆)三部分组成。在磁致伸缩液位计的传感器测杆外配有一浮子,此浮子可以…

【SpringCloud应用框架】Nacos服务配置中心

第四章 Spring Cloud Alibaba Nacos之服务配置中心 文章目录 一、基础配置二、新建子项目1.pom文件2.YML配置3.启动类4.业务类5.Nacos配置规则 三、Nacos平台创建配置操作四、自动配置更新五、测试 一、基础配置 Nacos不仅仅可以作为注册中心来使用,同时它支持作为…

【环境准备】 Vue环境搭建

文章目录 前言vue-cli 安装创建项目3.0、以下3.0 、以上 前言 书接上回《NodeJs(压缩包版本)安装与配置》,安装完了NodeJs,接下来就要配置vue的环境了。 vue-cli 安装 安装vue-cli输入如下命令 #(安装的是最新版) npm install …

观察者模式(Observer Pattern)

观察者模式(Observer Pattern) 定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。别名&#xff1…

鼠标宏怎么设置?6款鼠标自动点击器强推,游戏玩家专用!(2024全)

随着电子游戏和日常应用的不断发展,我们经常会遇到一些重复性的任务或操作。而在这种情况下,鼠标宏以其自动化的特点成为了许多玩家和使用者的利器之一。如果你正在寻找如何设置鼠标宏来简化操作并提高效率,那么你来对地方了。在本文中&#…

【Java]认识泛型

包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。 泛型 泛型是在JDK1.5引入的…

ASAN排查程序中内存问题使用总结

简介 谷歌有一系列Sanitizer工具,可用于排查程序中内存相关的问题。常用的Sanitizer工具包括: Address Sanitizer(ASan):用于检测内存使用错误。Leak Sanitizer(LSan):用于检测内存…

【9-2:RPC设计】

RPC 1. 基础1.1 定义&特点1.2 具体实现框架1.3 应用场景2. RPC的关键技术点&一次调用rpc流程2.1 RPC流程流程两个网络模块如何连接的呢?其它特性RPC优势2.2 序列化技术序列化方式PRC如何选择序列化框架考虑因素2.3 应用层的通信协议-http什么是IO操作系统的IO模型有哪…

Vortex GPGPU的硬件设计和代码结构分析

文章目录 前言一、GPGPU是什么?1.1 GPU和GPGPU之间的差异1.2 GPU和CPU之间的集成方式1.3 GPU包含什么(列举和VMIPS向量体系结构的差异) 二、Vortex GPGPU是什么?2.1 Vortex GPGPU的技术边界和验证环境2.2 Vortex GPGPU的指令集设计…

安卓稳定性之crash详解

目录 前言一、Crash 的基本原理二、Crash 分析思路三、实例分析四、预防措施五、参考链接 前言 在开发和测试 Android 应用程序时,遇到应用程序崩溃是很常见的情况。 Android 崩溃指的是应用程序因为异常或错误而无法正常执行,并且导致应用强制关闭。 一…

p11函数和递归

递归与迭代 求n的阶乘。&#xff08;不考虑溢出&#xff09; int Fac1(int n) {int i0;int ret1;for(i1;i<n;i){ret*i;}return ret; } int main(){//求n的阶乘int n0;int ret0;scanf("%d",&n);retFac1(n);printf("%d\n",ret);return 0; } int Fac…

unity知识点 专项四 一文彻底说清楚(锚点(anchor)、中心点(pivot)、位置(position)之间的关系)

一 概述 想要使UI控件在屏幕中达到正确的显示效果&#xff0c;比如自适应屏幕尺寸、固定边距等等&#xff0c;首先要理清楚几个基本概念和设置&#xff1a;锚点(anchor)、中心点(pivot)、位置(position)、UI缩放模式、父物件的transform设置 二 Anchor、Pivot与Position 2…

网络连接线相关问题

问题1&#xff1b; 直通线为什么两头都是T568B&#xff1f;是否可以两台T5568A&#xff1f;或者任意线序&#xff0c;只需两头一致&#xff1f; 不行&#xff0c;施工规范规定。&#xff08;原因&#xff1b;网线最长距离100m&#xff0c;实际用起来要把网线包管&#xff0c;走…

【分布式系统】Filebeat+Kafka+ELK 的服务部署

目录 一.实验准备 二.配置部署 Filebeat 三.配置Logstash 四.验证 一.实验准备 结合之前的博客中的实验 主机名ip地址主要软件es01192.168.80.101ElasticSearches02192.168.80.102ElasticSearches03192.168.80.103ElasticSearch、Kibananginx01192.168.80.104nginx、Logs…

iperf3: error - unable to connect to server: No route to host

1.确认iperf3版本是否统一。 2.确认防火墙是否关闭。 关闭防火墙 : systemctl stop firewalld 查看防火墙状态: systemctl status firewalld 3.重新建起链接

自动驾驶算法———车道检测(一)

“ 在本章中&#xff0c;我将指导您构建一个简单但有效的车道检测管道&#xff0c;并将其应用于Carla 模拟器中捕获的图像。管道将图像作为输入&#xff0c;并产生车道边界的数学模型作为输出。图像由行车记录仪&#xff08;固定在车辆挡风玻璃后面的摄像头&#xff09;捕获。…

【ZIP压缩大揭秘】轻松掌握ZIP分卷压缩包的高效解压秘籍!

在这个信息爆炸的时代&#xff0c;文件大小常常成为我们分享与存储的绊脚石。幸运的是&#xff0c;ZIP分卷压缩技术如同一把钥匙&#xff0c;巧妙地将庞然大物分解成小巧易管理的部分。但面对这一串分卷压缩包&#xff0c;你是否也曾迷茫于如何高效解压&#xff0c;恢复文件的完…

解码Python字符串:‘r‘、‘b‘、‘u‘和‘f‘前缀的全面指南

&#x1f4d6; 正文 1 字符串前加’r’ 表示原始字符串&#xff0c;消除转义 print(abc\nde) # abc # deprint(rabc\nde) # abc\nde在下面这个列子中&#xff0c;如果不在路径字符串前面加r那么&#xff0c;路径中的空格就会出现问题 print(rD:\01 programming\09python\py…