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

        本文属于专栏《构建工业级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://xiahunao.cn/news/2806186.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习 深度学习资料 资源machine learning

Kaggle入门,看这一篇就够了 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/25686876 day1-1.什么是机器学习_哔哩哔哩_bilibiliday1-1.什么是机器学习是10天学会机器学习从入门到深度学习的第1集视频,该合集共计62集,视频收藏或关注UP主&a…

猫头虎分享已解决Bug || ValueError: Setting an array element with a sequence.

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

临时内核映射

临时内核映射与永久内核映射的区别是,临时内核映射可以在中断处理程序和可延迟函数内部使用,它不堵塞当前进程。 一 原理介绍 临时内核映射的线性地址在永久内核映射的后面,范围是[FIXADDR_START, FIXADDR_TOP),其基本逻辑是获取…

vivo 基于 StarRocks 构建实时大数据分析平台,为业务搭建数据桥梁

在大数据时代,数据分析和处理能力对于企业的决策和发展至关重要。 vivo 作为一家全球移动互联网智能终端公司,需要基于移动终端的制造、物流、销售等各个方面的数据进行分析以满足业务决策。 而随着公司数字化服务的演进,业务诉求和技术架构有…

基于MATLAB优化的多焦点相位

1、概要 目前智能手机的显示屏得益于机械或化学性能的稳定,让这些手机非常耐用,显示屏具有足够硬度使其可以承受住很大的压力,甚至多年使用下来都没有磨损迹象。 但是另一方面,材料的硬度通常伴随着脆性,手机的屏幕玻…

第四十二回 假李逵翦径劫单身 黑旋风沂岭杀四虎-python读写csv和json数据

李逵答应了宋江三件事:不可吃酒,独自前行,不带板斧。李逵痛快答应了,挎一口腰刀,提着朴刀,带了一锭大银子,三五个小银子就下山去了。 宋江放心不下,于是请同乡朱贵也回家一趟&#…

【Postman+Newman】接口自动化测试以及测试报告输出

Newmanpostman自动化测试 postmanPre-request Script前置脚本 Newman测试报告输出 postman 学习postman脚本编写 Pre-request Script前置脚本 Newman 测试报告输出 输出报告时使用的命令:     -r html,json,junit 指定生成html,json&#xff0c…

Java并发-并发编程的三个核心问题

文章目录 并发编程的三个核心问题参考 并发编程的三个核心问题 并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问…

猫头虎分享已解决Bug || Rust Error: expected function, found module ‍

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

【Java程序设计】【C00277】基于Springboot的招生管理系统(有论文)

基于Springboot的招生管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的招生管理系统 本系统分为系统功能模块、管理员功能模块以及学生功能模块。 系统功能模块:在系统首页可以查看首页、专业…

Git diff Word 文档

前言 前段时间用 nodeJS 写了一个提交代码的工具,开发过程中在认证部分遇到了一些小问题,于是就想看看官方的文档中有没有什么说明之类的,没想到文档中的内容十分丰富,除了解释了 git 相关的原理外,还学到了很多有用的…

软考-中级-系统集成2023年综合知识(三)

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 软考中级专栏回顾 专栏…

【PythonGIS】基于Python融合矢量数据(多面合一)

之前发过使用批量合并矢量数据的文章:【Python&GIS】基于Python批量合并矢量数据,正好前段时间有需求把矢量数据进行融合,然后就编了一段融合矢量数据的代码。今天就和大家分享一下如何使用Python对矢量数据实现融合的操作。 1.定义 首先…

金南瓜SECS/GEM如何添加工程?

公开资料皆为是2、3年前版本 编译SecsEquip.dll依赖库 ① 打开示例程序中的SecsEquip项目 ② 选中SecsEquip工程,右键选择属性 如果没有“解决方案资源管理器”页面,可以从菜单的“视图”->“解决方案资源管理器”打开 ③ 选择跟设备相同的NET版本…

This dependency was not found解决方法

问题如上(前端代码),我是引用js文件出的问题,无法找到api/userManage模块。 解决:没感觉哪有问题,把后面加了个/,就解决了,代表src目录,应该是目录和目录之间应该有/作为分割:

python 提取PDF文字

使用pdfplumber,不能提取扫描的pdf和插入的图片。 import pdfplumberfile_path rD:\UserData\admindesktop\官方文档\1903_Mesh-Models-Overview_FINAL.pdf with pdfplumber.open(file_path) as pdf:page pdf.pages[0]print(page.extract_text()) # 所以文字prin…

DIcom调试Planar configuration

最近和CBCT组同事调dicom图像 这边得图像模块老不兼容对方得dicom文件。 vtk兼容,自己写得原生解析不兼容。 给对方调好了格式,下次生成文件还会有错。 简单记录下,日后备查。 今天对方又加了 个字段:Planar configuration 查…

koa项目部署云服务器(部署本地虚拟机中)

文章目录 一、服务器安装Node、MySQL1.1. 安装Node.js1.2. 安装MySQL1.3.配置MySQL1.4. 数据库迁移 二. 部署Node项目2.1. 代码托管到Git仓库(选做)2.2. 代码clone到服务器(选做)2.3. VSCode中打开代码(推荐&#xff0…

【二十七】【C++】二叉树练习

606. 根据二叉树创建字符串 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与…

集成TinyMCE富文本编辑器

若依的基础上集成TinyMCE富文本编辑器 前端bootstrap TinyMCE官网链接 TinyMCE所需静态资源下载链接 开源项目-若依链接 将TinyMCE静态资源包放入项目中&#xff1b; 代码引入css&#xff1a; <!-- 引入TinyMCE CSS --><link th:href"{/ajax/libs/tinymce/j…