- 工程实践 - 《QPS百万级的有状态服务实践》05 - 持久化存储

news/2024/4/29 14:15:02/文章来源:https://blog.csdn.net/ly52352148/article/details/136273852

        本文属于专栏《构建工业级QPS百万级服务》


        继续上篇《QPS百万级的有状态服务实践》04 - 服务一致性。目前我们的系统如图1。现在我们虽然已经尽量把相同用户的请求转发到相同的机器,并且在客户端做了适配。但是因为成本,更极端的情况下,服务依然是最终一致性。截止目前,用户查询不同日期间的功能我们已经我完成了。

图1

        现在我们还有一个需求,用户想看到历史的查询请求和结果。要看历史,就需要一个持久化存储的方式。比如古人就是用石头刻龟壳,把信息持久化存储。这个方式有用,但是效率太低,现代,最通用的方式是机械硬盘,它在成本和高效方面,目前平衡做得最好。那看起来我们的方案很简单,就是每个服务把用户请求和返回都存在本地磁盘,然后当用户来查询的时候,返回给他。一开始我们就是这么做的。著名的Oracle也是从做本地数据库开始的。

        但是随着互联网用户数量变多,用户对数据存储稳定性的要求变高。本地数据库一个关键问题暴露了,就是磁盘是会坏的,一般情况下硬盘寿命在3-5年,如果数据只存了一份,磁盘坏了,数据就丢了,就像如果古人刻有信息的龟壳坏了,那信息将永久丢失。所以对于重要的数据,古人会把信息刻在多个龟壳上,减少信息丢失的概率。我们也一样,要做的就是把数据存几份冗余。这样的需求是大部分业务都需要的,所以分布式数据库应运而生。我们的业务选择相对成熟的MySQL。

        所以我们的架构升级了,如图2。图中,我们选择每个机房有自己的MySQL集群的原因是因为,跨机房的延迟是远大于同机房,而我们的业务容器是同步查询MySQL,如果查询延迟大,将极大影响吞吐量。为了整体成本,我们选择每个机房有自己的MySQL集群,虽然集群有两个,但是两个集群总共使用的机器数,比只使用一个集群多不了太多。

图2

        但现在的方案还不够完美。因为目前我们每个机房处理一部分用户,如果机房1出现故障,所有的请求会飘移到机房2,但是机房2只有一部分用户的持久化数据,那用户就会查不到历史请求数据。并且在机房1故障恢复之后,刚刚被转移到机房2的用户的持久化数据还在机房2呢,这个时候,转移回机房1的用户也会丢失查询历史。

        容易想到,也是业界普遍的做法,就是让MySQL集群1和MySQL集群2做自动同步,于是我们架构升级为图3。

图3

        虽然架构升级了,但是问题还没有完全解决。因为数据同步是有延迟的,一般来说是秒级的,所以在一个机房出现故障时,请求转移的瞬间,可能机房间还没完成该用户的同步。这个问题是不能100%解决的,不仅是数据传播需要时间,还因为MySQL集群中的部分机器也可能在请求转移的时候重启或者坏掉,这样数据同步的延迟会更高。但是好消息时,只有极少情况下,用户会丢失最近的请求记录,并且在几秒后就恢复了。日常我们在使用网页或者APP时,发现数据不对,刷新几次就好了,也是常见的操作了,这就是背后的原因之一。

        注意,每个机房有独立的MySQL集群不是所有场景的最佳方案。我们的服务使用独立的MySQL集群有一个很重要的原因的,我们不希望机房延迟导致业务容器处理能力下降很多。因为对于请求量达到QPS百万级的业务,业务容器一般很多,成本一般很高,一旦降低容器处理能力,那成本会增加很多。但是对于处理用户量不大,对几十毫秒的延迟不敏感的场景,通过双机房容灾,但是使用一个集群的MySQL才是最佳的方案,维护简单,成本也几乎不会增长。还是那句话,架构只有最适合,没有最优

        截止目前为止《工业级QPS百万级服务从0到1概述》的需求我们都已经完成。

        但是,前面只说了持久化存储方案选择MySQL,但是为什么选择它,还有其他哪些持久化方案可以选择。以及这个方案背后有什么共性,它们的原理、成本到底是怎样的。对于海量请求,在使用它们时需要注意什么,我会在后面的章节分享。

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

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

相关文章

神经网络系列---激活函数

文章目录 激活函数Sigmoid 激活函数Tanh激活函数ReLU激活函数Leaky ReLU激活函数Parametric ReLU激活函数 (自适应Leaky ReLU激活函数)ELU激活函数SeLU激活函数Softmax 激活函数Swish 激活函数Maxout激活函数Softplus激活函数 激活函数 一般来说&#xf…

LabVIEW多场景微振动测试平台与教学应用

LabVIEW多场景微振动测试平台与教学应用 在多种工程实践中,微振动的测试与分析对于评估结构的稳定性及其对环境的影响至关重要。针对这一需求,开发了一套基于NI-cDAQ和LabVIEW的多场景微振动测试平台,提高微振动测试的精确度与灵活性&#x…

分享一个我爱工具网源码优化版

应用介绍 本文来自:分享一个我爱工具网源码优化版 - 源码1688 前几天在网上看到了一个不错的工具网源码,但是源码存在一些问题,遂进行了修改优化。 主要修改内容有: 1、后台改为账号密码登录,上传即用,不…

如何使用ArcGIS Pro生成等高线

无论在制图还是规划中,经常会使用到等高线,大多数情况下,从网上获取的高程数据都是DEM文件,我们可以通过ArcGIS Pro来生成等高线,这里为大家介绍一下生成方法,希望能对你有所帮助。 数据来源 教程所使用的…

计网 - 域名解析的工作流程

文章目录 Pre引言1. DNS是什么2. 域名结构3. 域名解析的工作流程4. 常见的DNS记录类型5. DNS安全6. 未来的发展趋势 Pre 计网 - DNS 域名解析系统 引言 在我们日常使用互联网时,经常会输入各种域名来访问网站、发送电子邮件或连接其他网络服务。然而,我…

【群智能算法转让】一种新的群智能算法||一种超越隐喻的元启发算法||一种基于数学的群智能算法

1、简介 本次全新出推出一个新的基于种群的元启发算法,基于数学中求解非线性方程组的基本思想而开发的,性能不错 新算法转让Q1 top级(一种基于数学的超越隐喻的元启发式算法) 新的群智能算法转让,新的元启发式算法转…

Vue单文件学习项目综合案例Demo,黑马vue教程

文章目录 前言一、小黑记事本二、购物车三、小黑记账清单 前言 bilibili视频地址 一、小黑记事本 效果图 主代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible&…

EtherCAT 转 ModbusTCP 网关

功能概述 本产品是 EtherCAT 和 Modbus TCP 网关&#xff0c;使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站&#xff0c;接 TwinCAT 、CodeSYS 、PLC 等&#xff1b;在 ModbusTCP 侧做为 ModbusTCP 主站&#xff08;Client&#xff09;或从站&#xff08;Se…

界面控件DevExpress ASP.NET Spreadsheet组件 - 轻松集成电子表格功能!(二)

DevExpress ASP. NET Spreadsheet组件允许您轻松地将电子表格功能合并到任意ASP. NET应用程序&#xff0c;它可以加载、转换和保存工作簿到XLS-XLSx二进制文件格式&#xff0c;还可以导出和导入XLSX、CSV和TXT文件。在上文中&#xff08;点击这里回顾>>&#xff09;&…

前沿科技速递——YOLOv9

随着YOLO系列的不断迭代更新&#xff0c;前几天&#xff0c;YOLO系列也迎来了第九个大型号的更新&#xff01;YOLOv9正式推出了&#xff01;附上原论文链接。 arxiv.org/pdf/2402.13616.pdf 同样是使用MS COCO数据集进行对比比较&#xff0c;通过折线图可看出AP曲线在全方面都…

【图论】【堆优化的单源路径】LCP 20. 快速公交

作者推荐 【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子 LCP 20. 快速公交 小扣打算去秋日市集&#xff0c;由于游客较多&#xff0c;小扣的移动速度受到了人流影响&#xff1a; 小扣从 x 号站点移动至 x 1 号站点需要花费的时间为 inc&#xff1b; 小扣从 x 号站…

Redis可视化工具——RedisInsight

文章目录 1. 下载2. 安装3. RedisInsight 添加 Redis 数据库4. RedisInsight 使用 RedisInsight 是 Redis 官方出品的可视化管理工具&#xff0c;支持 String、Hash、Set、List、JSON 等多种数据类型的管理&#xff0c;同时集成了 RedisCli&#xff0c;可进行终端交互。 1. 下载…

【Leetcode】2583. 二叉树中的第 K 大层和

文章目录 题目思路代码结果 题目 题目链接 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和&#xff08;不一定不同&#xff09;。如果树少于 k 层&#xff0c;则返回 -1 。 注意&#xff0c;如果两个节点与根…

SpringMVC 学习(三)之 @RequestMapping 注解

目录 1 RequestMapping 注解介绍 2 RequestMapping 注解的位置 3 RequestMapping 注解的 value 属性 4 RequestMapping 注解的 method 属性 5 RequestMapping 注解的 params 属性&#xff08;了解&#xff09; 6 RequestMapping 注解的 headers 属性&#xff08;了解&…

28V、115V、270V坦克装甲车启动电源:为现代战争注入新能量

28V、115V、270V坦克装甲车启动电源&#xff1a;为现代战争注入新能量 世界新格局的诞生后&#xff0c;现代战争已经从传统的陆地、海洋、空中扩展到了网络空间和外太空。在这种背景下&#xff0c;各种先进的武器装备不断涌现&#xff0c;为国家安全提供有力保障。28V、115V、2…

打开 Camera app 出图,前几帧图像偏暗、偏色该怎样去避免?

1、问题背景 使用的安卓平台&#xff0c;客户的应用是要尽可能快的获取到1帧图像效果正常的图片。 但当打开 camera 启动出流后&#xff0c;前3-5帧图像是偏暗、偏色的&#xff0c;如下图所示&#xff0c;是抓取出流的前25帧图像&#xff0c; 前3帧颜色是偏蓝的&#xff0c;…

【day02】每天三道 java后端面试题:Java、C++和Go的区别 | Redis的特点和应用场景 | 计算机网络七层模型

文章目录 1. Java、C和 Go 语言的区别&#xff0c;各自的优缺点&#xff1f;2. 什么是Redis&#xff1f;Redis 有哪些特点&#xff1f; Redis有哪些常见的应用场景&#xff1f;3. 简述计算机网络七层模型和各自的作用&#xff1f; 1. Java、C和 Go 语言的区别&#xff0c;各自的…

全流程点云机器学习(二)使用PaddlePaddle进行PointNet的机器学习训练和评估

前言 这不是高支模项目需要嘛&#xff0c;他们用传统算法切那个横杆竖杆流程复杂耗时很长&#xff0c;所以想能不能用机器学习完成这些工作&#xff0c;所以我就来整这个工作了。 基于上文的数据集切分 &#xff0c;现在来对切分好的数据来进行正式的训练。 本系列文章所用的…

LeetCode 1637.两点之间不包含任何点的最宽垂直区域

给你 n 个二维平面上的点 points &#xff0c;其中 points[i] [xi, yi] &#xff0c;请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 垂直区域 的定义是固定宽度&#xff0c;而 y 轴上无限延伸的一块区域&#xff08;也就是高度为无穷大&#xff09;。 最宽垂直区…

【C++】类和对象之拷贝构造函数篇

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 传值传参和传引用传参3. 概念4. 特征 1. 前言 在前面学习了6个默认成员函数中的构造函数和析构函数 【C】构造函数和析构函数详解&#xff0c;接下来继续往后看拷…