Snowflake - 数据新鲜度缓存

Posted

技术标签:

【中文标题】Snowflake - 数据新鲜度缓存【英文标题】:Snowflake - Caching with Data Freshness 【发布时间】:2021-11-03 19:02:50 【问题描述】:

我读过很多关于雪花缓存的文章,但不明白雪花如何解决其他“共享一切架构”遇到的数据新鲜度问题。我的理解是,在数据更改时共享所有内容,本质上需要一些锁定。

如this article中所述:

为了提高效率,两个节点都在内存中缓存了记录 1 的本地副本。然后客户端尝试更新记录 1,以便“foo”变为“bar”。要以一致的方式执行此操作,DBMS 必须在可能已缓存记录 1 的所有节点上采用分布式锁。随着集群中机器数量的增加,这种分布式锁会变得越来越慢,因此可能会阻碍数据库的可扩展性。写作过程。

换句话说,如果雪花在计算层缓存数据,但在 S3 中底层数据发生变化,雪花不会遇到与其他共享一切架构相同的缓存问题吗?我在分析数据库中得到了这一点,更新较少,但为什么传统的共享一切架构不起作用?

我看到的唯一答案是,雪花有一个查询优化器,可以检查底层数据是否发生了变化。但是仍然不明白这一点/这是对传统共享所有数据库的缓存策略的重大升级。

【问题讨论】:

从您的问题中不清楚您认为 Snowflake 声称的内容,关于缓存,不适用于其他一些数据库 - 请您解释一下吗? Snowflake 将使用它在各种类型的缓存中保存的数据,除非缓存的数据是陈旧的,在这种情况下它将查询表(以与许多其他 DBMS 类似的方式) - 您对此有何疑问/问题? 像尼克一样,我不确定您的问题是什么。但我会回答你问题的最后一部分。 Snowflake 的数据统计始终是最新的,您无需更新它们。因此,Snowflake 知道“远程”存储数据已更改,因此它可能会使缓存中的内容无效,因此需要从远程存储中获取数据。 嘿,刚 - 我是一名数据工程老师......所以没有问题/什么都没有......当我解释技术时,我尝试通过解释它们如何比以前的升级来进行教学技术......对于雪花来说,计算层似乎与存储分离,但我很难理解它是如何改进共享一切架构的。所以我打算解释进化是:1. 共享一切(缓存/锁定问题) 2. 什么都不共享(洗牌/缩放问题) 3. 雪花 - 两者兼而有之,但如何.. 从存储中分离计算的好处是您可以在不影响数据的情况下纵向扩展/扩展您的计算资源。因此,Snowflake 允许您运行多个不同大小的仓库(计算引擎),它们都读取相同的数据但不会相互影响 【参考方案1】:

我相信您在这里缺少的关键概念是 Snowflake 永远不会更新记录......永远。相反,它会创建一个新的微分区,其中包含旧微分区中应用了更改的所有数据。这样,Snowflake 的服务层立即知道仓库缓存中的微分区不再有效,因为根据服务层它不再处于活动状态。

唯一需要锁的情况是“更新”缓存或基础数据。这从来不会发生在这里。一旦更新语句完成,新的微分区就会激活。在更新运行时,数据没有“脏”状态,因此针对该表运行的任何查询将始终是更新运行时的先前状态或更新后状态。不需要锁。

这能回答你的问题吗?

【讨论】:

谢谢 Mike - 这很有帮助,是否有其他资源可以让我了解更多相关信息? 总是一本好书:pages.cs.wisc.edu/~yxy/cs839-s20/papers/snowflake.pdf

以上是关于Snowflake - 数据新鲜度缓存的主要内容,如果未能解决你的问题,请参考以下文章

访问 Snowflake 中的结果缓存会消耗计算积分吗?

以下可缓存资源的新鲜度很短 - Google 字体

OKHttp缓存有效期

http缓存协议详解

http 中的缓存

HTTP权威指南----缓存