Meta 如何实现 99.99999999% 的缓存一致性

曾经的故事

Meta(Facebook) 曾经运行一个简单的技术栈——PHP 和 MySQL。

但随着更多用户的加入,他们面临着可扩展性问题。因此他们建立了一个分布式缓存。

虽然这暂时解决了可扩展性问题,但保持缓存数据的新鲜度变得困难。以下是一种常见的数据不一致场景:

  1. 客户端查询缓存中的x,但缓存中不存在该值。
  2. 因此缓存会向数据库查询:x = 0
  3. 与此同时,数据库中的x发生了变化:x = 1
  4. 但缓存失效事件先到达缓存,缓存中的x发生变更:x = 1
  5. 然后第2步中查询到的x=0再次更新x值:x = 0

现在数据库中的值:x = 1,而缓存中的值:x = 0。所以存在缓存和数据库中的数据不一致。

尽管缓存不一致出现的概率很小,但是Meta 的用户增长速度却是爆炸性的,很快成为全球访问量第三大的网站。
在这里插入图片描述

现在他们每天处理一千万亿(10^15)个请求。所以即使有1%的缓存未命中率其代价也是昂贵的——每天有10万亿次缓存填充。

这篇文章介绍了 Meta 如何利用可观测性来提高缓存一致性。

缓存一致性

从用户的角度来看,缓存**不一致就像数据丢失一样。**因此他们创建了一个可观察性解决方案。以下是他们的做法:

1. 监控

Meta的开发人员开发了一个单独的服务来监控缓存不一致问题,并将该服务命名为Polaris
在这里插入图片描述

Polaris 的工作原理如下:

  • 它像一个缓存服务器一样工作,并接收缓存失效事件,当数据库中的数据发生变化时,失效事件会发送到缓存服务器和 Polaris。
  • 然后Polaris 会向缓存服务器查询数据,检查缓存中的数据是否与数据库中的数据一致。
  • 如果发现数据不一致,Polaris 会将这些缓存服务器加入队列,稍后再次检查,在必要时会从数据库中获取最新的数据,并将其更新到缓存中。以确保数据的一致性。
  • 它在写入期间检查数据的正确性,因此可以更快地发现缓存不一致

这里还是举一个例子来帮助理解Polaris 的工作原理:假设有一个电商网站,它使用缓存来加速用户访问产品信息的速度。缓存中存储了产品的价格、库存等信息,而这些数据的原始来源是数据库。

  • 数据库更新:某个商品的库存从10件增加到20件,数据库发送了一个缓存失效事件。
  • Polaris 接收事件:Polaris 收到了这个失效事件,并开始工作。
  • 查询缓存服务器:Polaris 向缓存服务器查询该商品的信息,发现缓存中的库存还是10件,与数据库中的20件不一致。
  • 排队并再次检查:Polaris 将这个缓存服务器排队,稍后再次检查和刷新缓存,确保缓存中的数据更新为20件。
  • 在写入时检查:现在,假设有另一个用户在短时间内再次购买商品:库存从20件减少到19件。在这个写入操作发生时,Polaris 会再次检查缓存中的数据,确保缓存中的数据是最新的19。如果发现缓存中的数据不正确(例如,缓存中显示的是20件,而实际库存已经变为19件),Polaris 会立即更新缓存,确保缓存和数据库中的数据保持一致。

此外,分布式缓存与 Polaris 之间存在网络分区的风险。因此他们在客户端与 Polaris 之间使用单独的失效事件流。这个流专门用于传递缓存失效事件,即使在网络分区的情况下,也能确保失效事件被传递到位。

解决缓存不一致的一个简单方法是查询数据库。但大规模下数据库存在过载风险。因此 Polaris 以 1、5 或 10 分钟为时间间隔查询数据库。通过这种方式,Polaris 可以在确保数据一致性的同时,避免频繁查询数据库导致的过载问题。

2. 追踪

在没有日志的情况下调试分布式缓存中的问题非常困难。为了找到缓存不一致的原因,记录每个数据更改虽然是一个办法,但因为写入操作过于频繁,导致这种方法不可扩展。因此,他们创建了一个跟踪库并将其嵌入到每个缓存服务器上。
在这里插入图片描述

其工作原理如下:

  • 跟踪库仅记录在竞争条件时间窗口内发生的数据变化,从而减少了日志存储的需求。竞争条件时间窗口是指在发生数据竞争的时间段。例如,当多个操作同时尝试访问和修改同一数据时,会产生竞争条件。
  • 跟踪库会保存最近修改的数据的索引,以便在发生新的数据更改时,判断是否需要记录。如果新数据变更涉及到最近修改的数据,才会进行记录。这种方式减少了不必要的日志记录,
  • 如果Polaris发现缓存不一致,它会读取这些日志来查找问题的根源,然后发送通知。这样可以快速定位和解决问题。

缓存失效是计算机科学中的难题之一,现在 Meta 支持 10 个 9 的缓存一致性 - 99.99999999%。简而言之,100 亿次缓存写入中,只有 1 次会出现不一致的情况。这种技术可以与任何规模的缓存服务器一起使用。

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

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

相关文章

SpringBoot 整合 Redis 实现验证码登录功能

一、整合Redis 在pom.xml中添加Redis相关依赖&#xff1b; <!--Spring Data Redis依赖配置--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>…

阿里云账户注册与实名认证详细教程

在开始使用阿里云服务之前&#xff0c;您需要先有一个阿里云账号&#xff0c;拥有阿里云账号后&#xff0c;您可以选购和使用云产品和服务。如果您没有阿里云账号&#xff0c;需要先注册一个阿里云账号。 说明 一个手机号码下最多可以注册6个阿里云账号。如果您的手机号码已经…

一分钟了解VMware虚拟机三种网络模式区别

VMware虚拟机提供了三种主要的网络模式&#xff0c;分别是桥接模式&#xff08;Bridged Mode&#xff09;、网络地址转换模式&#xff08;NAT Mode&#xff09;和仅主机模式&#xff08;Host-Only Mode&#xff09;。这三种模式各有其特点和适用场景&#xff0c;以下是对它们之…

Perfectly Clear WorkBench中文绿色版,让每一张照片都完美无瑕

软件简介 你是否曾经为了一张不完美的照片而感到遗憾&#xff1f;是否曾经因为照片中的小瑕疵而不得不花费大量时间进行后期处理&#xff1f;现在&#xff0c;有了Perfectly Clear WorkBench&#xff0c;这些问题都将迎刃而解。作为全球领先的智能图像校正技术商推出的图像清晰…

jvm实战

一、查看JVM内存使用状况 jps 查看本地正在运行的java进程和进程ID(pid) win10报jps不是内部或外部命令,也不是可运行的程序或批处理文件解决?将用户变量和系统变量的Path都追加2个bin。 jinfo jinfo pid 查看指定pid的所有JVM信息jinfo -flags pid 查询虚拟机运行参数…

【Go - mongodb - bson / schema】

Bson是什么 bson 是 MongoDB 使用的一种二进制编码格式&#xff0c;全称为 Binary JSON。它用于存储和传输 JSON 风格的文档数据。bson 提供了一种高效的方式来表示 JSON 数据&#xff0c;同时支持更多的数据类型&#xff0c;例如日期和二进制数据。 在 Go 语言中&#xff0c…

低代码开发平台:加速企业数字化转型的利器

前言 在软件开发领域&#xff0c;传统的编码方式往往复杂且耗时&#xff0c;对技术团队的技能要求高。随着企业数字化转型的加速&#xff0c;低代码开发平台作为一种新兴的解决方案&#xff0c;逐渐成为许多组织提升开发效率、降低技术门槛的利器。本文将深入探讨低代码开发的…

【Drools】(三)基于业务数据动态调用 DRL 规则文件:详细实现与测试指南

基于业务数据动态调用 DRL 规则文件&#xff1a;详解与实战 在业务规则管理中&#xff0c;DRL 文件&#xff08;Drools Rule Language 文件&#xff09;用于定义和执行业务规则。通过动态调用 DRL 文件&#xff0c;我们可以根据不同的业务场景灵活配置和执行定制化的规则&…

【中项】系统集成项目管理工程师-第8章 信息安全工程-8.3工程体系架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

MongoDB 基础知识

一、为什么学习MongoDB MongoDB解决Mysql 的“三高”问题&#xff1a; 1.对数据库高并发写入需求 2.对海量数据高效率存储访问需求 3.对数据库高扩展和高可用的需求 MongoDB 实际应用&#xff1a; 1.社交场景&#xff0c;比如朋友圈&#xff0c;附近的人的地点的存储 2.…

Python for循环迭代原理(迭代器 Iterator)

在使用Python时&#xff0c;我们经常会使用for循环来访问容器对象&#xff08;列表、字符、字典等&#xff09;中的元素。其幕后实际是通过迭代协议来完成的&#xff0c;迭代是一种依次访问对象中元素的方式&#xff0c;for循环在对象上调用iter()函数生成一个迭代器&#xff0…

wc -l 统计文件中的行数

wc -l 是一个常用的命令行工具&#xff0c;用于统计文件中的行数。它的使用格式是&#xff1a; wc -l [文件名] 主要用途是计算指定文件中的行数。例如&#xff0c;如果有一个名为 example.txt 的文件&#xff0c;要查看它有多少行&#xff0c;可以运行&#xff1a; wc -l exam…

16 html网页服务和nginx服务

第十六次7.29 1.静态页面 1安装httpd [rootweb ~]# yum -y install httpd 2.真机访问页面 [rootweb html]# echo "静态html文件" > index.html 传入照片再次访问 静态资源&#xff0c;根据开发着保存在项目资源目录中的路径访问静态页面的资源 2.Apache 1.安…

【Docker】Namespace 空间隔离实战

一、实战目的 了解隔离能力并不是 Docker 提供的&#xff0c;而是操作系统内核提供基本能力。 二、基础知识 1、dd 命令详解 Linux dd 命令用于读取、转换并输出数据。 dd 可从标准输入或文件中读取数据&#xff0c;根据指定的格式来转换数据&#xff0c;再输出到文件、…

淘宝商家电话采集 淘宝店铺爬虫软件使用教程

淘宝商家电话采集&#xff1a;淘宝店铺爬虫软件使用教程 淘宝作为中国最大的电子商务平台之一&#xff0c;拥有众多的商家和店铺。有时候我们需要获取特定店铺的联系电话&#xff0c;以便进行合作洽谈或者其他目的。本文将介绍如何使用Python编写一个淘宝店铺爬虫软件来采集商…

有效组织离散变量:指针数组在C语言中的应用

把离散变量组织起来&#xff0c;访问起来更加方便&#xff0c;无需一个个变量单独赋值。 如modbus读写reg&#xff0c; 把a\b\c\d实时变化分散的变量组织成一个数组reg&#xff0c;方便获取 相当于变量的内存地址池 int main() {int a 10, b 20, c 30, d 40;int i;int *re…

Vue3----扩展 element Plug card

扩展 element Plug card 增加全屏&#xff0c;折叠操作项 核心代码 <template><div class"cc-card-component"><el-card v-if"state.isShow" :class"state.class" :bodyStyle"bodyStyle" :shadow"props.shadow…

英语:四、冠词

1、冠词的概述 &#xff08;1&#xff09;冠词的分类 根据冠词的用法&#xff0c;它可以分为定冠词、不定冠词和零冠词。 定冠词 the 不定冠词 a an 零冠词 名词前面没有冠词 &#xff08;2&#xff09;冠词的位置 a、放在名词之前 一般情况下&#xff0c;冠词置于…

Vmwar保姆级安装与配置

文章目录 一、官方下载1.访问VMware官方网站&#xff1a;2.选择产品&#xff1a;3.下载安装包&#xff1a; 二、VMware的安装1.运行安装程序2.选择安装位置3.选择安装选项4.完成安装 三、启动VMware Workstation Pro并配置虚拟机1.创建新的虚拟机&#xff1a;2.配置虚拟机硬件 …

中间件 - 使用Eureka进行微服务注册与发现

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 在微服务架构中…