RocksDB:高性能和可扩展性的 NoSQL 数据库
已发表: 2022-11-19RocksDB 是一种流行的 NoSQL 数据库,由于其高性能和可扩展性而被许多公司使用。 它是一个由 Facebook 发起的开源项目,现在由开发者社区维护。 RocksDB 使用日志结构化合并树 (LSM) 数据结构,使其能够高效地处理写入繁重的工作负载。
在使用 couchbase 四年多之后,我们迁移到了 MongoDB,并对结果感到满意。 Couchbase 的体验非常糟糕,尽管我们获得了企业支持并在该平台上列出。 要使其正常工作,您总共至少需要六台服务器。 对于生产,只需要构建六台服务器。 内存中的缓存由 Couchbase 实例上较小的 Memcached 实例处理。 该程序占用 8GB RAM,可提供 5000 个文档。 事实并非如此。 我们的 Couchbase 实例上只有不到 5000 个文档和不到 20 个索引,并且实例的内存消耗始终超过 8 GB。
嵌入式数据库 RocksDB 在键值数据方面的表现令人钦佩。 这是 Google LevelDB 的一个分支,针对处理许多 CPU 内核进行了优化,非常适合具有高 I/O 要求的工作负载。 它可以在固态驱动器 (SSD) 或其他高性能存储设备上运行。
当他们构建他们的 Cassandra 版本时,他们包括了RocksDB 存储引擎,也称为 Rocksandra。 我们极大地改变了我们对 Cassandra 存储的看法,同时保持其网络和节点协调不变。
Rocksdb 是内存数据库吗?
它的主要功能是为高性能数据提供服务,因为它是一个基于键值数据的嵌入式数据库。 RocksDB 是从 Google 的 LevelDB 派生出来的,它能够比许多 CPU 内核执行得更好,并且在 I/O 绑定应用程序中比 SSD 更快地存储数据。
RocksDB 中的一个或多个组件可能导致内存使用过多。 当您在 MongoRocks 中的块缓存对象上调用 GetUsage() 时,您可以确定块缓存的大小。 当块缓存大小减小时,将缓存更多数据,因为 IO 不会增加。 尽管 CPU 使用率可能不会因为 RocksDB 需要解压缩它从页面缓存中读取的页面而上升,但它可能会上升。 索引块和布隆过滤器块通常用于解释差异。 在 MongoRocks 中,您可以通过为 memtables 分配内存预算来设置块缓存。 在计算固定块的内存使用时,它很简单。 L1 大小可以通过添加或减去基本级别的字节来控制。 当同时进行 100k 读取事务时,可能会导致内存变慢。
通过结合 RocksDB,嵌入式应用程序可以高效快速地存储键值数据。 与动态 RAM 相比,SecondaryCache 具有更大的数量级,因此需要从远程存储读取更少,从而降低读取延迟和网络带宽消耗。 目前没有计划使用 RocksDB 作为默认数据库模型,但我们对其未来的广泛采用持乐观态度。
为什么 Rocksdb 是最好的键值存储
RocksDB 是一种快速可靠的存储选项,用于将键存储在键值存储中,也可以作为基于服务器的数据库的基础。 它带有用于性能调整的 LSM 树,使其成为需要大量数据存储的应用程序的可行选择。
RocksDB 与 Redis 有何不同?
Redis 的主要用例是内存,尽管它也可以将数据备份到持久存储并在必要时在内存中进行计算。 在大多数情况下,RocksDB 用于持久化持久化数据,并且在很多情况下,数据存储在持久化介质上。
Redis 对比 RocksDB 有哪些优势? Redis 数据存储是一种类似于 Memcached 的虚拟内存存储。 RocksDB 嵌入式键/值存储允许您读取多线程和日志结构的合并树。 由于 Redis 非常高效且可扩展(CPU 除外),因此其扩展性没有限制。 尽管 Redis 看起来更快,但 OP 的观点是,正如他所说,您的数据集不需要受应用程序中可用内存量的限制。 在某些情况下,您可以使用 LedisDB 和相同的 Redis 客户端库来替代 Redis,这几乎是九牛一毛。
Rocksdb 是分布式的吗?
RocksDB 是一个分布式数据库,可以水平扩展存储和性能。 它旨在通过简单的部署模型提供高可用性和性能。
ChakrDB键值存储(KVS)基于RocksDB,适用于PB到几十TB规模。 基于节点的架构 (vNodes) 用于分片 ChakrDB。 vNode 支持由 Kubernetes 创建的基于 ext4 文件系统的卷和 Nutanix BlockStore 内部文件系统配置。 RocksDB 是一种基于日志结构合并 (LSM) 树的 KVS,是 ChakrDB 背后的软件。 LSM 的数据结构适用于 NVMe 设备以及 SSD。 ChakrDB 可以在各种磁盘、虚拟机和使用 Kubernetes 的 Azure 中运行。 因为是容器化的,所以ChakrDB容器化程序可以在一个Pod中运行在任何K8s环境中。
该平台可以托管在 Nutanix 的分布式存储服务(Azure 或 AWS)或任何云存储服务提供商上。 Chakr 集群管理器负责集群中的所有控制平面流量。 chharDB 的目的是提供性能和规模。 使用 vNode,它创建了一个分片架构,将 I/O 分布在多个 RocksDB 实例上,以提高并行性和写入吞吐量。 Nutanix Objects 是有状态服务的一个示例,可以使用 chacherDB 在嵌入式或远程模式下运行。 它为 MetadataService 提供了维护缓存层的能力,同时还确保读取后读取的一致性。 我们可以在下图中看到通过线性扩展 ChakrDB 实例获得了多少吞吐量。
我们将在未来为读取、写入和扫描操作提供更详细的结果。 我们正在研究不同开发阶段的异步备份技术或校验和计算。 RocksDB 的版本现在有更好的校验和技术,可以在软件损坏变得持久之前检测到它。 在对 ChakrDB 有很高需求的应用程序中,有大数据分析、机器学习和人工智能等工作负载。 Nutanix 目前正在各种正在进行的项目和产品中对 ChakrDB 进行原型设计,这些项目和产品已经取得了可喜的成果。 我们将在未来的博客中让您了解我们正在做的事情。
Rocksdb:数据库的快速存储引擎
与 Linux 和 Apache 相比,RocksDB 不是一个具有灾难恢复计划的分布式系统。 由于可用性低,并且由于缺乏强大的数据复制机制,它没有很大的容量。 尽管如此,一些世界上最流行的数据库仍在继续使用它。 已经具备快速数据库引擎的 LevelDB 使 RocksDB 成为理想的存储引擎。 LevelDB 能够扩展以处理大量数据,同时还利用快速存储,这是一项重要资产。 此外,RocksDB 具有创新能力。 RocksDB 可以以多种方式存储数据,包括 IO 绑定、内存中或一次写入。 因此,对于存储要求高又不想牺牲性能或数据可用性的数据库来说,这是一个非常好的选择。
Rocksdb 替代方案
根据您的具体需求,有许多不同的 rocksdb 替代方案可供选择。 一些流行的替代方案包括 hbase、leveldb 和 berkeley db。
截至 2022 年,SourceForge 将 RocksDB 列为 Linux 的最佳替代品。 借助云数据库Redis版,我们可以高速从内存缓存中读取数据,保证数据的持久化,并在此过程中使用内存和硬盘存储。 自2009年起,Tair成为阿里巴巴集团官方数据缓存提供商,在双11等数据缓存场景中的表现得到认可。 Tanzu GemFire 对数据访问请求的低延迟响应使应用程序能够始终返回最新数据。 Google Cloud Bigtable 是一种完全托管的 NoSQL 数据库服务,专为需要实时分析和运营数据的工作负载而构建。 Amazon DynamoDB 每天可以处理超过 10 万亿次请求,支持每秒超过 2000 万次请求的峰值流量。 BergDB 是一个无模式、嵌入式、面向文档的 NoSQL 数据库,它是开源的并且可以免费使用。
提供简单键值存储、ACID 事务、历史查询、并发控制、快速附加存储、复制、透明对象标识符等多种功能。 OrigoDB 允许您以极低的成本构建关键任务的高性能系统。 因此,它提供了全方位的内存数据管理功能,包括同时管理多个数据库的能力。 单个 OrigoDB 引擎每秒可以处理数百万个读取事务。 Ignite 软件可用于开发 Java、C#、C++、Python 和其他编程语言的应用程序。 您可以快速轻松地加入、分组、聚合和排序内存和磁盘服务器上的数据。 您的 Ignite 数据库现在可以转换为分布式超级计算机。
Oracle 自治数据库简化了关系数据库的管理。 作为最灵活的部署之一,Redis Enterprise 提供混合模型。 InfinityDB Embedded 是一种 Java NoSQL 数据库,包含用于存储键值记录的层次结构。 该系统的性能、灵活性和免维护特性使其成为高性能、多核、灵活和免维护使用的理想选择。 LeanXcale 是一个快速且可扩展的数据库,它结合了 SQL 和 NoSQL,使它们能够很好地协同工作。 KiVi 存储引擎旨在以关系格式存储数据。 ModJS 允许您编写可以直接从 KeyBD 调用的 javascript 函数。
使用 Amazon ElastiCache 可以轻松设置、运行和扩展流行的内存数据存储。 缓存、会话存储、游戏、psyg 服务、实时分析和缓存只是 Amazon ElastiCache 可用的几个实时用例。 Go 凭借其高性能的 NoSQL 数据库库和服务器,是开发 Ledisdb 的最佳选择。 OrientDB 是市场上最快的图形数据库。 通过新的收入来源提高您的竞争优势并加速创新。 Macrometa NoSQL 数据库是无服务器的,基于流引擎,可以高速处理和计算数据。 Memorystore 可自动执行复杂的 Redis 和 Memcached 任务,例如高可用性、故障转移、修补和监控。
像 upscaledb 这样的高性能数据库利用它们的快速键值存储和算法来最大限度地利用它们。 UpscaleDB 是一个开源基准,可以扫描超过 5000 万条记录并检索最多。 Tablestore 平台使用数据分片和服务器负载平衡器技术以无缝方式实现数据增长和并发扩展。 InsightEdge 是分析的提供者,可以对历史结构化的流数据进行实时分析。 通过使用本服务按量付费的计费方式,您可以确保您的风控系统始终处于最佳运行状态。 ScyllaDB 数据库专为具有高性能和低延迟要求的数据密集型应用程序而设计。 超过 400 家改变游戏规则的公司使用 ScyllaDB,例如迪士尼、Expedia、FireEye、Discord、Zillow、星巴克、康卡斯特和三星。
当您需要可伸缩性和高可用性时,Apache Cassandra 数据库是一个不错的选择。 基于开源 Infinispan 数据存储和管理平台的 Hazelcast 数据网格提供了一组用于存储、管理和处理数据的强大功能。 多维数据是作为 InterSystems IRIS 的一部分使用一组 API 创建的,这些 API 允许对键值、关系、对象、文档和其他事务性持久数据进行并发操作。 FairCom DB 是一个实时分析平台,能够以可预测的方式实现大批量交易和并行大数据处理。 它是一种高级数据库引擎,可提供连续控制,是所有数据库引擎中总拥有成本 (TCO) 最低的。 Cache是由InterSystems创建的多模型(对象、关系、键值)数据库管理系统和应用服务器。 使用 Ehcache 作为客户端可以提高性能,减少数据库工作负载,并通过使用基于开源标准的缓存来简化可扩展性。
IBM Cloud Databases中的数据存储是用于企业应用程序开发的免费开源软件平台。 借助基于微服务平台构建的框架,它们支持无服务器应用程序。 Voldemort 不会尝试满足任意关系或满足关系数据库中的 ACID 属性。 通过使用多播通信将集群定义为网格。 XAP 是 GigaSpaces 的内存数据网格,专为具有高性能、弹性和超低延迟的关键任务应用程序的极端事务和流处理而设计。 FoundationDB 可以在商用硬件上以低成本运行大量繁重的数据。 由于 Kyoto Tycoon 网络服务器是轻量级的,因此它与 Kyoto Cabinet 键值数据库和 Kyoto Tycoon 网络服务器兼容。
最新的上游版本已经过改进,它们旨在一起使用并在实际生产条件下进行测试。 错误修复、次要新功能和一些 Linux 分发包更新是其中的一些改进。 现在可以将您经常使用的应用程序、文档和其他数据存储在速度更快的设备中。 它可以以与 RAM 或 SSD 相当的速度访问它们。 您可以使用 Memcached 从计算机的某些部分获取内存,这些部分您需要的内存超出了它们的处理能力。 开放标准和强大的 SQL 引擎相结合,创建了一个与众不同的强大 NoSQL 框架。 Amadeus、American Express、Carrefour、Cisco、Comcast/Sky、Disney、eBay、LinkedIn、Marriott、Tesco、Tommy Hilfiger、United、Verizon 和其他数百家公司都在使用该平台。
Rocksdb 快吗?
快速和低延迟存储,例如闪存驱动器和高速磁盘,是 RocksDB 的理想选择。 使用 RocksDB,您可以充分利用闪存和 RAM 的内存和读/写功能。
Badger 是在图形数据库中存储数据的更快选择
对于在图形数据库中存储数据,Badger 库是 RocksDB 的更快替代品。 因为 LSM 树拥有如此多的键,所以更多的键不太可能导致压缩。 此外,RocksDB 将用于读取和写入的数据存储在内存中,缓冲传入的读取。
分布式RocksDB
RocksDB 是一个用于键值数据的高性能嵌入式数据库。 它是用 C++ 编写的,提供了一个简单但功能强大的 API。 RocksDB 以日志结构格式存储其数据,使其在磁盘空间和读取性能方面都非常高效。 RocksDB 是需要低延迟和高吞吐量的应用程序的绝佳选择。
称为 chkrDB 的非结构化数据存储旨在通过创建分布式键值存储 (KVS) 来利用基于云的结构。 现代数据应用程序必须遵守某些规则才能在任何公共或私有云中运行。 云就绪应用程序通常需要开源 API 标准、标准 iSCSI 存储端点和容器工作负载,例如 Docker。 云存储和 Kubernetes 已经在计算和存储方面提供了横向扩展存储、可用性和一致性。 传统的分布式 KVS 复制数据、执行活动工作负载、迁移数据并确保 HA 和弹性。 当我们使用高度可用的云基础架构时,我们可以轻松消除与复制、HA 和扩展到底层云平台相关的一些复杂性。 大多数开源数据库并不满足上面列出的所有要求,包括低延迟和高吞吐量。
一个高性能的存储系统需要一个非常轻量级的分布式 KVS,它可以同时扩展到最大数量的文件。 我们决定使用 Cassandra 的分叉版本,我们已经使用了八年。 Nutanix 的自治范围存储 (AES) 是一种 AOS 磁盘本地元数据数据库,在测试期间展示了可喜的性能结果。 尽管 RocksDB 能够存储大量数据,但它需要的内存相对较少。 因为我们可以将 RocksDB 嵌入到其他进程中,所以在延迟和吞吐量方面我们具有显着优势。 ChahalDB 凭借其分布式、云原生设计、高可用特性和高性能特性,是 RocksDB 的优秀 KVS。 RocksDB Env 后端还使您能够连接到任何其他存储层。 本系列的第二部分将介绍 ChakrDB 分布式 KVS 的架构,并回顾推理和理论如何发展成为现实。
RocksDB 与 Sqlite
SQLite 和 RocksDB 主要用于数据库。 开发人员选择 RocksDB 而不是 SQLite 的主要原因是它对用户更友好,而轻量级被认为是一个关键因素。 RocksDB 是一个开源项目,GitHub 星数为 14.1K,GitHub 分支数为 3.09K。
RocksDB 和 SQLite 有什么区别? 在服务器-客户端关系(中央数据库)方面,SQLite 可能是最差候选者中最差的,而 RocksDB 是服务器-客户端关系(中央数据库)。 Firebase 并不是什么新鲜事,因为它是由企业而不是服务托管的应用程序。 虽然有一些负面影响,但好处是巨大的。 因此,您将需要创建服务器、客户端应用程序和数据库。 这可以是在 Node.js 上带有基于 Express 的 REST API 的 Javascript,或者带有用于数据库存储的内置 ObjectDB 数据库的 Javalin。 初始成本可能从非常低到零不等。 尽管您需要学习 Firebase 的 API,但我认为 Firebase 是更好的选择。
RocksDB Golang
RocksDB 是 Facebook 开发的键值数据库。 它是用 C++ 编写的,并且绑定了许多编程语言,包括 Go。
RocksDB 被设计成可扩展和高效的。 它可以用作独立的数据库或作为更大系统的一部分。 许多大公司都在使用 RocksDB,包括 Facebook、谷歌和微软。
它是 levigo 包的一个分支,标识符更改为 rockdb,包名称更改为 rocksdb。 批量使用批量读取设备。 如果您在代码中使用自定义比较器,则可能需要创建自己的过滤策略对象。 当程序不再需要缓存以防止内存泄漏时,激活它是至关重要的。 您现在可以通过打开数据库来访问它。 删除后,与该键关联的数据将从数据库中删除。 请在返回前复印一份信息。
CompactRange 在使用手动压缩模式时对其键范围进行手动压缩。 GetApproximateSizes 为使用的每个键范围计算文件系统的大小(以字节为单位)。 PropertyValue 作为其 property() 方法的结果返回数据库属性的值。 Put 写入与数据库键关联的数据。 如果 nil []byte 作为值传入,则返回零 []byte 的切片。 它是用于系统调用的数据库调用环境。 当程序不再需要 Envs 时,需要调用 Close 来防止内存泄漏。
如果在 GetError 事件期间发生 LevelDB 错误,它将返回一个错误。 对于完全无效的迭代器,返回值将为 nil。 当 close 释放给定的 Iterator 时,它会释放底层的 C 结构。 当程序不再使用 Iterator 时,激活 Close 以防止内存泄漏至关重要。 打开数据库时,SetCache 将缓存对象存储在数据库中。 使用 setCompression 时,由 SetCompression 指定的压缩算法决定哪些块可以被压缩。 使用 SetFilterPolicy 时,Open 创建一个新数据库,其中指定了过滤策略。
SetInfoLog 将 *Crocksdb_logger_t 对象指定为数据库的内部记录器。 SetFillCache 可用于确定使用此 ReadOptions 执行的读取是否将填充服务器缓存。 创建快照时,SetSnapshot 提供的原因读取与快照生成的原因读取相同。 这种方式可以保证在大数据量的时候每次读取都是一致的。 在以原子方式写入之前,必须将 WriteBatch 批量放置和删除操作存储在数据库中。 WriteBatch 在传递给 DB 后立即写入。 如果程序不再需要 WriteBatch 对象,建议关闭它。
所有排队的 Puts 和 Deletes 现在都被擦除。 当 Close 释放 WriteOptions 时,底层 C 结构可以自由执行。 如果使用 Write Options 脚本执行,则 SetSync 确定在写入被视为完成之前是否从操作系统缓冲区缓存中刷新每个 Write Options 写入。
Rocksdb:面向用户的应用程序的可嵌入键值存储
使用 RocksDB 是应用程序将数据存储在低延迟和快速访问数据库中的一种简单方法。 它对于跟踪网站访问者历史记录和网站状态的面向用户的应用程序非常有用。 此外,RocksDB 可用于需要快速访问大型数据集的应用程序。
Rocksdb 的实现
RocksDB 的实现非常高效。 它使用日志结构化合并树(LSM 树)来存储数据。 这允许快速插入和删除。 此外,RocksDB 压缩数据以节省空间。
我们将在这篇博文中介绍 RocksDB 如何在 Rockset 中使用,以及如何对其进行调整以获得最佳性能。 谈到 Rockset,我们希望我们的用户能够在 10 毫秒内以亚秒级延迟查询他们的数据,并连续摄取数据。 RocksDB 在 Facebook、LinkedIn、Uber 和许多其他公司的生产中使用。 RocksDB 以嵌入键的形式存储键值数据。 在 1 个RocksDB 实例中,数据不会传输到其他机器。 它经久耐用,是与 RocksDB-Cloud 合作设计的。 机器故障导致 RocksDB 无法恢复。
导致RocksDB的write ahead log无法使用。 因为 RocksDB 是写在内存中的,所以我们所有的写操作都是一样的结构。 具有在 WriteBatch 中批处理的单个更新数组的写入批处理会导致 RocksDB 的写入吞吐量更高; 并且写入批处理中的单个键被分类为多个。 在将更新写入 RocksDB 之前,我们将它们分成 100KB 大小的微批次并对其进行排序。 在 RocksDB 中,每个级别的目标大小都可以根据最后一个级别在该点的大小动态分配。 与 LSM 树中的其他级别相比,来自 L0 和 L1 级别的数据非常有限。 在从 L0 到 L1 的压缩过程中,必须访问 L1 中的所有文件。 执行范围扫描或检索大量字段的查询需要创建大量迭代器。 迭代器不允许在它们所在的空闲池中的查询中重复使用。
数据云数据库比较
有许多不同的云数据库可用,每种都有自己的优点和缺点。 在决定为您的企业使用哪种云数据库时,重要的是要比较和对比不同的选项,以便找到最适合您需求的选项。 Datamation 创建了一个云数据库比较图表,可以帮助您评估不同的选项并做出明智的决定。
Couchbase企业
Couchbase Enterprise Edition 是 Couchbase Server 最全面、性能最高的版本。 它包括社区版的所有功能,并添加了主动-主动异地复制和跨数据中心复制 (XDCR) 等企业功能,以及增强的安全性和监控功能。 Couchbase 企业版有两个订阅级别:标准版和企业版。
Couchbase Server 是一种云原生分布式数据库,结合了关系数据库的优势和 NoSQL 的强大功能。 此云服务可作为公共云以及私有云和混合云中的服务使用。 使用系统的内存优先架构以毫秒为单位测量延迟。 对于关键任务应用程序,Couchbase 平台重新定义了数据库经济学。 使用键值、查询和搜索等多种方法,您可以创建跨多个平台运行的引人入胜的应用程序。 SQL、模式、事务和用户定义的函数只是一些熟悉的结构。 此外,Couchbase 支持可用于将存储桶、范围、集合和文档映射到 RDBMS 的动态模式结构。
N1QL 是一种声明性语言,使应用程序开发人员能够以富有表现力、强大和完整的方式查询、转换和操作数据。 在扩展您的业务时,多层数据中心提供了两全其美的优势:它允许您通过利用计算、存储和处理工作负载分区来满足您在单一平台中要求最苛刻的工作负载。 您可以轻松地跨数据中心复制数据以满足您的业务需求,无论是高可用性、灾难恢复还是灵活的全球复制。 提供内置审计功能以及基于角色的访问控制和加密通信。 您的数据在线上和云端都是安全的。
Couchbase:流行的 Nosql 数据库
Couchbase 等 NoSQL 数据库是各种 Web、移动和物联网 (IoT) 应用程序的绝佳选择。 作为基于云的解决方案的领先供应商,Couchbase 在五个国家设有办事处,为超过 2,000 名客户提供服务,其中包括阿联酋航空、Tommy Hilfiger、SyncThink、LinkedIn 和万豪酒店。