分布式键值存储系统的研究和实现 毕业论文+项目源码及数据库文件

!!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!!

 💕💕作者:毕业通通通
💕💕个人简介:本人在读博士研究生,拥有多年程序开发经验,辅导过上万人毕业设计,支持各类专业;如果需要论文、毕设辅导,程序定制可以联系作者
💕💕各类成品java系统 。javaweb,ssh,ssm,springboot等等项目框架,源码丰富,欢迎咨询交流。学习资料、程序开发、技术解答、代码讲解、源码部署,需要请看文末联系方式。

摘要

21世纪初,互联网进入了一个新的发展高峰,数据量呈指数增长,对海量数据的管理、访问的需求变得越来越迫切。随着云计算和大数据技术的兴起,各种大规模数据级应用程序不断涌现,这些新应用程序对数据存储的需求日益增加。但是,传统的关系数据库(如OracleMySQL)越来越难以满足云计算环境的数据存储需求。分布式非关系数据库充分结合分布式系统抗单点故障能力和天然横向扩展性的特点,可以应对海量数据存储的挑战。 NoSql类型数据库近年来一直蓬勃发展。常见的nosql产品有键值类型,文档类型,列存储类型,图形存储类型,xml数据库等。但是,最流行和最广泛使用的nosql类型是键值类型。 Redis是键值类型的代表。在使用Redis的过程中,我深深感受到了Redis的不便,因此我实现了一个高性能的分布式键值存储系统Mondis Mondis具有以下基本功能或创新点:

1)以现有的分布式理论为基础,研究了分布式存储的相关技术,介绍了分布式 NoSQL 数据库的概念、特点以及相关基础理论,并分析了目前应用广泛的键值存储系 统的架构与优缺点。在此基础之上,设计了一个高性能,高可用,分布式的键值存储系统Mondis

2)在使用Redis的过程中深感不便的情况下,研读了Redis的源代码实现,给键值存储添加了数据结构嵌套特性,使得Mondis可以保存任意结构化的数据,这是本文的主要创新点。

3研究基于 Raft 一致性协议解决主从复制过程中主节点宕机的问题,从而来保证可用性和数据的最终一致性。

4基于上述理论,实现了一个分布式键值存储引擎 Mondis,开发语言为 C++,在其中部署了改进的 Raft 一致性协议来实现强一致性的数据复制方式,从而 来保证可用性,并针对该系统做了 详细的测试,在此基础上提出了今后的改进计划。

本文所使用的的java客户端可通过此链接获得:

关键词 键值存储;分布式;高性能;嵌套;json

ABSTRACT

In the early 21st century, the Internet entered a new peak of development, the amount of data increased exponentially, and the management of massive data was increased. The demand for accessibility became more and more urgent. With the rise of cloud computing and big data technologies, a variety of massive data-scale applications are emerging, and these new applications are placing increasing demands on data storage. However, traditional relational databases, such as Oracle and MySQL, have become increasingly difficult to meet the data storage needs of cloud computing environments. The distributed non-relational database fully combines the characteristics of the distributed system against single point of failure and natural horizontal scalability, and can cope with the challenges of massive data storage. The NoSql type database has been booming in recent years. Common nosql products have key-value type, document type, column storage type, graph storage type, xml database and so on. But in nosql, the most popular and widely used key-value type is Redis. In the process of using Redis, I deeply felt the inconvenience of Redis, so I realized a high-performance, distributed key-value storage system, Mondis. Mondis has the following basic features or innovations:

(1) Based on the existing distributed theory, the related technologies of distributed storage are studied. The concept, characteristics and related basic theories of distributed NoSQL database are introduced. The architecture of the widely used key storage system is analyzed. With advantages and disadvantages. Based on this, a high-performance, high-availability, distributed key-value storage system, Mondis, was designed.

(2) In the case of deep inconvenience in the process of using Redis, the source code implementation of Redis was studied, and the data structure nesting feature was added to the key value storage, so that Mondis can save any structured data, which is the The main innovation point.

(3) Research on the Raft-consistent protocol to solve the problem of master node downtime in the master-slave replication process, so as to ensure the ultimate consistency of availability and data.

(4) Based on the above theory, a distributed key-value storage engine, Mondis, is developed. The development language is C++, and an improved Raft consistency protocol is deployed to implement a strong and consistent data replication method to ensure availability. The system has been thoroughly tested and based on this, a future improvement plan is proposed.

You can get java client of the article from the following link

KeyWords key-value storage; distributed; high performance; nested; json

目录

摘要............................................................................................... 1

ABSTRACT................................................................................... 2

第一章 引言.................................................................................. 4

1.1 研究背景..................................................................................................... 4

1.2 国内外研究现状和发展趋势..................................................................... 5

1.3 本文的工作和创新..................................................................................... 6

1.4 本文的内容和组织..................................................................................... 8

第二章 相关技术和系统.............................................................. 10

2.1 键值存储系统的特点............................................................................... 10

2.2 主流NoSQL存储系统及其优劣............................................................ 10

2.2.1 HBase...................................................................................................... 10

2.2.2 Redis....................................................................................................... 11

2.2.3 MongoDB............................................................................................... 12

2.2.4 LevelDB.................................................................................................. 13

2.3 Mondis相对于其的优势.......................................................................... 13

第三章 系统设计......................................................................... 15

3.1 Mondis系统简介...................................................................................... 15

3.2 数据结构嵌套........................................................................................... 15

3.3 事务机制的实现....................................................................................... 17

3.4 json支持.................................................................................................... 18

3.5 连接管理,线程模型,io模型............................................................... 19

3.6 raft算法支持的主从复制......................................................................... 23

3.7 命令解释器,locate命令........................................................................ 26

3.8 zset实现.................................................................................................... 27

3.9 AVL树优化的HashMap........................................................................... 28

第四章 Mondis测试与分析......................................................... 31

4.1 测试环境的搭建....................................................................................... 31

4.2 Mondis的读写测试.................................................................................. 32

4.3 测试动态添加删除Mondis节点............................................................ 34

4.4 Raft一致性协议的改进测试.................................................................... 35

4.5 本章小结................................................................................................... 36

第五章 总结与展望..................................................................... 37

5.1 工作总结................................................................................................... 37

5.2 工作展望................................................................................................... 37

致谢............................................................................................. 39

参考文献...................................................................................... 40

第一章 引言

1.1 研究背景

近年来,随着社交网络,电子商务和云计算等大规模数据密集型Web应用的普及,越来越多的信息被数字化。这种类型的数据生成非常快,每分钟甚至每秒都会产生大量数据。如何管理如此大量的数据已成为亟待解决的问题。在传统的虚拟化环境和许多云存储服务中,经常使用集中式存储的方式管理数据,每个计算节点使用iSCSINFS协议,通过网络访问集中存储资源。这是一个久经考验的模型,已被企业和服务提供商使用多年,但它仍然存在可扩展性差,成本高和单点故障的问题[1]

传统的集中式存储服务(如SANNAS)通过一个或少量端口链接到网络。随着企业流量的增长和存储,这些网络端口可以表示存储系统中计算资源和磁盘之间的数据流量瓶颈。随着数据量的扩大,集中存储服务将越来越难以满足企业的存储需求,集中存储可能会出现故障,并且存在一篮子鸡蛋过多的问题。由于存储是集中式的,如果存储失败,所有依赖它的服务都会受到影响。最小化这种影响的方法是将最大量的内部冗余设计到存储单元中,而不仅仅是使用RAIDZFS。防止单个磁盘故障的技术,也可以通过冗余电源和多个故障转移主机单元。然而,所有这些都增加了存储单元的成本,并且无论改善上述条件的成本多少,它仍然有可能失败。目前,研究界和行业面临的主要挑战是设计一个具有成本效益和可扩展的存储系统,以应对数据量的爆炸式增长。分布式系统不是近年来存在的技术。早在20世纪70年代和80年代,就出现了各种分布式系统。只有在互联网时代,分布式系统才会闪亮,同时又带有微缩模型。随着计算机的出现,越来越多的廉价PC成为主要互联网企业架构的首选。通过联网大型,廉价且不可靠的存储设备,分布式处理方法越来越受到业界的青睐。它提供高可靠性和高可用性的存储服务,这是解决传统SAN中难以根除的容量和性能均衡分布问题的良好解决方案。特别感兴趣的是分布式NoSQL数据库,如GoogleBigTableSpanner,亚马逊的DynamoFacebookCassandraHBaseRedis等等。这些分布式非关系数据库将分布式系统的独特单点故障能力与NoSQL的自然水平可扩展性相结合,以应对海量数据的挑战。

键值存储系统是最常用的NoSQL存储系统之一,由于其在处理大量非结构化数据方面的高性能而受到广泛关注。它提供了简单的数据抽象,键值数据库提供的API通常非常简洁,如Cassandra的查询语言,它比完整的SQL更容易使用。因为NoSQL牺牲了SQL语言的表达能力和基于关系数据模型的完整性检查,以换取更高的可用性和可伸缩性。 Redis是键值存储系统中最耀眼的明星之一。客观地说,Redis确实解决了一些问题,但作者在使用过程中仍然非常不方便,所以萌生了自己实现一个键值存储的想法。

1.2 国内外研究现状和发展趋势

早在2006年,谷歌就发表了一篇文章,详细介绍了分布式存储系统BigTable的内部使用,BigTable是一个用于存储大量数据的非关系数据库。 BigTable的目标是可靠地处理大量数据并将其部署到数千台商用机器上。 BigTable实现了多个目标:广泛的适用性,可扩展性,高性能和高可用性。 BigTable目前可用于60多种Google产品和项目,包括Google AnalyticsGoogle财经和Google地球。但是,BigTable仅为行事务提供一致性,并且不为跨行跨表操作提供强一致性保证。为了解决BigTable留下的问题,2013年,Google发布了一篇关于由其开发的另一个分布式数据库Spanner的论文。 SpannerGoogle的全球分布式数据库,可扩展到数百万个存储节点,数百个数据中心和数万亿行存储。除了强大的扩展功能外,它还通过同步复制和多版本并发控制支持最终一致性和可用性,突破了CAP的束缚,实现了三者之间的完美平衡。 Cassandra最初是由Facebook开发的分布式键值存储管理系统。它于2009年成为Apache孵化器项目,于2010年正式开源.Cassandra为跨越多个数据中心的集群提供强大支持,允许所有客户端实现低延迟操作的异步延迟。 2012年,多伦多大学分布式存储研究的研究人员通过实验得出结论,Cassandra通过在最大数量的存储节点上扩展存储服务而牺牲了一部分读写延迟,从而实现了最高的吞吐量。数量。

在中国,大规模分布式存储的研究起步较晚,但发展很快。随着业务量的增长,阿里巴巴于2010年独立开发了OceanBase数据库,这是一个支持海量数据存储的高性能分布式数据库系统,可实现数千亿条记录和数百兆字节的数据跨行交叉表事务处理。目前,OceanBase已应用于淘宝收藏夹,用于存储淘宝用户收集物品,特定产品和商店信息,每天支持千万级更新操作。 Tera是百度开发的高性能,可扩展和结构化数据存储系统,用于管理百度搜索引擎的TB级超链接和网页。对于实时数据分析和高效访问,Tera使用三维数据模型组织数据,该模型按行键,列名和时间戳进行全局排序,使用多层缓存系统来利用大内存,在实现模型灵活性的同时,性能优势实现了高吞吐量和水平扩展。

由此可见,MySQLOracle等关系数据库存在难以扩展的问题,而HBaseMongoDBRedisNoSQL数据库是可扩展的,但不支持SQL,也放弃了事务一致性。 因此,新一代数据库的概念应该是可扩展的,又能够保留关系数据库的主要特征。

NewSQL是一种数据库产品,具有传统SQL数据库的优点,可以适应云计算时代的分布式扩展。这是由451集团的分析师Matthew Aslett在研究论文[11]中提出的,针对NoSQLOLTP(联机事务处理)。读写负载提供相同的可扩展性能,同时仍提供交易的ACID保证。简而言之,这些系统希望实现与NoSQL相同的可扩展性,同时保留从20世纪70年代开始的关系模型和事务支持,使应用程序能够执行大规模并发事务并使用SQL而不是NoSQL。特定的API用于修改数据库的状态。如果应用程序使用NewSQL数据库管理系统,开发人员不再需要像使用NoSQL那样处理应用程序逻辑中的最终一致性问题。

1.3 本文的工作和创新

本文深入分析了目前主流的nosql存储系统的优劣,并在此基础上,深入全面地研究了当前相关技术和系统,设计了一个高性能,分布式的键值存储系统。本文的主要创新和工作如下:

第一:数据结构的嵌套。Mondis支持Redis所支持的所有数据结构,并且支持数据结构的任意嵌套, Mondis嵌套意味着list,zset的元素与hash类型键值对的值可以是另一个list,set,zset或者hash,就像json 那样。注意,set类型的元素只能是string,这是因为set底层采用hash表进行实现,而list,zsethash没有默认的哈希函数。Mondis没有嵌套层数的最大限制。

第二:json支持。Mondis查询类似于Redis查询,但是不同的是Mondis查询返回的格式是json。这使得Mondis更方便使用。而且Mondis 支持json持久化与恢复。Mondis可以把json格式的value自动转化为对应的数据结构。而且Mondisrdb持久化的格式也是json

第三:Mondis多态命令。Redis里面,我们在操作的时候必须指定底层数据的类型,比如list命令全部以l开头,zset命令全部以z开头,hash命令全部以hash开头, 但是在Mondis里面,这些统统不需要。Mondis命令具有多态性,相同的命令在不同数据结构上的效果是不同的,只需要执行命令而无需关心底层数据结构是 什么。如果执行了不合适的命令,Mondis会处理这种情况,不用担心崩溃。

第四:跨平台。Mondis在设计的时候已经考虑到了平台兼容性的问题,Mondis是跨平台的,在windows以及unix系统上都能正常使用。 不过要在各自的平台上编译二进制文件。

第五:事务支持回滚。Mondis的事务支持回滚,就像传统关系型数据库那样。这意味着如果在事务执行过程中某条命令没有执行成功,已经执行的命令就会 回滚,就像从来没有执行过这条命令一样。然后事务的执行状态将会被重置。

第六:主从复制raft支持。Mondis的集群采用了raft算法实现最终一致性,这意味着如果leader节点在任意时刻挂掉了,集群都不会因此受到影响。 raft算法会处理好所有的一切,包括重新选leader,以及同步到其他所有节点。

第七:写命令重定向。Mondis slave节点可以自动将收到的写命令转发到master节点执行,这个行为对客户端是完全透明的。这意味着如果a,b,c 组成了一个集群,amaster,b,cslave,那么b,c收到的写命令将会自动转发给a执行,b,c的客户端对此毫不知情, 就好像这条命令是由b,c执行的一样。此功能需要在配置文件中开启,如果没开启,那么slave节点在收到写命令后拒绝执行 并返回一个错误。

第八:底层数据结构实现改进。

ListMondis里面,list还是用链表实现。不同的是Mondis保存了对象指针与索引的双向映射,这样虽然多占用了一些空间, 不过支持元素的随机访问。list同时支持Redis里面的list所有操作。这些操作的均摊时间复杂度均为常数。

SetMondisset采用的是value为空的hash表进行实现,听起来似乎与Redis没什么不同,但是Mondishashmap采用avl树解决哈希冲突, 减小了哈希表操作的常数因子。

ZsetRediszset采用跳表+哈希表实现,编码异常复杂,空间占用也没很大优势。 Mondiszset采用伸展树实现,在时间与空间复杂度上进行了很好的权衡,而且伸展树方便的支持区间操作。

HashRedishash在键值对数量不多时采用ziplist,虽然空间 占用小,但是查询时必须线性扫描,而且插入时有可能连锁更新影响性能。 在键值对数量较多时采用哈希表,浪费大量空间。 Mondishash采用平衡树实现,在时间与空间复杂度上进行了很好的权衡。

1.4 本文的内容和组织

本文共分为五章,各章的工作内容如下:

第一章为引言,介绍了本文的背景,接下来介绍了本文主要工作和内容组织。

第二章为相关技术和系统介绍。主要介绍了目前主流的键值存储系统及其优劣,以及Mondis相对于其的优势。

第三章为Mondis系统的详细设计,本章详细介绍了数据结构嵌套,事务支持,json支持,raft算法实现等解决方案,重点介绍了本文的创新点和特色。

第四章为Mondis的测试与分析。基于上述理论,实现了一个分布式键值类型 的高性能存储引擎,对其进行了详细的功能测试和性能测试。

第四章为结论和展望。本章对本文的工作做了一个总结,并对今后系统的发展方向做了展望。

更多项目:

另有10000+份项目源码,项目有java(包含springboot,ssm,jsp等),小程序,python,php,net等语言项目。项目均包含完整前后端源码,可正常运行!

!!! 有需要的小伙伴可以点击下方链接咨询我哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优创学社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值