处理读写分离延迟

由于网络、CPU资源等原因,读写分离的延迟不可避免。所以,在引入读写分离方案的时候,要优先考虑数据延迟对业务是否有影响。下面主要讨论对有影响的情况下,有哪些方式可以尽量减少影响。

延迟处理方案

主从延迟可以很小,也可能很大,这是我们无法控制的。如果只用选择一个方案来解决延迟问题,就要考虑到最极端的情况,势必会让方案的成本超出预期。所以,最好是根据业务的重要程度,选择不同的方案。

读主库

对于一致性要求高的地方,这是最简单的方式,读主库就没有数据延迟问题。所以,引入读写分离之后,一定要对业务进行合理的划分。在功能实现上,如果用的ShardingPhere框架,默认在事务里的查询会默认走主库,一般就是写库。打开spring.shardingsphere.props.sql-show=true 配置就能打印SQL在哪个库执行。

Actual SQL: master ::: Insert Into ...
Actual SQL: slave0 ::: Select * From ...

等待几秒

大多数情况下,延迟时间在1秒之内。写入成功后,主动等待1秒后再查询,可以确保大多数情况能查到数据。这种方式实现简单,对业务侵入性低。看似很low,但能解决对一致性有要求的情景。当然,无脑等1秒在延迟很低的情况下,1秒就是白等。

判断GTID

GTID全局事务ID是Mysql5.6引入,我们可以通过获取主库提交事务后的GTID,在从库里判断GTID是否已经执行。已经执行则代表主库的事务已经同步到从库。

先通过SHOW VARIABLES LIKE 'gtid_mode' 命令查看GTID是否开启,返回ON表示开启。

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode     | ON    |
+---------------+-------+

未开启的话要在my.cnf配置文件里开启。

gtid_mode = ON
enforce_gtid_consistency = ON

获取事务的GTID

在提交事务后,通过SHOW VARIABLES LIKE 'gtid_executed'; 或者SELECT @@GTID_EXECUTED; 查询到已经提交的事务ID集合,可能会返回ff782504-9b09-11ee-a4c3-0050568c4224:1-3 这样的格式,然后我们处理一下,获取最后一个事务IDff782504-9b09-11ee-a4c3-0050568c4224:3

从库判断事务是否同步

在从库通过*wait_for_executed_gtid_set*(gtid_set [, timeout]) 方法可以查询指定的事务ID是否已经执行成功,方法返回0表示已经执行;返回1表示执行超时;返回其他数值表示失败。

  • gtid_set是事务ID的集合,查询一个或多个事务可以用5f4cea4d-38b5-11ec-8814-0800272d6057:1,5f4cea4d-38b5-11ec-8814-0800272d6057:3 或连续的话用5f4cea4d-38b5-11ec-8814-0800272d6057:1-5这样的格式
  • timeout是可选参数,可以设置方法执行的超时时间,单位是秒。不传的话用的是**slave_net_timeout** 变量的值,默认是60秒。

例如,我们执行select *wait_for_executed_gtid_set*('5f4cea4d-38b5-11ec-8814-0800272d6057:3', 1); 返回了0,我们就知道数据同步完成,就可以继续查询数据。如果返回非0,就直接查主库。

总结

要判断主从严格一致的成本是很高的,用到GTID来判断主从延迟,对代码的侵入性很高,而且要额外的查询GTID和判断GTID是否同步,性能也会受到影响。如果业务场景对一致性要求很高,为了简化编程,还不如直接查主库。如果对一致性要求不高,直接读从库,或者等待1秒也是不错的方式。

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

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

相关文章

【python】程序运行添加命令行参数argparse模块用法详解

Python标准库之argparse,详解如何创建一个ArgumentParser对象及使用 一. argparse介绍二. 使用步骤及参数介绍三. 具体使用3.1 设置必需参数3.2 传一个参数3.3 传多个参数3.4 位置参数和可选参数3.5 参数设置默认值3.6 其它用法 一. argparse介绍 很多时候&#xff…

Amazon CodeWhisperer 在 vscode 的应用

文章作者:旧花阴 CodeWhisperer 是一款可以帮助程序员更快、更安全地编写代码的工具,可以在他们的开发环境中实时提供代码建议和推荐。亚马逊云科技发布的这款代码生成工具 CodeWhisperer 最大的优势就是对于个人用户免费。以在 vscode 为例,演示安装过程…

LeetCode 1901. 寻找峰值 II:二分查找

【LetMeFly】1901.寻找峰值 II:二分查找 力扣题目链接:https://leetcode.cn/problems/find-a-peak-element-ii/ 一个 2D 网格中的 峰值 是指那些 严格大于 其相邻格子(上、下、左、右)的元素。 给你一个 从 0 开始编号 的 m x n 矩阵 mat &#xff0c…

【漏洞复现】CVE-2023-6895 IP网络对讲广播系统远程命令执行

漏洞描述 杭州海康威视数字技术有限公司IP网络对讲广播系统。 海康威视对讲广播系统3.0.3_20201113_RELEASE(HIK)存在漏洞。它已被宣布为关键。该漏洞影响文件/php/ping.php 的未知代码。使用输入 netstat -ano 操作参数 jsondata[ip] 会导致 os 命令注入。 开发语言:PHP 开…

原子学习笔记3——使用tslib库

一、tslib介绍 tslib 是专门为触摸屏设备所开发的 Linux 应用层函数库,并且是开源。 tslib 为触摸屏驱动和应用层之间的适配层,它把应用程序中读取触摸屏 struct input_event 类型数据(这是输入设备上报给应用层的原始数据)并进行…

2023-2024-2Java面向对象程序设计-阶段性测试2

填空题(总分:10.00) 1、Java程序中使用【 import 】关键字导入外部的包。 2、使用【 final 】关键字声明的类不能有子类。 4、JVM是【 Java Virtual Machine 】的英文简写。 5、面向对象编程思想的三个特性是【封装】、【继承】、【多态】。 …

React和React native

React 和 React Native 都是由 Facebook 开发的开源 JavaScript 库,用于构建用户界面。虽然它们的名称和开发者相同,但它们的应用场景和功能有所不同。 React React 是一个用于构建用户界面的 JavaScript 库,尤其是单页面应用。它是由 Face…

数据分析师的职业规划与参考资料

数据分析师如何规划 参考:超详细的数据分析职业规划 一个产品的出现可以从业务和技术两个方向分析,业务需求技术支持产品的出现。 如果把职业也当成一个产品,也有类似的分析, 其中业务也就是领域,即这个业务领域的特点…

Power BI案例-医院数据集的仪表盘制作

数据集描述 医生数据集doctor 医生编号是唯一的,名称会存在重复 医疗项目数据projects 病例编号是唯一的,注意这个日期编号不是真正的日期。 日期数据date 这里的日期编号对应医疗项目数据中的日期编号 科室数据集Department 维度表 采购成本事实表…

知乎上高频提问:Redis到底是单线程还是多线程程序?

1.概述 这里我们先给出问题的全面回答:Redis到底是多线程还是单线程程序要看是针对哪个功能而言,对于核心业务功能部分(命令操作处理数据),Redis是单线程的,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff…

1112. 迷宫(DFS之连通性模型)

1112. 迷宫 - AcWing题库 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n∗n 的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。 同时当Extense处在某个格点时,他只…

海康rtsp拉流,rtmp推流,nginx部署转flv集成

海康rtsp拉流,rtmp推流,nginx部署转flv集成 项目实际使用并测试经正式使用无问题,有问题欢迎评论留言 核心后台java代码: try {// FFmpeg命令String command "ffmpeg -re -i my_video.mp4 -c copy -f flv rtmp://localho…

[学习笔记]批量迁移数据库文件

拷贝数据库文件 首先在本地运行如下SQL语句,查看数据库文件的磁盘位置 SELECT name, physical_name AS CurrentLocation, state_desc FROM sys.master_files默认是保存在C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA目录下 首先复制数据…

408真题笔记

计算机网络: 一:计算机网络体系 常考点: 1.OSI模型的:会话层,表示层 2.网络层:不可靠,无连接 3.运输层TCP:可靠,有连接 有连接,可靠的服务:传输层TCP 无连接&#xff…

Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)

目录 一、ansible概述 1、简介 2、Ansible主要功能: 3、Ansible的另一个特点:所有模块都是幂等性 4、Ansible的优点: 5、Ansible的四大组件: 二、ansible环境部署: 1、环境: 2、安装ansible&#…

浅析RoPE旋转位置编码的远程衰减特性

为什么 θ i \theta_i θi​的取值会造成远程衰减性 旋转位置编码的出发点为&#xff1a;通过绝对位置编码的方式实现相对位置编码。 对词向量 q \boldsymbol{q} q添加绝对位置信息 m m m&#xff0c;希望找到一种函数 f f f&#xff0c;使得&#xff1a; < f ( q , m ) …

MySQL数据库——SQL语法

Structured Query Language&#xff08;结构化查询语言&#xff09;&#xff0c;简称SQL&#xff0c;是用于操作关系型数据库的标准编程语言。SQL提供了一种与数据库交互的方式&#xff0c;可以用于查询、插入、更新和删除数据库中的数据。 1. SQL通用语法 SQL语句可以写在一…

持续集成交付CICD:K8S 手动完成前端项目应用发布与回滚

目录 一、实验 1.环境 2.Harbor查看镜像与连接K8S节点 3.K8S集群部署 nginx-ingress-controller 4. Jenkins 通过GitLab共享库 实现前端项目镜像构建 5.K8S node节点拉取镜像 6.K8S master节点更新部署文件 7.前端项目应用回滚 一、实验 1.环境 &#xff08;1&#x…

Android 架构 - 组件化

一、概念 组件化是对单个功能进行开发&#xff0c;使得功能可以复用。将多个功能组合起来就是一个业务模块&#xff0c;因此去除了模块间的耦合&#xff0c;使得按业务划分的模块成了可单独运行的业务组件。&#xff08;一定程度上的独立&#xff0c;还是依附于整个项目中&…

EXCEL VLOOKUP函数

参考资料 Excel&#xff1a;史上最全的VLOOKUP应用教程VLOOKUP函数最全面最详细的讲解大全&#xff0c;涵盖17个重要和常见用法&#xff01; 目录 零. 前提条件一. 单条件查找1.1 顺向查找1.2 逆向查找 二. 多条件查找2.1 顺向查找2.2 逆向查找 三. 根据条件查询等级四. 交差查…