b1gc8v 发表于 2024-9-27 10:01:32

每日上百万次调用的巨量拜访系统缓存数据丢失?看eBay的三种处理办法


    <div style="color: black; text-align: left; margin-bottom: 10px;">
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">eBay 的员工 Venkatesh Ramaswamy 于 2017 年 1 月<span style="color: black;">发布</span>了一篇<span style="color: black;">文案</span>,<span style="color: black;">文案</span><span style="color: black;">发布</span>在 eBay 技术博客上,<span style="color: black;">文案</span><span style="color: black;">重点</span>讲了针对购物车缓存数据丢失<span style="color: black;">状况</span>,eBay 思考的三种<span style="color: black;">处理</span><span style="color: black;">方法</span>,以及<span style="color: black;">最后</span>采用的<span style="color: black;">处理</span><span style="color: black;">方法</span>。背景</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">eBay 的购物车信息存储依赖于两个<span style="color: black;">区别</span>的数据存储介质,MongoDB 存储用户完整的购物车信息,Oracle 仅存储购物车的大致信息,<span style="color: black;">然则</span><span style="color: black;">能够</span><span style="color: black;">经过</span>关键信息<span style="color: black;">查询</span>所有的购物车信息。在 eBay 的这套系统里,MongoDB <span style="color: black;">更加多</span>被用来充当“缓存”,Oracle 数据库<span style="color: black;">做为</span>存储副本。<span style="color: black;">倘若</span>数据在 MongoDB 里面找不到了,服务会从 Oracle 里面重新抽取(恢复)数据,<span style="color: black;">而后</span>重新计算用户的购物车。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">所有的购物车数据都是 JSON 格式的,JSON 数据在 Oracle 里被存储在 BLOB 格式的字段里。这些 Oracle 里面的数据只能被用于 OLTP 交易。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://p26-sign.toutiaoimg.com/2ee5000423e27ba7ba8c~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1727342943&amp;x-signature=FYGNE4meJcqnviuv4t9GMsoCsEw%3D" style="width: 50%; margin-bottom: 20px;"></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">这篇<span style="color: black;">文案</span>并不是讨论数据库技术的<span style="color: black;">选取</span>(Oracle vs MongoDB,<span style="color: black;">或</span>其他数据),而是<span style="color: black;">期盼</span>能够让<span style="color: black;">大众</span>在巨量<span style="color: black;">拜访</span>系统(<span style="color: black;">每日</span>上百万次调用)中找到技术债,理解<span style="color: black;">怎样</span><span style="color: black;">处理</span>问题。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">问题描述</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">2016 年秋天<span style="color: black;">起始</span>,购物车服务<span style="color: black;">显现</span>了缓存层丢失数据的<span style="color: black;">状况</span>,<span style="color: black;">同期</span>,运维团队报告 MongoDB 的备份机制多次<span style="color: black;">显现</span>失败(MongoDB 运行在主从模式)。eBay 的这个服务<span style="color: black;">已然</span>运行了 5 年时间,<span style="color: black;">始终</span><span style="color: black;">无</span><span style="color: black;">显现</span>问题,<span style="color: black;">无</span>做过任何架构<span style="color: black;">调节</span>和大规模代码改变,需要尽快找到<span style="color: black;">原由</span>和防治办法。针对<span style="color: black;">实质</span>问题进行反复<span style="color: black;">检测</span>,<span style="color: black;">发掘</span> MongoDB 的 oplog(实时性<span style="color: black;">需求</span>极高的写日志记录)正在达到网络 I/O 限制。每一次的数据丢失,都会触发<span style="color: black;">守护</span><span style="color: black;">办法</span>(再次从 Oracle 读取数据后重复计算),并进一步加长用户的等待时间。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">处理</span><span style="color: black;">方法</span></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在<span style="color: black;">咱们</span>具体讨论特定的<span style="color: black;">处理</span><span style="color: black;">方法</span>前,<span style="color: black;">咱们</span><span style="color: black;">期盼</span>去尽可能多地讨论<span style="color: black;">处理</span><span style="color: black;">方法</span>。例如,一旦备份机制<span style="color: black;">无</span>启用,<span style="color: black;">是不是</span><span style="color: black;">能够</span><span style="color: black;">经过</span><span style="color: black;">隐匿</span><span style="color: black;">有些</span>副本方式让系统能够正常运行,而不要在系统<span style="color: black;">尤其</span>繁忙的时候去尝试重新备份。<span style="color: black;">咱们</span><span style="color: black;">能够</span>尝试超<span style="color: black;">机会</span>制和<span style="color: black;">周期</span>性副本方式,<span style="color: black;">然则</span>这些方式并不会<span style="color: black;">导致</span><span style="color: black;">咱们</span>本文说的问题<span style="color: black;">出现</span>。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"> <span style="color: black;">方法</span>一:切片(MongoDB)</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">团队成员提出对 JSON 数据进行切分,即对原先存储在 MongoDB 里的原子化的购物车信息(一个 JSON 字符串),切分为多个字符串,<span style="color: black;">这般</span>做的好处是<span style="color: black;">能够</span>减少单一 MongoDB 中心节点的写入次数和网络开销。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">针对</span>数据切分后的<span style="color: black;">相关</span>方式,远比数据切分、负载<span style="color: black;">平衡</span><span style="color: black;">繁杂</span>,<span style="color: black;">因此呢</span>,第 1 种<span style="color: black;">方法</span>的<span style="color: black;">选取</span>会引入其他技术难点,需要<span style="color: black;">咱们</span>自己能够寻找被切分后的数据的<span style="color: black;">相关</span>性,这<span style="color: black;">便是</span><span style="color: black;">为何</span> eBay 放弃了这个<span style="color: black;">方法</span>。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"> <span style="color: black;">方法</span>二:有<span style="color: black;">选取</span>的写入</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">运用</span> MongoDB 的 set 命令,只针对当特定值<span style="color: black;">出现</span>更改后,才<span style="color: black;">起步</span>写入操作。这种方式理论上<span style="color: black;">亦</span>是可行的。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">然则</span><span style="color: black;">倘若</span>你真正<span style="color: black;">思虑</span>一下,这种做法<span style="color: black;">无</span>从<span style="color: black;">基本</span>上<span style="color: black;">保证</span>减少 oplogs 写入次数,<span style="color: black;">然则</span>它很有可能会<span style="color: black;">导致</span><span style="color: black;">全部</span>文档的更新。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">认识</span>一下 MongoDB 的 Set 操作模式。Set 操作<span style="color: black;">能够</span>用于<span style="color: black;">运用</span>特定值替换字段值:</p>{$Set{:,…}}<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">假如你<span style="color: black;">思虑</span>一下描述<span style="color: black;">制品</span>的文档如下所示:</p>{<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">针对</span>满足 _id 等于 100 的文档,执行 set 操作更新 quantity 字段、details 字段和 tags 字段的值。</p>db.products.update( {_id:100}, {$set:<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">以上这个操作替换 quantity 的值为 500,details 字段的值为一个新的嵌入式文档,tags 值为一个数组。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"> <span style="color: black;">方法</span>三:压缩传输数据</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">思虑</span>到需要尽快<span style="color: black;">处理</span>问题,<span style="color: black;">因此</span>需要<span style="color: black;">尽可能</span>避免重写业务<span style="color: black;">规律</span>,压缩方式看起来是比较好的一中了。减少进入 MongoDB 的 Master 节点的数据量,<span style="color: black;">这般</span><span style="color: black;">能够</span>减少写入 oplog 的数据规模。<span style="color: black;">然则</span>,这种方式会将 JSON 字符串转变为二进制<span style="color: black;">文案</span>,操作时<span style="color: black;">亦</span>需要解压缩。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">常用的压缩算法<span style="color: black;">重点</span>有:deflate、gzip、bzip2、lzo、snappy 等。差别如下所示:</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">deflate、gzip 都是基于 LZ77 算法与哈夫曼编码的无损数据压缩算法,gzip 只是在 deflate 格式上<span style="color: black;">增多</span>了文件头和文件尾;</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">bzip2 是 Julian Seward <span style="color: black;">研发</span>并<span style="color: black;">根据</span>自由软件 / 开源软件协议发布的数据压缩算法,Apache 的 Commons-compress 库中进行了实现;</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">LZO 致力于解压速度,并且该算法<span style="color: black;">亦</span>是无损算法;</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">LZ4 是一种无损数据压缩算法,着重于压缩和解压缩速度;</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Snappy 是 Google 基于 LZ77 的思路用 C++ 语言编写的快速数据压缩与解压程序库,2011 年开源。它的<span style="color: black;">目的</span>并非最大程度地压缩,而是针对最快速度和<span style="color: black;">恰当</span>的压缩率。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;"><span style="color: black;">目的</span>和<span style="color: black;">思虑</span></strong></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在<span style="color: black;">咱们</span><span style="color: black;">起始</span>做这一功能性测试之前,<span style="color: black;">咱们</span>需要<span style="color: black;">知道</span>几个<span style="color: black;">目的</span>。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">准许</span>购物车被压缩并持久化到 MongoDB(数据不会有改变)。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">准许</span>压缩编码方式的<span style="color: black;">选取</span>,支持采用一种编码方式读取,另一种编码方式写入。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">准许</span>读到老的、新的、中间状态的购物车信息,新老前后<span style="color: black;">能够</span>互相兼容。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">压缩和解压缩的操作<span style="color: black;">能够</span><span style="color: black;">同期</span>进行。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">保证</span><span style="color: black;">无</span>针对 MongoDB 数据库的实时 JSON 数据检索<span style="color: black;">查找</span>请求。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">JSON 字符串例子</strong></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">这是老的 JSON 字符串:</p>{ "_id" : ObjectId("560ae017a054fc715524e27a"), "user" : "9999999999",<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">这是压缩之后的 JSON 字符串:</p>{ "_id" : ObjectId("560ae017a054fc715524e27a"), "user" : "9999999999",<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">测试结果</strong></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">经过</span><span style="color: black;">运用</span>相同的购物车数据进行测试,观察 CPU <span style="color: black;">或</span> I/O <span style="color: black;">状况</span>,数据如图所示:</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://p3-sign.toutiaoimg.com/2ee5000423e4c128a325~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1727342943&amp;x-signature=DgQ54gc35%2BLcTsDzAB7x1AJQ0Uk%3D" style="width: 50%; margin-bottom: 20px;"></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://p3-sign.toutiaoimg.com/31b800012b0183b58fef~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1727342943&amp;x-signature=Nui1lFPkZgsOKTn9MnD0zs3oFM8%3D" style="width: 50%; margin-bottom: 20px;"></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">结论</strong></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">oplog 的写入速率,从 150GB/ 小时下降为大约 11GB/ 小时,下降了 1300%!文档的平均对象<span style="color: black;">体积</span>从 32KB 下降为 5KB,600% 的下降。<span style="color: black;">另外</span>,服务的响应时间<span style="color: black;">亦</span>有所改善。数据如图所示:</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://p3-sign.toutiaoimg.com/2ee5000423e3ae643805~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1727342943&amp;x-signature=zXgzaNFbusXN0Etx7jnVkUnlyRk%3D" style="width: 50%; margin-bottom: 20px;"></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">下面这张图<span style="color: black;">表示</span>的是 MongoDB 的 Ops Manager UI 工具信息,<span style="color: black;">尤其</span>标注了压缩和解压缩数据的耗时,以及文档的平均对象<span style="color: black;">体积</span>的下降数据。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://p3-sign.toutiaoimg.com/2ee600041da1bc3b8af8~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1727342943&amp;x-signature=Ykm%2Fq9JbjTb5azzitHA0B%2BAS3gI%3D" style="width: 50%; margin-bottom: 20px;"></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">最后</span>,<span style="color: black;">针对</span>生产环境下的随机一小时数据压缩,eBay 团队<span style="color: black;">亦</span>收集了<span style="color: black;">有些</span>指标图,用于<span style="color: black;">更加多</span>的深入观察。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://p3-sign.toutiaoimg.com/31bc00007d76df5eb7ad~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1727342943&amp;x-signature=W9H8xyhjcvUFlaUSAbX2uSYw4OU%3D" style="width: 50%; margin-bottom: 20px;"></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://p3-sign.toutiaoimg.com/2ee00001395caa004d9c~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1727342943&amp;x-signature=3oWzYeLW6oi%2FHmOfxsPqb%2Bfh4Jc%3D" style="width: 50%; margin-bottom: 20px;"></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://p3-sign.toutiaoimg.com/2ee600041da2571c61ec~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1727342943&amp;x-signature=ZHMnOsfS590AU2hGB0qwaIBsSv4%3D" style="width: 50%; margin-bottom: 20px;"></p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">End.</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">源自</span>:公众号“大数据杂谈”</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">运行人员:中国统计网<span style="color: black;">博主</span>(<span style="color: black;">微X</span>号:itongjilove)</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">博客</span>ID:中国统计网</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">中国统计网,是国内最早的大数据学习网站,公众号:中国统计网</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">http://www.itongji.cn</p>
    </div>




1fy07h 发表于 2024-10-4 03:06:29

说得好啊!我在外链论坛打滚这么多年,所谓阅人无数,就算没有见过猪走路,也总明白猪肉是啥味道的。

7wu1wm0 发表于 2024-10-23 14:38:43

“BS”(鄙视的缩写)‌
页: [1]
查看完整版本: 每日上百万次调用的巨量拜访系统缓存数据丢失?看eBay的三种处理办法