您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Meta如何将缓存一致性提高到99.99999999%

时间:2024-04-15 12:13:22  来源:dbaplus社群  作者:

介绍

缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩展繁重的工作负载并节约成本。由于他们的用例非常依赖缓存,这带来另一系列问题,即缓存失效。

多年来,Meta已经将他们的缓存一致性指标从99.9999%(6个9)提高到99.99999999%(10个9),这意味着在其缓存集群中,每十亿次缓存写入中,不一致的写入次数将少于1次。

本文将重点讨论以下内容:

  • 什么是缓存失效和缓存一致性?
  • 为什么Meta对缓存一致性如此重视,甚至6个9的准确率都无法满足需求?
  • Meta的监控系统如何帮助他们改善缓存失效和缓存一致性,并修复错误的?

一、缓存失效和缓存一致性

顾名思义,缓存并不保存数据的原始来源,因此当原始来源的数据发生变化时,应该有一个主动使陈旧缓存条目失效的过程。如果在失效过程中处理不当,可能会在缓存中无限期地留下与原始来源不一致的值。

那么,我们如何使缓存失效呢?

我们可以设置TTL(生存时间)来维持缓存的新鲜度,由此就没有其他系统会导致缓存失效了。但是,在本文的主题是Meta的缓存一致性,我们将假设使缓存失效的操作是由缓存本身以外的其它系统执行的。

首先,让我们看看缓存不一致是如何产生的:

请假设1、2、3、4是依次递增的时间戳。

  • 缓存首先尝试从数据库中填充值。
  • 但在x=42的值到达缓存之前,某个操作更新了数据库,将x的值改为43。
  • 数据库发送了x=43的缓存失效事件,并在x=42到达缓存之前到达了缓存,于是缓存的值被设置为43。
  • 现在,事件x=42到达缓存,缓存的值被设置为42,于是引入了不一致性。

为了解决这个问题,我们可以使用版本字段来执行冲突解决,这样旧版本就永远不会覆盖当前版本。该解决方案适用于互联网上几乎 99% 的公司,但由于系统的复杂性,这个解决方案可能还是无法应对Meta的运营规模。

二、为什么Meta如此重视缓存一致性?

从Meta的角度来看,缓存不一致几乎与数据库数据丢失一样糟糕,而从用户的角度来看,缓存不一致可能导致糟糕的体验。

当你在Instagram上给用户发送私信(DM)时,后台会有一个用户到主存储器(用户信息就存储在主存储器)的映射,用户的信息就存储在主存储器中。

想象一下这里有三个用户:Bob、Mary和Alice。这两个用户都给Alice发送了消息。Bob在美国,Alice在欧洲,而Mary在日本。因此,系统会查询离用户最近的区域,并将消息发送到Alice的数据存储区。在这种情况下,当TAO(The Associations and Objects,Meta的社交图谱存储系统)副本查询Bob和Mary所在的区域时,它们都有不一致的数据,并将消息发送到了没有任何Alice消息的区域。

在上述情况下,将会出现消息丢失和糟糕的用户体验,因此这是Meta需要解决的首要问题之一。

三、监控

要解决缓存失效和缓存一致性问题,首先要进行测量。如果我们能够准确测量缓存一致性,并在缓存中出现不一致条目时发出警报,就能发现问题。然而Meta确保其测量结果不包含任何误报,只是因为值班工程师会忽略警报,由此指标就失去可信度和可用性。

在深入探讨Meta实施的解决方案之前,最简单的解决方案将是记录并跟踪缓存的每次状态变化。在工作负载较小的情况下,这个方案是可行的,但Meta的系统每天的缓存填充量超过10万亿次。记录和跟踪所有缓存状态,会将已经很重的缓存工作负载变成更加沉重,我们甚至不想考虑如何调试它。

四、Polaris

宏观来看,Polaris作为客户端与有状态服务进行交互,并假定其对服务内部结构一无所知。Polaris基于“缓存最终应与数据库一致”的原则工作。Polaris接收失效事件后会查询所有副本,以验证是否发生其他违规情况。

例如:如果Polaris接收到x=4版本4的失效事件,它以客户端身份检查所有缓存副本,以验证是否发生其他违规情况。如果一个副本返回x=3@版本3,Polaris会将其标记为不一致,并重新获取样本,以便稍后与同一目标缓存主机进行检查。Polaris会在特定的时间尺度(例如,一分钟、五分钟或十分钟)内报告不一致性。

这种多时间尺度的设计不仅允许Polaris内部拥有多个队列,以有效实现回退和重试,对于防止误报也至关重要。

让我们通过另一个例子来理解这一点:

假设Polaris接收到一个版本为4的失效事件x=4。但当Polaris检查缓存时,却找不到x的条目,它应该将此标记为不一致。在这种情况下,有两种可能性。

  • 在版本3时,x是不可见的,但版本4的写入是该键上的最新写入,这确实是一个缓存不一致。
  • 可能是版本5的写入删除了键x,也许Polaris只是看到了比失效事件中更新的数据。

现在,我们如何确定这两种情况中哪一种是正确的?

为了验证这两种情况Polaris需要通过查询数据库进行检查。绕过缓存的查询可能是计算密集型的,并且也可能使数据库面临风险,因为保护数据库和扩展读取密集型工作负载是缓存的两个最常见的用例。因此,我们不能向系统发送太多查询。

Polaris的解决方案是,延迟执行此类检查并调用数据库,直到不一致的样本超过设定的阈值(例如1分钟或5分钟),从而解决了这个问题。Polaris的产品指标表述为“在M分钟内,N个九的缓存写入是一致的。”因此,目前Polaris提供了一个指标:表示在五分钟的时间尺度内,99.99999999%的缓存是一致的。

现在,让我们通过一个编码示例,了解Polaris如何帮助Meta解决由缓存不一致性引起的bug:

假设有一个缓存,它维护着密钥到元数据的映射和密钥到版本的映射。

cache_data = {}

cache_version = {}

meta_data_table = {"1": 42}

version_table = {"1": 4}

1.当读取请求到来时,首先在缓存中检查该值。如果缓存中不存在该值,则从数据库中返回该值。

def read_value(key):

value = read_value_from_cache(key)

if value is not None:

return value

else:

return meta_data_table[key]

  •  

def read_value_from_cache(key):

if key in cache_data:

return cache_data[key]

else:

fill_cache_thread = threading.Thread(target=fill_cache(key))

fill_cache_thread.start()

return None

2.缓存返回 None 结果,然后开始从数据库填充缓存。我在这里使用了线程来使进程异步。

def fill_cache(key):

fill_cache_metadata(key)

fill_cache_version(key)

def fill_cache_metadata(key):

meta_data = meta_data_table[key]

print("Filling cache meta data for", meta_data)

cache_data[key] = meta_data

def fill_cache_version(key):

time.sleep(2)

version = version_table[key]

print("Filling cache version data for", version)

cache_version[key] = version

def write_value(key, value):

version = 1

if key in version_table:

version = version_table[key]

version = version + 1

write_in_databse_transactionally(key, value, version)

time.sleep(3)

invalidate_cache(key, value, version)

def write_in_databse_transactionally(key, data, version):

meta_data_table[key] = data

version_table[key] = version

3.同时,当版本数据填入缓存时,数据库可能会有新的写入请求,更新元数据值和版本值。此时这看似是一个bug,但实际不是,因为缓存失效应使缓存恢复到与数据库一致的状态(注意,我在缓存中添加了 time.sleep,并在数据库中添加了写入函数,以复现该问题)。

def invalidate_cache(key, metadata, version):

try:

cache_data = cache_data[key][value] ## To produce error

except:

drop_cache(key, version)

def drop_cache(key, version):

cache_version_value = cache_version[key]

if version > cache_version_value:

cache_data.pop(key)

cache_version.pop(key)

read_thread = threading.Thread(target=read_value, args=("1"))

write_thread = threading.Thread(target=write_value, args=("1",43))

print_thread = threading.Thread(target=print_values)

4.后来,在缓存失效过程中,由于某些原因导致失效失败,在这种情况下,异常处理程序有条件放弃缓存。

丢弃缓存函数的逻辑是,如果最新值大于 cache_version_value,那么就删除该键,但在我们实际情况中并非如此。因此,这将导致在缓存中无限期地保留陈旧的元数据。

请注意,这只是对bug发生过程的简化表述,实际中的bug会更加错综复杂,涉及数据库复制和跨区域通信。只有当上述所有步骤都按特定顺序发生时,才会触发bug。这种不一致性很少被触发,一般都隐藏在交错操作和临时错误后面的错误处理代码中。

既然您已经接到 Polaris 调用缓存不一致的请求,那么最重要的就是检查日志,看看问题出在哪里。正如我们之前所讨论的,记录每一个缓存数据变化几乎是不可能的,但如果我们只记录有可能导致变化的变化呢?

五、一致性跟踪

如果正在值班的你接到了Polaris报告的缓存不一致性的通知,最重要的是检查日志并确定问题出在哪里。正如我们之前讨论的,记录每个缓存数据更改几乎是不可能的,但如果我们只记录那些有可能导致不一致性的更改呢?

我们查看上面实现的代码,如果缓存没有收到失效事件或者失效操作没有生效,那么问题就可能发生。从值班人员的角度来看,我们需要检查以下内容:

  • 缓存服务器是否接收到了失效请求?
  • 服务器是否正确处理了失效请求?
  • 之后相关条目是否变得不一致了?

Meta已经构建了一个有状态追踪库,该库在这个紫色小窗口中记录和跟踪缓存变更,所有有趣且复杂的交互都在这里触发bug,从而导致缓存不一致。

结论

对于任何分布式系统来说,可靠的监控和日志系统都是必不可少的,以确保我们能够抓住bug,并在捕获bug时迅速找到根本原因,从而减少问题发生。以Meta为例,Polaris识别异常后立即发出警报。借助一致性跟踪提供的信息,值班工程师在不到30分钟内就定位到了bug。

>>>>参考资料

  • engineering.fb.com/2022/06/08/core-infra/cache-made-consistent/

作者丨Mayank Sharma 编译丨onehunnit

来源丨medium.com/@mayank.sharma2796/how-meta-improved-their-cache-consistency-to-99-99999999-58d79674a806

*本文为dbaplus社群编译整理,如需转载请取得授权并标明出处!欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn



Tags:Meta   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15  Search: Meta  点击:(0)  评论:(0)  加入收藏
Meta确认5月发布Llama 3,参数量达1400亿
周二,在伦敦的一场活动上,Meta 确认计划在下个月初推出其 LLM 的最新版 Llama 3,这个模型是驱动生成式 AI 助手的核心技术。这一消息证实了《The Information》杂志周一发布的...【详细内容】
2024-04-12  Search: Meta  点击:(7)  评论:(0)  加入收藏
Meta推出新版自研AI芯片:性能较上代提高三倍,降低对英伟达依赖
AI(人工智能)芯片紧缺之际,越来越多科技巨头选择自行研发。当地时间4月10日,社交巨头Meta公布了自主研发芯片MTIA的最新版本。MTIA是Meta专门为AI训练和推理工作设计的定制芯片...【详细内容】
2024-04-11  Search: Meta  点击:(5)  评论:(0)  加入收藏
AI是万灵药?Meta要把大模型塞进AR眼镜里
寻找下一块“屏幕”,这无疑是最近几年科技行业的一个热门赛道。随着个人计算机点燃了互联网,智能手机让移动互联网无处不在之后,这前后两次造富神话的出现,也让所有人都在期待下...【详细内容】
2024-04-09  Search: Meta  点击:(8)  评论:(0)  加入收藏
AI产业的灰色暗面:OpenAI、谷歌、META如何搞训练语料
财联社4月7日讯(编辑 史正丞)种种迹象显示,目前站在全世界AI领域潮头浪尖的这些公司,早在几年前就已经陷入对训练语料的“绝望”追逐中——为此他们不惜修改政策条款...【详细内容】
2024-04-09  Search: Meta  点击:(4)  评论:(0)  加入收藏
Meta:Quest 手势追踪不会用于模拟手柄
IT之家 3 月 28 日消息,Meta Quest 用户期待的“空气手柄”功能可能要落空了。近日,Meta 的一位产品经理明确表示,手势追踪功能不会用于模拟传统的实体手柄控制器。据IT之家了...【详细内容】
2024-03-29  Search: Meta  点击:(11)  评论:(0)  加入收藏
Meta:苹果入局证明扎克伯格对AR/VR坚持投入是正确的
(映维网Nweon 2024年01月29日)根据《华尔街日报》报道,对于苹果携Vision Pro正式入局头显市场,Meta实际上非常欢迎,并希望苹果及Vision Pro可以助力他们已投入500亿美元的元宇宙...【详细内容】
2024-01-29  Search: Meta  点击:(54)  评论:(0)  加入收藏
谷歌Gemini大逆转?斯坦福Meta华人证明其推理性能强于GPT-3.5
新智元报道编辑:编辑部【新智元导读】谷歌放出的Gemini,在对标GPT的道路上似乎一直处于劣势,Gemini真的比GPT-4弱吗?最近,斯坦福和Meta的学者发文为Gemini正名。Gemini的推理能力...【详细内容】
2024-01-02  Search: Meta  点击:(72)  评论:(0)  加入收藏
股价飙升150%走出市值暴跌阴影,扎克伯格的Meta今年做对了什么?
原文来源:元宇宙新声图片来源:由无界 AI生成2023年对于Facebook母公司Meta来说,是一个转折点。截至第三季度,Meta的股价涨幅已超过150%,这一显著的反弹让人难以想象就在去年,公司...【详细内容】
2023-12-26  Search: Meta  点击:(58)  评论:(0)  加入收藏
Meta头显新增舌头追踪,网友大写震惊:我不问也不想知道为什么
量子位 | 公众号 QbitAI就还挺突然的……Meta的MR头显可以进行舌头追踪了。效果be like:有了这个新功能,咱就可以舔虚拟甜筒冰淇淋,也能更好地表达天气很热,以及___...【详细内容】
2023-12-20  Search: Meta  点击:(109)  评论:(0)  加入收藏
▌简易百科推荐
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15    dbaplus社群  Tags:Meta   点击:(0)  评论:(0)  加入收藏
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(3)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(8)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(15)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(11)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(8)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(14)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(10)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(12)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(13)  评论:(0)  加入收藏
站内最新
站内热门
站内头条