Apache Cassandra 在 Facebook 的应用
谁说 Facebook 弃用 Cassandra?相反 Facebook 拥有全世界最大的单个 Cassandra 集群部署,而且他们对 Cassandra 做了很多性能优化,包括 Cassandra on RocksDB 以提升 Cassandra 的响应时间。
在 Instagram (Instagram是Facebook公司旗下一款免费提供在线图片及视频分享的社交应用软件,于2010年10月发布。)上,我们拥有世界上最大的 Apache Cassandra 数据库部署。我们在 2012 年开始使用 Cassandra 取代 Redis ,在生产环境中支撑欺诈检测,Feed 和 Direct inbox 等产品。起初我们在 AWS 环境中运行了 Cassandra 集群,但是当 Instagram 架构发生变化时,我们将 Cassandra 集群迁移到Facebook 的基础架构中。我们对 Cassandra 的可靠性和可用性有了非常好的体验,但是在读取数据延迟方面我们觉得他需要改进。
去年 Instagram 的 Cassandra 团队开始着手这个项目,以显着减少 Cassandra 的读取延迟,我们称之为 Rocksandra。 在这篇文章中,我将描述该项目的动机,我们克服的挑战以及内部和公共云环境中的性能指标。
动机
在 Instagram 上,我们大量使用 Apache Cassandra 作为通用键值存储服务。Instagram 的大多数 Cassandra 请求都是在线的,因此为了向数亿 Instagram 用户提供可靠且响应迅速的用户体验,我们有很高的 SLA 要求。
Instagram 可靠性 SLA 保持为5-9s,这意味着在任何给定时间,请求失败率应小于0.001%。为了提高性能,我们主动监控不同 Cassandra 集群的吞吐量和延迟,尤其是 P99 读取延迟。
下面的图显示了一个生产 Cassandra 集群的客户端延迟。蓝线是平均读取延迟(5ms),橙色线是 P99 读取延迟(在25ms到60ms的范围内)。
经过调查,我们发现 JVM 垃圾收集器(GC)对延迟峰值做出了很大贡献。我们定义了一个称为 GC 停滞百分比的度量,用于衡量Cassandra 服务器执行 GC(Young Gen GC)并且无法响应客户端请求的时间百分比。结果显示我们生产 Cassandra 服务器上的 GC 停滞百分比。在最低请求流量时间窗口期间为1.25%,在高峰时段可能高达2.5%。
这表明 Cassandra 服务器实例在垃圾收集上花费 2.5% 的运行时间,而这段时间是不能服务客户端请求的。GC 开销显然对我们的 P99 延迟有很大影响,因此如果我们可以降低 GC 停顿百分比,我们将能够显着降低P99延迟。
解决办法
Apache Cassandra 是一个分布式数据库,并用 Java 编写了基于 LSM 树的存储引擎。 我们发现存储引擎中的组件,如memtable,压缩,读/写路径等,在 Java 堆中创建了很多对象,并为 JVM 产生了大量开销。为了减少来自存储引擎的GC影响,我们考虑了不同的方法,并最终决定开发C++存储引擎来替换现有的引擎。
我们不想从头开始构建新的存储引擎,因此我们决定在 RocksDB 之上构建新的存储引擎。
RocksDB 是一个开源的,高性能嵌入式键值数据库。它是用 C++ 编写的,并为 C++,C 和 Java 提供官方 API。RocksDB 针对性能进行了优化,尤其是在 SSD 等快速存储方面。它在业界广泛用作 MySQL,mongoDB 和其他流行数据库的存储引擎。
挑战
在 RocksDB 上实现新的存储引擎时,我们克服了三个主要挑战:
第一个挑战是 Cassandra 还没有可插拔的存储引擎架构,这意味着现有的存储引擎与数据库中的其他组件耦合在一起。为了在大规模重构和快速迭代之间找到平衡点,我们定义了一个新的存储引擎 API,包括最常见的读/写和流接口。这样我们就可以在 API 后面实现新的存储引擎,并将其注入 Cassandra 内部的相关代码路径。
其次,Cassandra 支持丰富的数据类型和表模式,而 RocksDB 提供纯粹的键值接口。我们仔细定义了编码/解码算法,使得我们使用 RocksDB 数据结构来构建 Cassandra 数据模型,并支持与原始 Cassandra 相同的查询语义。
第三个挑战是关于 streaming。 Streaming 在 Cassandra 这样的分布式数据库是很重要组件。每当我们从 Cassandra 集群加入或删除节点时,Cassandra 都需要在不同节点之间传输数据以平衡集群中的负载。现有的 streaming 实现基于当前存储引擎的。因此,我们必须将它们彼此分离,创建一个抽象层,并使用 RocksDB API 重新实现 streaming 传输。对于高 streaming 吞吐量,我们现在首先将数据流式传输到临时 sst 文件,然后使用 RocksDB 提取文件 API 立即将它们批量加载到 RocksDB 实例中。
性能指标
经过大约一年的开发和测试,我们已经完成了第一个版本的实现,并成功将其推广到 Instagram 中的几个生产 Cassandra 集群。在我们的一个生产集群中,P99读取延迟从60ms降至20ms。 我们还观察到该集群上的GC停滞从2.5%下降到0.3%,这减少了10倍!
我们还想验证 Rocksandra 在公共云环境中是否表现良好。我们在 AWS 环境中使用三个 i3.8 xlarge EC2 实例部署了一个 Cassandra 集群,每个实例具有 32 个核,244GB内存和 带有4个nvme闪存盘的raid0。
我们使用 NDBench 作为基准测试,并使用这个框架中的默认表模式:
TABLE emp (emp_uname text PRIMARY KEY,
emp_dept text,
emp_first text,
emp_last text)
我们将 250M 6KB 行数据预先加载到数据库中(每个服务器在磁盘上存储大约500GB的数据)。我们在 NDBench 中配置了128个读客户端和128个写客户端。
我们测试了不同的工作负载并测量了 avg/P99/P999 读/写延迟。如我们所见,Rocksandra 提供了更低且一致的读/写延迟。
我们还测试了一个只读工作负载并观察到,在类似的P99读取延迟(2ms)下,Rocksandra 读取吞吐量提高了10倍(Rocksandra为300K/s,C * 3.0为 30K/s)。
未来工作
我们开源了 Rocksandra 代码库和基准框架,您可以从Github下载(https://github.com/Instagram/cassandra/tree/rocks_3.0),在您自己的环境中试用!
下一步,我们正在积极开发更多 C 功能,如二级索引,修复等。我们还在开发一个 C 可插拔存储引擎架构,以便将我们的工作贡献给Apache Cassandra 社区。
原文链接
本文为云栖社区原创内容,未经允许不得转载。
Apache Cassandra 在 Facebook 的应用相关推荐
- Apache Cassandra 1.1.0 稳定版发布
Apache Cassandra团队今天正式推出了1.1分支的首个稳定版1.1.0版本. Apache Cassandra是一套开源的分布式 NoSQL 数据库系统,遵循 Apache Lience ...
- Apache Cassandra简介
Apache Cassandra 是一个开源的.分布式.无中心.弹性可扩展.高可用.容错.一致性可调.面向行的数据库,它基于 Amazon Dynamo 的分布式设计和 Google Bigtable ...
- 使用Apache Cassandra设置SpringData项目
在这篇文章中,我们将使用Gradle和spring boot来创建一个集成spring-mvc和Apache Cassandra数据库的项目. 首先,我们将从Gradle配置开始 group 'com ...
- 使用Apache Cassandra设置一个SpringData项目
在这篇文章中,我们将使用Gradle和spring boot来创建一个将spring-mvc和Apache Cassandra数据库集成在一起的项目. 首先,我们将从Gradle配置开始 group ...
- Apache Cassandra和低延迟应用程序
介绍 多年来, Grid Dynamics拥有许多与NoSQL相关的项目,尤其是Apache Cassandra. 在这篇文章中,我们要讨论一个给我们带来挑战的项目,而我们在该项目中试图回答的问题今天 ...
- Apache Cassandra和Java入门(第一部分)
在此页面上,您将学到足够的知识来开始使用NoSQL Apache Cassandra和Java,包括如何安装,尝试一些基本命令以及下一步做什么. 要求 要遵循本教程,您应该已经有一个正在运行的Cass ...
- Apache Cassandra和Java入门(第二部分)
要求 要遵循本教程,您应该已经有一个正在运行的Cassandra实例( 一个小型集群会很好 ,但不是必需的),已安装Datastax Java驱动程序( 请参阅第I部分 ),并且已经在这里进行了10分 ...
- Apache Cassandra 数据存储模型
我们在<Apache Cassandra 简介>文章中介绍了 Cassandra 的数据模型类似于 Google 的 Bigtable,对应的开源实现为 Apache HBase,而且我们 ...
- Apache Cassandra和Apache Ignite:分布式数据库的明智之选
为什么80%的码农都做不了架构师?>>> Apache Cassandra应用广泛,是一个开源的.分布式的.键值存储列模式NoSQL数据库,支撑了很多大公司的关键业务,比如Ne ...
最新文章
- Word文档如何自动生成文献摘要?
- flink搭建集群(一主三从)
- LeetCode44 Wildcard Matching
- 优秀!复旦直博生一作发15篇SCI,并担任12本SCI期刊审稿人
- 感谢相信你鼓励你的人
- Logistic 梯度法进行分类
- VGGNet原理和实现
- Python3编写网络爬虫10-数据存储方式三-CSV文件存储
- JS 中 Date() 的其他操作集锦
- wordpress迁移以及遇到的一些问题[mysql备份导入导出][固定链接404]
- 音视频和图像相关知识点总结
- 易鲸捷数据库(EsgynDB)常用SQL
- Echar柱状堆叠图X轴自定义显示功能
- 健身房私教预约小程序 毕业设计毕业论文 开题报告和效果图参考(基于微信小程序毕业设计题目选题课题)
- [爬虫笔记02] Scrapy爬取阳光问政平台
- HHL论文及代码理解(Generalizing A Person Retrieval Model Hetero- and Homogeneously ECCV 2018)...
- java短信验证码功能发送的验证码如何校验_java实现发送短信验证码
- JSP页面如何通过Form传递参数到另一个JSP页面
- 看完《指环王》说几句
- php 无限子站cms,PHP整理CMS无限层级目录(毗邻目录模式)
热门文章
- winform checkbox要点击两次_这个Winform的UI库也太全了!四十多个控件都在这一个项目里了...
- win10看计算机属性,win10系统查看windows7版本号要比计算机属性具体的图文步骤
- 20天掌握C语言,C语言零基础到项目实战,玩转C语言
- python继承super函数_Python中的super函数如何实现继承?
- 实用卷积神经网络 运用python pdf_解析卷积神经网络—深度学习实践手册 中文pdf高清版...
- vscode中如何创新建php文件,vscode如何创建代码模板
- el-drawer点击的时候为什么有边框_剪映教学之视频拍摄加剪辑【一】:出视频上下黑色边框模糊效果,视频广告配音...
- grasp设计模式应用场景_grasp设计模式笔记回顾
- opencv4.5.0安装包_UG NX12.0 软件介绍(附安装包)
- react滑动切换tab动画效果_使用React实现的水平标签(Tab)栏