分布式数据库简史
web2.0时代给数据库设计带来了新的兴趣。虽然传统的RDBMS数据库从1970年代末商业化开始到网络时代都能很好地满足企业界的数据存储和数据处理需求,但新应用程序处理的大量数据以及处理这些数据的速度需要一种新的方法。为了更好地了解这些新数据库设计的需求,我强烈建议观看数据库大师michaelstonebraker在斯坦福大学计算机系统学术讨论会上的演讲。在此期间出现的新数据库采用了NoSQL和NewSQL等名称,强调了在满足新需求方面,好的旧SQL数据库是不够的。
尽管对特定协议有不同的设计选择,但这些数据库在很大程度上采用了无共享的分布式计算体系结构。虽然每个计算系统的处理能力最终都会受到物理约束的限制,而且在涉及并行执行的分布式数据库等情况下,也会受到阿姆达尔定律的影响,但这些系统中的大多数都为计算和存储提供了无限水平容量扩展的理论可能性。每个节点代表一个计算和存储单元,可以根据需要添加到系统中。
然而,正如Cockroach实验室首席执行官兼联合创始人斯宾塞·金博尔(Spencer Kimball)在这里以Cockroach数据库为例所解释的那样,从头开始设计一个这样的新数据库是一项艰巨的任务,需要知识渊博、技术娴熟的工程师通力合作,做出非常仔细的决策。对于像CockroachDB这样的数据库,有一种可靠的、高性能的方法来从稳定的存储中存储和检索数据是必不可少的。设计一个利用文件系统或原始设备来提供快速稳定存储的库是一个非常困难的问题,因为要获得正确的存储,需要大量的边缘案例。
使用RocksDB提供快速存储
RocksDB是一个库,它解决了对本地稳定存储的抽象访问问题。它允许软件工程师将精力集中在系统其他领域的设计和实现上,而不必依赖RocksDB来访问稳定的存储,因为他们知道,它目前在Facebook和其他同样具有挑战性的环境中运行着地球上任何地方最苛刻的一些数据库工作负载。
RocksDB相对于其他存储引擎的优势是:
技术设计。因为新数据库最常见的用例之一是存储由高吞吐量源生成的数据,所以存储引擎必须能够处理写密集型工作负载,同时提供可接受的读取性能。RocksDB实现了数据库文献中已知的日志结构的合并树(也称为LSM树)。深入研究LSM树的细节,以及RocksDB实现LSM树的细节,不在本博客的讨论范围之内,但可以说它是一种优化的索引结构,可以处理大量的顺序或随机写入工作负载。这是通过将每次写入都视为追加操作来实现的。一种称为压缩的机制在后台对开发人员透明地运行,删除不再相关的数据,例如删除的密钥或有效密钥的旧版本。
原文:http://www.benstopford.com/2015/02/14/log-structured-merge-trees/
通过巧妙地使用bloom过滤器,RocksDB还提供了很好的读取性能,使RocksDB成为建立分布式数据库的理想候选。另一个基于b树的存储引擎的流行选择是。InnoDB是MySQL的默认存储引擎,它是一个实现b树派生的存储引擎的示例,特别是所谓的b+树。
性能。由于性能原因选择给定的技术设计需要通过实证验证选择。在Facebook上,在MySQL的MyRocks项目中,MarkCallaghan在RocksDB上执行了广泛而严格的性能测量,以比较InnoDB与RocksDB上的MySQL性能。详情可在此处找到。毫不奇怪,RocksDB在编写密集型基准方面经常表现得非常出色。有趣的是,虽然InnoDB在读密集型基准测试中也经常优于RocksDB,但相对而言,这一优势并不如RocksDB在编写密集型任务时比InnoDB提供的优势大。以下是英特尔NUC上I/O绑定基准的示例:
资料来源:https://smalldatum.blogspot.com/2017/11/insert-benchmark-io-bound-intel-nuc.html
可调性。RocksDB提供了几个可调参数,以便在不同的硬件配置上获得最佳性能。虽然技术设计提供了一种架构上的理由来支持一种类型的解决方案而不是另一种类型的解决方案,但是在特定用例上实现最佳性能通常需要灵活地调整这些用例的某些参数。RocksDB提供了一长串可用于此目的的参数。三星的Praveen Krishnamoorthy在2015年的年会上提交了一份关于RocksDB如何调整以适应不同工作负载的广泛研究报告。
可管理性。在任务关键型解决方案(如分布式数据库)中,必须对系统的关键组件(如节点中的存储引擎)具有尽可能多的控制和监视功能。Facebook对RocksDB进行了一些重要的改进,例如动态选项更改和RocksDB内部操作(包括压缩)所有方面的详细统计数据的可用性,这些都是企业级软件产品所需要的。
生产参考。企业软件的世界,尤其是在数据库方面,是极其厌恶风险的。由于完全可以理解的原因,在数据丢失或数据腐败的情况下,可能会造成金钱损失和声誉损害,没有人愿意在这一领域充当试验品。RocksDB是由Facebook开发的,最初的动机是将其庞大的MySQL集群的存储引擎从InnoDB切换到RocksDB。迁移在2018年完成,为Facebook节省了50%的存储空间。让Facebook领导RocksDB在其数十亿美元业务中的最关键用例的开发和维护是一个非常重要的认可,特别是对于缺乏Facebook资源来开发和维护自己存储引擎的数据库开发人员来说。
语言绑定。ROCKSDB提供了一个关键值API,可用于C++、C和java。这些是分布式数据库世界中使用最广泛的编程语言。
综合考虑这6个方面,RocksDB对于寻找快速、经过生产测试的存储引擎的分布式数据库开发人员来说是一个非常有吸引力的选择。
谁使用RocksDB?
多年来,RocksDB已知用途的列表急剧增加。以下是嵌入RocksDB的数据库的非详尽列表,强调了其作为快速存储引擎的适用性:
- Apache Cassandra
- CockroachDB
- MySQL (MyRocks)
- Rockset
尽管所有这些数据库提供商选择RocksDB而不是其他选项的理由可能都很相似,但Instagram用RocksDB取代Apache Cassandra自己的Java编写的LSM树,这一点意义重大,目前Apache Cassandra的所有其他用户都可以使用。apache cassandra是最流行的NoSQL数据库之一。
RocksDB还发现,作为分布式数据库世界之外的嵌入式数据库,对于同样重要的、关键任务的用例,RocksDB也得到广泛接受:
- Kafka Streams—在ApacheKafka生态系统中,Kafka Streams是一个客户端库,通常用于构建应用程序和微服务,这些应用程序和微服务消耗和生成存储在Kafka集群中的消息。Kafka流支持容错有状态应用程序。默认情况下,RocksDB用于存储此类配置中的状态。
- ApacheSamza-ApacheSamza提供了类似于Kafka流的功能,它还使用RocksDB将状态存储在容错配置中。
- Netflix-在查看了几个选项后,Netflix选择了RocksDB,以支持他们在其全局缓存系统EVCache中的SSD缓存需求。
- Santander UK-Cloudera Professional Services为Santander UK构建了一个近乎实时的事务分析系统,由ApacheHadoop支持,该系统实现了一个流式浓缩解决方案,该解决方案将其状态存储在RocksDB上。桑坦德集团是西班牙最大的跨国银行之一。截至本次写作,其收入接近500亿欧元,管理资产接近1.5万亿欧元。
- Uber-Cherami是Uber自己的持久分布式消息传递系统,相当于亚马逊的SQS。Cherami选择在其存储主机中使用RocksDB作为存储引擎,因为它的性能和索引功能。
RocksDB:为高性能分布式数据系统供电
从LevelDB的分支开始,Google基础设施专家JeffDean和SanjayGhemawat开发了一个key-value
嵌入式存储,通过Facebook工程师的努力,将其转化为适合运行任务关键工作负载的企业级解决方案,RocksDB已经获得广泛的认可,作为寻找经过战斗测试的嵌入式存储引擎的工程师选择的存储引擎。
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1844.html
暂无评论