从一到无穷大 #9 Firestore:开发者友好的Serverless NoSQL Database

news2024/11/27 2:39:27

引言

简单浏览了下ICDE 2023 industry-and-applications-track 部分的文章,其中我感兴趣的文章有三篇,分别为:

  1. Accelerating Cloud-Native Databases with Distributed PMem Stores
  2. Backward-Sort for Time Series in Apache IoTDB
  3. Firestore: The NoSQL Serverless Database for the Application Developer

当然最关心的就是当前这一篇了,简单浏览了一下摘要和介绍,发现这篇文章提到了一个实现和我最近做的东西很类似,即在另外一个系统之上建立一层多租户层。尤其是当底层系统是偏向于分析型场景时,因为此时一个RPC请求的资源消耗基本无法准确预测,此时请求本身无法作为隔离指标,遂需要在其他维度解决这个问题。

Firestore卖点

文章中放在摘要和介绍部分的必然是这个系统最为人称道的地方。可以看到字里行间中都透露这FireStore对于用户友好这一点的自豪,具体到点分为以下几个方面:

分类细节
移动端友好1. schemaless 2. ACID 3. 强一致性 4. 默认每个字段都存在索引
实时通知能力增量推送变化的实时查询
处理工作负载高峰的可扩展性挺扯淡的,建议用户五分钟内流量不要上涨50%,且建议qps从500开始[3]
灵活的按需计费,且提供每天部分免费配额以吸引用户这部分看起来并不是RU,而是记录日志,对接外部计费系统,这意味着Google还是不看好RU的
终端用户可以访问数据库终端用户的firestore操作直接路由到firestore,不需要专门的服务器进行访问控制,得益于开发者设置的安全规则[4][5]
断线操作移动设备可能在任意长时间内断开网络连接,应用程序需要在断开网络连接后部分服务人就成功,并在连接上网络后进行自动调节。大幅减少开发一个app的门槛
Write Triggers触发器,和Google Cloud Functions对接。这个后续我们的产品倒是可以参考,目前没看到别家厂商这么玩

文章贡献

  1. 从单一底层的关系型数据库之上建立一个多租户数据库服务
  2. 多租户架构如何支持快速扩展,高可用性,数据完整性和隔离性
  3. 客户端SDK库如何实现断开连接操作。如何计算并向客户端发送实时查询的通知更新。以及这些更新如何以一致的方式展现给终端用户

事实上这篇文章大部分篇幅用来描述如何以Spanner为底层存储系统的情况下实现查询,实时查询和写操作,但这不是我关心的部分,所以这篇文章不会提到操作实现部分的内容。

多租户与隔离

Firestore的所有组件和Spanner都在大量firestore中共享,特定组件中的任务数量会根据负载情况进行调整。
一个问题是一个数据库实例的流量可能消耗一个或者多个组件的全部或者绝大多数的资源来影响其他数据库实例的可用性,挑战如下:

  1. 一个独立的RPC不是一个统一的工作单位,不同的rpc之间资源消耗差异巨大,且请求本身无法预测消耗
  2. 瓶颈集中在Firestore后端的内存CPU隔离以及Spanner的CPU隔离
  3. 流量可能存在明显波峰

请添加图片描述

上面的挑战配合这这幅图来说,就是Fronted负责路由,瓶颈集中在Backend的CPU/内存和Spanner的CPU,需要处理波峰和大查询影响其他租户。

解决方案:

  1. 后端任务中使用了一个公平的CPU共享调度器,以租户ID作为key。
  2. 把租户ID传递给spanner,spanner内部设置了类似的公平CPU调度器。
  3. 此外某些批处理和内部工作负载在RPC上打上标签,使得延迟敏感的业务可以优先于这部分RPC(本质上就是本身没有能力辨别,需要用户介入隔离慢查询)。其实很多DB没有做慢查询的原因是过于复杂,不是所有的数据库都像Redis这样可以相对无理论压力的情况加入慢查询隔离,如果设计之初没有考虑到后续想做就难了,从这个角度看我推测后续可能会有论文以这里为创新点。
  4. 限制结果集和和单个RPC的工作量,API上允许先返回一部分数据,后续返回剩下的数据。本质上是小粒度的请求和资源消耗是有明显基线的,这也是KV系统使用Retro就可以很好的做到隔离的原因。文章中的做法其实就是流式查询,流式查询是为了解决数据量超大是对接入层内存威胁而引入的,但是以我的实际运营经验来看这样做问题也很大。。)
  5. 遇到两个需要大量内存多RPC的极端情况;需要限定给定数据库正在执行的查询的数量;或者流量导入到独立池中。这样做本质的原因是内存还是没隔离好。
  6. 为了防止用户请求波峰,Firestore要求符合要求的流量逐步增长,每分钟做多增加百分之五十,从500qps基础开始。(过于愚蠢)

总的来看,从

功能

  1. 为了减少管理成本,文档的每一个字段上都定义了一个升序索引和一个降序索引。防止某些频繁更新的字段造成写入瓶颈,允许用户指定字段不需要索引。
  2. Firestore支持强一致性的,或者最近时间点的点查,为了更好的使用缩影,一个查询最多有一个不等式谓词,且必须与第一个排序顺序匹配。
  3. 实时查询报告了一系列带有时间戳的快照,快照为与前一个快照的增量变化,文章中举量一个带删除的例子,实际不会返回给用户这个delete操作。这与时序数据库中的Rollup Cache思路类似,不过后者核心原因是存储资源过剩,可以保留部分查询结果,这对于BI分析等常见可以节省大量CPU资源。这里我想表达的核心逻辑其实是实时查询显然只查询一部分时间就可以。
  4. SDK客户端维护了一个缓存和索引,使用本地缓存加速访问,收到实时通知时更新,断开连接后可以使用本地缓存,连接网络时更新,且查询命中本地缓存不收费

其他经验

  1. firestore新版本发布后会立即影响用户流量,所以需要严格的灰度流程;在同一个地区缓慢推出配置和代码,然后才在多区域逐渐推出;使用自动化多A/B测试,对多个指标进行分析,看起来像是金丝雀发布,这在Google系统架构解密中有提到
  2. 数据完整性的问题,需要提防机器静默错误[8][9]。基本上没有运营经验是不会感觉到这种事情的恐怖的。入职一年不到,现在我已经经历过CPU损坏导致位翻转,磁盘跳变,网卡重启,数据中心断网等等以前完全认为不会发生的事情。这里需要提到的主要是三个事情;一为如何快速发现;二为如何恢复数据;三为控制面中故障检测与剔除部分如何快速且精确识别故障机器;

总结

这篇文章显然是一篇摸鱼文章。写下这篇文章的本质原因是我在看到摘要和介绍的时候以为Google的工程师们解决了这个我们头疼不已的问题,但原来还是和我们一样都是蒙起自己和客户的眼睛。

我理解这篇文章重点还是在介绍Firestore的卖点和实际读写,实时读的实现上。但是我感兴趣的还是他的架构实现,从我看文章的角度来看与[10]还是有不小的差距,无聊的一篇文章,但是看都看了,笔记也记了,不如听着歌润色一个半小时水一篇博客。

在这里插入图片描述

参考:
3. Firestore: The NoSQL Serverless Database for the Application Developer
4. 从一到无穷大 #7 Database-as-a-Service租户隔离挑战与解决措施
5. https://firebase.google.com/docs/firestore/best-practices#ramping_up_traffic
6. https://firebase.google.com/docs/rules#key_capabilities
7. https://firebase.google.com/docs/auth
8. Cores that don’t count
9. Silent Data Corruption at Scale
10. Amazon DynamoDB: A Scalable, Predictably Performant, and Fully Managed NoSQL Database Service

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

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

相关文章

10年测开经验面试35K公司后,吐血整理出高频面试题和答案!

一:前言 在当今竞争激烈的职场环境中,拥有丰富的测试开发经验已成为众多企业青睐的重要条件之一。而在面试过程中,高频面试题更是能够考察应聘者的实际能力和知识水平。本文作者具备10年的测试开发经验,并通过面试获得了35K公司的…

VMWare16和Ubuntu20.04虚拟机安装记录

VMWare网盘链接:https://pan.baidu.com/s/1zZvtwnH9N47_k3pAy2dZCg 提取码:1234 Ubuntu下载网址:Ubuntu Release 推荐20.04,网上的教程也比较多 列举两个我参考的,其实都大差不差。 保姆级教程|VMware安装Ubuntu20…

Android之 activity活动页面详解

一 四大组件 1.1 Activity组件,它一个单独的窗口,程序流程都必须在Activity中运行,所有它是最基本的模块。 1.2 service组件,用于在后台完成用户指定的操作。 1.3 content provider组件,会为所有的应用准备一个内容…

线对象QgsLineString

几何对象中线用QgsLineString进行封装支持Z和M值,用于表示2维的,2. 5维的,3维的线线是由一串点连接而成 创建线 QgsLineString() #创建空的线QgsLineString(points: Iterable[QgsPoint]) #从一串QgsPoint创建QgsLineString(x: Iterable…

[JavaScript]JSON对象

eval函数 eval函数能将一个字符串当做一段JS代码解释并执行。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&quo…

大数据经典项目案列——滴滴数据分析(云服务器-零基础从配置到项目落地1)

本次我们项目采用阿里云服务器&#xff0c;采用以下技术及框架协议&#xff0c;进行数据分析&#xff1a; HDFSHiveSpark SQLZeppelin 当然我们也可以利用数据库清洗好的数据&#xff0c;采用 1.Tableau 2.Pythonechartsweb前端 3.腾讯云、阿里云BI报表 4.当然我们也可以采…

51单片机(十四)LCD1602

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

SpringCloud Alibaba 配置中心功能

一、快速入门 1、创建工程nacos-client7777 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&q…

基于企业网的信息安全防护系统的设计与实现_kaic

摘 要 这篇文章提供了一种新的&#xff0c;基于“禁止一切”安全策略和VxD技术的企业网络安全保障方案&#xff0c;旨在帮助企业更好地应对外界的威胁。通过设计一套完善的企业网信息安全防护系统&#xff0c;不仅可以有效地解决企业网络中存在的问题&#xff0c;而且还可以有…

一文带你了解和掌握Markdown编辑神器mdnice

无论你是博客写作爱好者&#xff0c;还是想要自己动手开发一个网站&#xff0c;你都可能会接触到Markdown。Markdown是一种轻量级的标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的HTML内容。然而&#xff0c;当你想要将你的Mark…

MYSQL主从复制和读写分离.2

搭建MYSQL读写分离 master :192.168.142.10 slave1:192.168.142.20 slave2:192.168.142.30 Amoeba:192.168.142.40 客户端:192.168.142.50 ----Amoeba服务器配置---- ##安装 Java 环境## 因为 Amoeba 基于是 jdk1.5 开发的&#xff0c;所以官方推荐使用 jdk1.5 或 1.6 版…

Linux 指令3

文章目录 标题日期date时间戳 cal 日历find -name 查找which ls 搜指令whereisgrep 行文本过滤工具&#xff08;例如找到main函数入口&#xff09;例子 ps ajx 进程 打包压缩&#xff0c;解包解压&#xff08;过程是这么个过程&#xff0c;简化成压缩->解压&#xff09;zip多…

使用gitee上传vue项目

菜鸟教程&#xff1a;https://www.runoob.com/git/git-tutorial.html 参考文档&#xff1a;https://blog.csdn.net/handy_csdn/article/details/117400151#:~:text%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAvue%E9%A1%B9%E7%9B%AE%EF%BC%8C%E5%B9%B6%E4%BD%BF%E7…

试用chatgpt写一篇文章,关于自动化测试框架的思路

当涉及到软件测试和自动化框架时&#xff0c;Python是一种广泛使用的编程语言。它提供了丰富的库和工具&#xff0c;使得构建测试框架变得相对容易。本文将介绍一个基于Python的自动化测试框架&#xff0c;结合了pytest、allure报告、日志记录、YAML配置、MySQL数据库以及钉钉和…

JNI 中Get<PrimitiveType>ArrayElements 和 Release<PrimitiveType>ArrayElements 函数讲解

文章目录 Get<*PrimitiveType*>ArrayElements 函数族Release<*PrimitiveType*>ArrayElements 函数族使用场景 Get<PrimitiveType>ArrayElements 函数族 函数原型&#xff1a; NativeType *Get<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType ar…

vscode 标签的使用

使用标签就可以快速跳转到某一段代码,十分方便 安装 首先,我们需要安装 设置快捷键 shiftcommandp. 调出命令行 输入bookmark, 即可看到标签的相关指令 生成一个标签 设置一个你喜欢的快捷键 ,这代表 在光标所在的行上添加一个标签。需要设置一个label 调出列表 可以显示…

CMakeList.txt -- 编写保姆式教程

致每一个还坚持在互联网和软件行业的同路人。 最近有朋友问我为什么选择当程序员&#xff0c;我也不明白。可能是缺少社交能力&#xff0c;可能更喜欢心理上保存平静&#xff0c;可能是为了那份对于从无到有的沉浸感和满足感。 目录 欢迎加入陈达书--C交流群: Errrr113(非诚勿扰…

LitCTF Writeup By AheadSec

文章目录 Web我Flag呢&#xff1f;Follow me and hack mePing导弹迷踪PHP是世界上最好的语言&#xff01;&#xff01;作业管理系统Vim yyds这是什么&#xff1f;SQL &#xff01;注一下 &#xff01;就当无事发生Flag点击就送&#xff01;Http pro max plus1zjs彩蛋 Pwn只需要…

Jenkins持续集成项目搭建与实践—基于Python Selenium自动化测试

Jenkins简介 Jenkins是Java编写的非常流行的持续集成&#xff08;CI&#xff09;服务&#xff0c;起源于Hudson项目。所以Jenkins和Hudson功能相似。 在华为工作了10年的大佬出的Web自动化测试教程&#xff0c;华为现用技术教程&#xff01;_哔哩哔哩_bilibili在华为工作了10…

如何批量归类文件,按自己批定位置保存

先来给大家看下目前文件是这样的&#xff0c;一个文件夹里面保存是图片 &#xff0c;另一个文件夹保存是文档&#xff0c;我是需要一个图片对应一个文档&#xff0c;保存在同一个文件夹中。 这个是图片 这个是文档 我的需求是一张图片和一个文档保存同一个文件夹中&#xff0c…