数据库管理与高可用-MySQL主从复制与读写分离

目录

#1.1MySQL主从复制原理

  1.1.1MySQL支持的复制类型

  1.1.2复制的工作过程

#2.1MySQL读写分离原理

  2.1.1常见的MySQL读写分离为为两种

#3.1主从复制+读写分离的实验案例


1.1MySQL主从复制的原理

        MySQL 主从复制是一种常用的数据同步机制,用于将主数据库(Master)的数据变更同步到一个或多个从数据库(Slave),实现数据冗余、读写分离和高可用性。 

 1.1.1MySQL支持的复制类型

    1.基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句,MySQL默认采用基于语句的复制,效率比较高。

    2.基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

    3.混合类型的复制:默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

 1.1.2复制的工作过程

  1. 在每个事务更新数据完成之前,Master 将这些改变记录进二进制日志。写入二进制日志完成后,Master 通知存储引擎提交事务。

  2.  Slave 将 Master 的 Binary log 复制到其中继日志(Relay log)。首先,Slave 开始一个工作线程 ——I/O 线程,I/O 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件。I/O 线程将这些事件写入中继日志。

    3. SQL slave thread(SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据保持一致。只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。

2.1MySQL读写分离原理

  MySQL 读写分离是优化数据库负载、提升系统性能与可用性的常用方案,核心围绕 “分离读写压力,利用主从复制保障数据一致”。

 2.1.1常见的MySQL读写分离分为两种  

   (1)基于程序代码内部实现
     在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。

   (2)基于中间代理层实现
      代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有两个代表性程序。

3.1主从复制+读写分离的实验案例

配置Master主服务器

1.vim /etc/my.cnf

log-bin=/usr/local/mysql/data/mysql-bin

binlog_format = MIXED

server-id=1

2.重启MySQL服务

3.登录MySQL程序,给从服务器授权

 配置Slave从服务器

  1.slave1,slave2上的server-id不能一致,slave1为server-id=2,而slave2为server-id=3,在vim /etc/my.cnf中配置。

  2.重启mysqld服务

  3.登录mysqld,配置同步

  4.验证主从复制效果

 搭建MySQL读写分离

  安装Mycat2

   安装并配置mycat软件

   创建Mycat2工作所必须得账号

   启动Mycat2

   第一步:Mycat增加数据源

 查看数据源信息

   第二步:创建Mycat集群

   查看并修改集群配置

   修改负载均衡的默认策略为轮询

   修改配置后需要重启mycat 

   登录mycat集群,创建测试库和测试表

  停止slave1和slave2的主从同步

    slave1:

[root@localhost ~]# mysql -uroot -p
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

   slave2:

[root@localhost ~]# mysql -uroot -p
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

  在master和slave1,slave2创建测试数据

      Master 上操作:

mysql> use test;
Database changed
mysql> insert into test.zang values ('1','zhang','this_is_master');
Query OK, 1 row affected (0.01 sec)

     slave1上操作:

mysql> use test;
Database changed
mysql> insert into test.zang values ('2','zhang','this_is_slave1');
Query OK, 1 row affected (0.01 sec)

     slave2上操作:

mysql> use test;
Database changed
mysql> insert into test.zang values ('3','zhang','this_is_slave2');
Query OK, 1 row affected (0.01 sec)

   登录mycat集群,查询tets.zang的数据

[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.101
mysql> select * from test.zang; 
+----+-------+----------------+
| id | name  | address        |
+----+-------+----------------+
|  2 | zhang | this_is_slave1 |
+----+-------+----------------+
1 row in set (0.01 sec)mysql> select * from test.zang; #第二次查询
+----+-------+----------------+
| id | name  | address        |
+----+-------+----------------+
|  3 | zhang | this_is_slave2 |
+----+-------+----------------+
1 row in set (0.01 sec)
mysql> select * from test.zang;  
+----+-------+----------------+
| id | name  | address        |
+----+-------+----------------+
|  2 | zhang | this_is_slave1 |
+----+-------+----------------+
1 row in set (0.01 sec)[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.101
MySQL [(none)]>insert into zang values('4','zhang','write_test');
Query OK, 1 row affected (0.08 sec)

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

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

相关文章

Python60日基础学习打卡Day45

之前的神经网络训练中,为了帮助理解借用了很多的组件,比如训练进度条、可视化的loss下降曲线、权重分布图,运行结束后还可以查看单张图的推理效果。 如果现在有一个交互工具可以很简单的通过按钮完成这些辅助功能那就好了,他就是…

React项目的状态管理:Redux Toolkit

目录 1、搭建环境 2、Redux Toolkit 包含了什么 3、使用示例 (1)创建user切片 (2)合并切片得到store (3)配置store和使用store 使用js来编写代码,方便理解一些 1、搭建环境 首先&#xf…

父组件prop传向子组件的值,被子组件直接v-model绑定 功能不生效

隐式修改组件属性会导致功能异常 实际操作中发现,即便是父组件把简单数据通过prop传给了子组件,子组件再使用v-model绑定,也不行,响应式还是对异常 原vue2业务中存在组件定义某个类型为Object的属性,然后将该属性对象…

c#bitconverter操作,不同变量类型转byte数组

缘起:串口数据传输的基础是byte数组,write(buff,0,num)或者writeline(string),如果是字符串传输就是string变量就可以了,但是在modbus这类hex传递时,就要遇到转换了,拼凑byte数组时需要各种变量的值传递,解…

【Redis】set 类型

set 一. set 类型介绍二. set 命令sadd、smembers、sismemberscard、spop、srandmembersmove、srem集合间操作交集:sinter、sinterstore并集:sunion、sunionstore差集:sdiff、sdiffstore 三. set 命令小结四. set 内部编码方式五. set 使用场…

02-Redis常见命令

02-Redis常见命令 Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样: 贴心小建议:命令不要死记,学会查询就好啦 Redis为了方便学习,将操作不同数据类型的命…

Rk3568驱动开发_GPIO点亮LED_12

需求: 用配置寄存器方式控制点灯非常原始,现在采用更方便的Linux提供的pctrl和gpio子系统编写字符驱动 1.设备树配置: 现将开发板中呼吸灯关闭掉防止占用到我需要使用的引脚 /* Narnat 2025-5-29 RK3568 GPIO 无需设置pinctrl*/gpioled{co…

阿里云ACP云计算备考笔记 (3)——云存储RDS

目录 第一章 云存储概览 1、云存储通用知识 ① 发展历史 ② 云存储的优势 2、云存储分类 3、文件存储业务场景 第二章 块存储 1、块存储分类 2、云盘的优势 3、创建云盘 4、管理数据盘 ① 格式化数据盘 ② 挂载数据盘 ③ 通过 API 挂载云盘 5、管理系统盘 ① 更…

亚矩阵云手机实测体验:稳定流畅背后的技术逻辑​

最近在测试一款云手机服务时,发现亚矩阵的表现出乎意料地稳定。作为一个经常需要多设备协作的开发者,我对云手机的性能、延迟和稳定性要求比较高。经过一段时间的体验,分享一下真实感受,避免大家踩坑。 ​​1. 云手机能解决什么问…

STM32H562----------ADC外设详解

1、ADC 简介 STM32H5xx 系列有 2 个 ADC,都可以独立工作,其中 ADC1 和 ADC2 还可以组成双模式(提高采样率)。每个 ADC 最多可以有 20 个复用通道。这些 ADC 外设与 AHB 总线相连。 STM32H5xx 的 ADC 模块主要有如下几个特性: 1、可配置 12 位、10 位、8 位、6 位分辨率,…

【Android】双指旋转手势

一,概述 本文参考android.view.ScaleGestureDetector,对双指旋转手势做了一层封装,采用了向量计算法简单实现,笔者在此分享下。 二,实例 如下,使用RotateGestureDetector即可委托,实现旋转手…

B站的视频怎么下载下来——Best Video下载器

B站(哔哩哔哩)作为国内最受欢迎的视频平台之一,聚集了无数优质内容:动漫番剧、游戏实况、学习课程、纪录片、Vlog、鬼畜剪辑……总有那么些视频让人想反复观看、离线观看,甚至剪辑创作。 但你是否遇到过这样的烦恼&am…

基于SFC的windows系统损坏修复程序

前言 在平时使用Windows操作系统时会遇到很多因为系统文件损坏而出现的错误 例如:系统应用无法打开 系统窗口(例如开始菜单)无法使用 电脑蓝屏或者卡死 是如果想要修复很多人只能想到重装系统。但其实Windows有一个内置的系统文件检查器可以修复此类错误。 原理 SFC命令…

智绅科技 —— 智慧养老 + 数字健康,构筑银发时代安全防护网

在老龄化率突破 21.3% 的当下,智绅科技以 "科技适老" 为核心理念,构建 "监测 - 预警 - 干预 - 照护" 的智慧养老闭环。 其自主研发的七彩喜智慧康养平台,通过物联网、AI 和边缘计算技术,实现对老年人健康与安…

用函数实现模块化程序设计(适合考研、专升本)

函数 定义:本质上是一段可以被连续调用、功能相对独立的程序段 c语言是通过“函数”实现模块化的。根据分类标准不同函数分为以下几类。 用户角度:库函数、自定义函数 函数形式:有参函数、无参函数 作用域:外部函数、内部函数 …

OpenCV 滑动条调整图像亮度

一、知识点 1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange 0, void * userdata 0); (1)、创建一个滑动条并将其附在指定窗口上。 (2)、参数说明: trackbarname: 创建的…

vcs仿真产生fsdb波形的两种方式

目录 方法一: 使用verilog自带的系统函数 方法二: 使用UCLI command 2.1 需要了解什么是vcs的ucli,怎么使用ucli? 2.2 使用ucli dump波形的方法 使用vcs仿真产生fsdb波形有两种方式,本文参考《vcs user guide 20…

【前端】每日一道面试题6:解释Promise.any和Promise.allSettled的使用场景及区别。

Promise.any() 和 Promise.allSettled() 是 JavaScript 中用于处理异步操作的两种不同策略的 Promise 组合器,它们的核心区别在于逻辑目标与结果处理方式: 1. Promise.any() 使用场景: 需要获取 首个成功结果(类似竞速成功优先&…

数据链路层__

文章目录 数据链路层基本概念(1)链路管理:面向连接的服务(2)帧同步:成帧1、字符计数法2、字符填充法(带填充的首尾界符法)3、带填充的首位标志法4、物理层编码违例法 (3&…

coze智能体后端接入问题:

是否一定要按照coze官方API文档格式调用? 不一定:以下面代码为例(给了注释) app.route(/compare_models, methods[POST]) def compare_models():print("收到 compare_models 请求!") #begin-这一部分代码作用:从前端接…