Facebook 的 Scaling Out 经验

文章介绍了Facebook如何解决跨地域MySQL复制带来的缓存一致性问题。通过调整写操作流程,确保数据更新后首次读取能从数据库获取最新数据并同步缓存,有效避免了因网络延迟造成的业务冲突。
 原贴:

Facebook 的 Scaling Out 经验

Facebook 其实对待技术的态度其实挺开放的。今天阅读了这篇 Scale Out, 工程师 Jason Sobel 介绍了在对付跨地域 MySQL 复制网络延迟的问题。

Cache 一致性问题解决思路

大量的 MySQL + Memcached 服务器,布署简示:

California (主 Write/Read)............. Virginia (Read Only)

主数据中心在 California ,远程中心在 Virginia 。这两个中心网络延迟就有 70ms,MySQL 数据复制延迟有的时候会达到 20ms. 如果要让只读的信息从 Virginia 端发起,Memcached 的 Cache 数据一致性就是个问题。

    
  • 1 用户发起更新操作,更名 "Jason" 到 "Monkey" ;
  • 2 主数据库写入 "Monkey",删除主、从两端 Memcached 中的名字值;
  • 3 在 Virginia 有人查看该用户 Profile ;
  • 4 在 Memcached 中没发现用户名字,从 Virginia Slave 数据库读取,因为网络延迟,结果读到了 "Jason";
  • 5 更新 Virginia Memcached 中的该用户名字为 "Jason";
  • 6 复制追上了,更新名字为 ""Monkey";
  • 7 又有人读取 Profile 了;
  • 8 在 Memcached 中找到了键值,返回 "Jason" (实际上造成业务冲突了)

解决办法挺有意思,在 SQL 解析层嵌入了针对 Memcached 的操作。

    
  • 1 用户发起更新操作,更名 "Jason" 到 "Monkey" ;
  • 2 主数据库写入 "Monkey",删除主端 Memcached 中的名字值,但Virginia 端 Memcached 不删;(这地方在 SQL 解析上作了一点手脚,把更新的操作"示意"给远程);
  • 3 在 Virginia 有人查看该用户 Profile ;
  • 4 在 Memcached 中找到键值,返回值 "Jason";
  • 5 复制追上更新 Slave 数据库用户名字为 "Monkey",删除 Virginia Memcached 中的键值;
  • 6 在 Virginia 有人查看该用户 Profile ;
  • 7 Memcache 中没找到键值,所以从 Slave 中读取,然后得到正确的 "Monkey" 。

这里面的一个简单的原则是: 更新后的数据,用户第一次读取要从数据库读,顺便扔一份到 Cache 里,而不是在写入的时候直接更新 Memcached 。避免写事务过大。

而写操作的原则是:一次写入,到处分发

第二个问题是关于"Page Routing"的 ,也很有参考价值。感兴趣的自己读一下吧。

--EOF--

另推荐一下: 分布式系统中的一致性和可用性,该文是上次在支付宝 QClub 活动的总结之二。

| | TrackBacks (0) | | Edit

Generator | Trampoline | 外贸英才网 | Vinyl fence

自定义搜索

本文相关评论|Comments(2)

pi1ot 的评论:

就是各地的slave db负责更新本地cache,大部分应用都应该是这么干的吧

galaxystar 的评论:

设计时需要注意的

添加评论

直接 匿名评论 或者 登录 评论这篇文章(OpenID、TypeKey...)

### 扩展分布外检测方法以适应现实世界应用 当前的检测系统通常通过重用分类器来进行目标检测,在不同位置和尺度下评估测试图像中的对象[^1]。然而,对于真实世界的复杂性和多样性而言,仅依赖于已知类别的分类器可能不足以应对未见过的数据或异常情况。 #### 增强模型鲁棒性的策略 为了使分布外(Out-of-Distribution, OOD)检测更适用于实际应用场景,可以采取以下几种方式: - **数据增强**:增加训练集样本量的同时引入更多变化形式,比如旋转、翻转等操作,使得模型能够更好地泛化到未知环境中去。 - **混合精度训练**:采用低精度浮点数表示法减少计算资源消耗并加速推理过程;同时保持某些层高精度运算以维持性能水平不变。 - **自监督学习框架下的预训练**:利用大规模无标签数据集进行预训练,再针对特定任务微调参数,从而提高对新类别识别的能力。 - **多模态融合技术的应用**:结合视觉特征与其他感知渠道的信息输入(如音频信号),构建更加全面的理解体系,有助于捕捉那些单一感官难以察觉的变化模式。 #### 实现方案实例 下面给出一段Python伪代码展示了一个简单的基于深度神经网络架构实现OOD检测的方法: ```python import torch.nn as nn class OutOfDistributionDetector(nn.Module): def __init__(self, base_model): super(OutOfDistributionDetector, self).__init__() self.base_model = base_model # 已经训练好的基础模型 # 添加额外模块用于处理不确定度估计或其他特性提取 self.additional_layers = nn.Sequential( nn.Linear(in_features=base_model.output_size(), out_features=256), nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(in_features=256, out_features=1) ) def forward(self, x): features = self.base_model(x) # 获取原始特征向量 ood_score = self.additional_layers(features).sigmoid() # 计算OOD得分 return ood_score ``` 此代码片段定义了一种新的网络结构,该结构在已有基础上增加了几层全连接层来预测给定输入属于分布内还是分布外的概率值。这可以帮助区分正常样本与潜在异常案例之间的差异。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值