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 TO
  MASTER_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      |
+-----+---------------+-----+--------+

同步了!

---end---

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter-实现双向PK进度条

如何实现一个双向PK进度条 在Flutter应用中,进度条是一个非常常见的组件。而双向PK进度条则能够展示两个对立的数值,如对战中的双方得分对比等。本文将介绍如何实现一个具有双向PK效果的进度条,并支持竖直和斜角两种过渡效果。 1. 需求 我…

仪器校准后出了校准证书后,是不是就代表仪器合格了?

仪器校准是一门技术活,对于从事生产制造的企业而言,是不可或缺的一环,因为这与产品质量密切相关。所以,了解仪器校准的相关知识也变得尤为重要。 在拿到校准证书后,是不是说明仪器合格了?相信不少企业品管人…

苍穹外卖--sky-take-out(五)前端

大部分笔记都是写在语雀的,这是一次性从本人语雀复制过来的,可能结构有些错乱 基础创建 环境要求 node.js npm Vue CLI 创建前端工程 使用vue ui命令创建 项目结构 启动项目 打开命令行窗口 快捷键ctrlj 或者 运行 输入:npm run ser…

基于单片机的多功能电子时钟的设计

摘要:提出了一种基于单片机的多功能电子时钟的设计方法,以 AT89C52单片机作为系统的主控芯片,采用DS1302作为时钟控制芯片,实现日期时钟显示并且提供精准定时的功能。此外,还可经由DHT22所构成的温湿度传感电路&#x…

Chair Footrest Protective Cover

Chair Footrest Protective Cover 万能通用型椅子脚垫保护套凳子耐磨硅胶加厚垫桌椅脚垫防滑静音套

【学术会议征稿】2024年工业自动化与机器人国际学术会议(IAR 2024)

2024年工业自动化与机器人国际学术会议(IAR 2024) 2024 International Conference on Industrial Automation and Robotics 2024年工业自动化与机器人国际学术会议(IAR 2024)将于2024年10月18-20日在新加坡隆重召开。会议将围绕…

ConcurrentHashMap是如何保证线程安全的-put方法简要分析

简介 ConcurrentHashMap 是 Java 中并发编程中常用的线程安全的哈希表(HashMap)实现。它具有以下几个显著的特点和优点,适合在特定的并发场景中使用: 线程安全性: ConcurrentHashMap 提供了并发访问的线程安全保证&am…

Keras实战之图像分类识别

文章目录 整体流程数据加载与预处理搭建网络模型优化网络模型学习率Drop-out操作权重初始化方法对比正则化加载模型进行测试 实战:利用Keras框架搭建神经网络模型实现基本图像分类识别,使用自己的数据集进行训练测试。 问:为什么选择Keras&am…

RedHat9 | Zabbix-Server监控服务部署

系统版本以及软件版本 使用的系统版本: Red Hat Enterprise Linux release 9.2 软件版本: zabbix-release-7.0-3.el9.noarchzabbix-web-7.0.0-release1.el9.noarchzabbix-web-mysql-7.0.0-release1.el9.noarchzabbix-web-deps-7.0.0-release1.el9.noar…

基于Android Studio订餐管理项目

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 能够实现登录,注册、首页、订餐、购物车,我的。 用户注册后,登陆客户端即可完成订餐、浏览菜谱等功能,点餐,加入购物车,结算,以及删减…

【电商纯干货分享】干货速看!电商数据集数据API接口数据分析大全!

数据分析——深入探索中小企业数字化转型,专注提供各行业数据分析干货、分析技巧、工具推荐以及各类超实用分析模板,为钻研于数据分析的朋友们加油充电。 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中&#xff09…

Unity编辑器扩展之Inspector面板扩展

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity编辑器扩展之Inspector面板扩展 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取&#xff…

Java--Super

1.super调用父类的构造方法,必须在构造方法的第一个 2.super必须只能出现在子类的方法或者构造方法中 3.super和this不能同时调用构造该方法 和this差别 1.代表的对象不同 this():代指本身调用者这个对象 super(&a…

Docker-文件分层与数据卷挂载详解(附案例)

文章目录 文件分层数据卷挂载的含义数据卷挂载实践数据卷挂载案例数据卷挂载方式数据卷常用命令容器间数据共享 更多相关内容可查看 文件分层 例:拉取mysql5.7的镜像,在继续拉取mysql5.8的镜像,会出现一部分文件已存在的现象 这种分层技术 是…

同花顺问财选股,使用自然语言的形式调接口选股

http形式的接口调用问财接口:https://stockapi.com.cn/v1/base/xuangu?strategy创业板,竞价涨幅大于1,竞价量比大于1 代码中调用该接口调试数据。

cmake编译源码教程(一)

1、介绍 本次博客介绍使用cmake编译平面点云分割的源代码,其对室内点云以及TLS点云中平面结构进行分割,分割效果如下: 2、编译过程 2.1 源代码下载 首先,下载源代码,如下所示,在该文件夹下新建一个build文件夹,用于后续生成sln工程。 同时,由于该库依赖open…

什么是 DDoS 攻击及如何防护DDOS攻击

自进入互联网时代,网络安全问题就一直困扰着用户,尤其是DDOS攻击,一直威胁着用户的业务安全。而高防IP被广泛用于增强网络防护能力。今天我们就来了解下关于DDOS攻击,以及可以防护DDOS攻击的高防IP该如何正确选择使用。 一、什么是…

springboot云南特色民宿预约系统-计算机毕业设计源码81574

目 录 第 1 章 引 言 1.1 选题背景 1.2 选题目的 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统性需求分析…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

idea使用技巧---超实用的mybatisX插件

一、使用原因 传统创建mybatis项目之后,在mapper接口和xml映射文件之间手动切换非常麻烦:不仅需要记住文件的所在位置,而且每次在mapper当中添加一个新的接口,都需要单独手动点开xml再编写sql; eg:在item…