searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Key-Value Storage简介

2024-12-12 09:10:59
8
0

Key-Value Storage简介

1. 背景信息

1.1 结构化与非结构化数据

结构化数据是指具有明确定义的结构类型/大小/组织形式遵循一致顺序的数据有明确的模式例如性别年龄电话号码身份证号邮箱地址邮政编码等

非结构化数据则是指没有预先定义好的数据模型或者没有以一个预先定义的方式来组织的信息可以是文本或非文本类型包括文件邮件内容图片音频/视频网站内容数据地理信息等

IDC 2017年白皮书Data Age 2025预测2018年到2025年之间全球产生的数据量将会从33ZB增长到175ZB复合增长率达到27%其中超过80%的数据都会是处理难度较大的非结构化数据


IDC报告2021-2025年全球数据及存储领域结构化和非结构化数据预测20217超过90%的现有数据是非结构化数据并且在过去十年中大体保持不变

1.2 非结构化数据的存储

非结构化数据通常以两种形式来存储和管理

1. 以文件的形式存储在文件系统中可以是本地文件系统或分布式文件系统等任何形式的文件系统但数据管理不方便并需要额外考虑事务处理的一致性和数据的安全性

2. 存储在NoSQL数据库中这种方式能够充分利用数据库的事务管理和安全特性但在数据查询和读写的性能会有瓶颈

NoSQL数据库

NoSQL数据库泛指非关系型的数据库它是为了解决大规模数据集合以及多种数据类型带来的问题NoSQL数据库并没有一个统一的架构包括

(Key-Value)键值对存储以键值对的形式存储数据每个键对应一个值适用于缓存日志等高性能场景

(Column)列存储以列族的形式存储数据每个列族可以包含多个行适用于搜索引擎大数据存储等场景

(Document)文档存储以文档的形式存储数据每个文档可包含多个字段适用于Web应用日志等场景

(Graph)图存储以图结构存储数据适用于社交网络推荐系统等场景

2. Key-Value存储

2.1 概念

Key-Value存储是一种以键值对Key-Value Pair形式存储数据的数据库这种数据库以键值对的形式组织数据每个Key键对应一个Value主要优点是速度快存储数据量大支持高并发和方便扩展Key-Value存储非常适合通过主键Key进行查询但不能进行复杂的条件查询应用场景非常广泛

Cache缓存应用程序可以将数据存储在内存中以提高访问速度并确保数据的唯一性

消息队列RabbitMQKafka等消息队列系统中使用Key-Value存储来跟踪消息的路由和分发

分布式系统在分布式系统中Key-Value存储可以用于管理分布式数据和实现数据复制

Web会话管理Web应用通常使用Key-Value存储来管理用户会话状态

游戏应用多人在线游戏中游戏状态通常存储在Key-Value存储中

2.2 分类

Key-Value数据库有很多当前主流的核心算法有三种基于Hash哈希的基于B+-tree的和基于LSM-tree

2.2.1 基于Hash算法

在基于哈希的Key-Value数据库中哈希表是一个非常关键的数据结构哈希表可以将任意键Key映射到一个索引Index),并将值Value存储在该索引的位置上这种映射关系使得我们可以非常快速地找到对应的键值对通常只需要O(1)的时间复杂度

在写操作时Key-Value数据库会使用哈希函数将键Key映射成索引Index),并将值Value存储在该索引位置上在查询操作时数据库会再次使用哈希函数将键Key映射成索引Index),并在该索引位置上查找对应的值Value

基于哈希的Key-Value数据库具有快速可扩展和高可用性的特点可以处理大量的数据并保证高并发访问的速度同时基于哈希的Key-Value数据库也具有一些潜在的缺点

可能会受到哈希冲突的影响而降低性能尽管这种可能性很小但在处理大量数据时可能会出现

数据的持久性没有很好的保证如果发生硬件故障或数据库崩溃数据可能会丢失一致性Hash& 多副本一些典型的基于哈希的Key-Value数据库包括RedisMemcachedAerospike

2.2.2 基于B+-tree算法

基于B+-treeKey-Value数据库是一种数据存储和检索系统它使用B+-tree作为其基本的数据结构在基于B+树的Key-Value数据库中B+树被用作索引结构所有的键Key和值Value都存储在叶子节点上并形成了一个链表查找插入和删除等操作时时间复杂度比较稳定且都为O(logn)

基于B+-treeKey-Value数据库具有一些显著的特点

由于B+-tree的特性相近的key-value对能够存储在一起数据库可以支持范围查询和有序查找等操作

B+-tree的平衡特性使得其可以支持多个线程或进程同时进行读写操作

B+-tree算法相对复杂维护存在难度基于B+-treeKey-Value数据库的插入操作通常需要在叶子节点上进行如果插入的键Key已经存在则需要进行分裂操作分裂操作会将节点分裂成两个节点并重新平衡树结构在分裂操作时如果根节点只有一个子节点则需要进行合并操作以保证树的平衡性

基于B+-tree算法的代表NoSQL数据库使MongoDB

2.2.3 基于LSM-Tree算法

LSM-Tree 采取读写分离的策略会优先保证写操作的性能其数据首先存储内存中而后需要定期Flush 到硬盘上LSM-Tree可以将离散的随机写请求转换成批量的顺序写操作无论是在RAMHDD还是在SSDLSM-Tree的写性能都更加优秀基于LSM-TreeKV数据库有HBase, Cassandra,RocksDB, LevelDB

 

根据LSM-tree算法写入请求通常直接写入在内存中维护的内存表数据结构中性能很好但当内存表的数据量达到一定阈值时将内存表持久化到SSTable文件同时在分层结构中上一层LevelSSTable数量达到一定阈值就会进行Compaction合并成下一级LevelSSTable


基于LSM-treeKey-Value数据库存在以下问题

写入性能的波动Compaction操作会占用CPU内存和IO资源这导致了写入性能波动

较大的写入放大WA>10x为了确保数据的一致性和完整性LSM-tree需要将写前日志Write Ahead Log存储在盘上这需要额外的空间数据在SSTable中从旧到新可能会存在多个版本成倍的增加了存储空间此外Compaction操作也需要额外的临时空间存放数据文件

随机读性能相对较差最好情况是从内存中直接读取最差情况是遍历所有Level层级的SSTable所以随机读的平均时延不可预期性能也相对较差

0条评论
0 / 1000
qilin
6文章数
0粉丝数
qilin
6 文章 | 0 粉丝
原创

Key-Value Storage简介

2024-12-12 09:10:59
8
0

Key-Value Storage简介

1. 背景信息

1.1 结构化与非结构化数据

结构化数据是指具有明确定义的结构类型/大小/组织形式遵循一致顺序的数据有明确的模式例如性别年龄电话号码身份证号邮箱地址邮政编码等

非结构化数据则是指没有预先定义好的数据模型或者没有以一个预先定义的方式来组织的信息可以是文本或非文本类型包括文件邮件内容图片音频/视频网站内容数据地理信息等

IDC 2017年白皮书Data Age 2025预测2018年到2025年之间全球产生的数据量将会从33ZB增长到175ZB复合增长率达到27%其中超过80%的数据都会是处理难度较大的非结构化数据


IDC报告2021-2025年全球数据及存储领域结构化和非结构化数据预测20217超过90%的现有数据是非结构化数据并且在过去十年中大体保持不变

1.2 非结构化数据的存储

非结构化数据通常以两种形式来存储和管理

1. 以文件的形式存储在文件系统中可以是本地文件系统或分布式文件系统等任何形式的文件系统但数据管理不方便并需要额外考虑事务处理的一致性和数据的安全性

2. 存储在NoSQL数据库中这种方式能够充分利用数据库的事务管理和安全特性但在数据查询和读写的性能会有瓶颈

NoSQL数据库

NoSQL数据库泛指非关系型的数据库它是为了解决大规模数据集合以及多种数据类型带来的问题NoSQL数据库并没有一个统一的架构包括

(Key-Value)键值对存储以键值对的形式存储数据每个键对应一个值适用于缓存日志等高性能场景

(Column)列存储以列族的形式存储数据每个列族可以包含多个行适用于搜索引擎大数据存储等场景

(Document)文档存储以文档的形式存储数据每个文档可包含多个字段适用于Web应用日志等场景

(Graph)图存储以图结构存储数据适用于社交网络推荐系统等场景

2. Key-Value存储

2.1 概念

Key-Value存储是一种以键值对Key-Value Pair形式存储数据的数据库这种数据库以键值对的形式组织数据每个Key键对应一个Value主要优点是速度快存储数据量大支持高并发和方便扩展Key-Value存储非常适合通过主键Key进行查询但不能进行复杂的条件查询应用场景非常广泛

Cache缓存应用程序可以将数据存储在内存中以提高访问速度并确保数据的唯一性

消息队列RabbitMQKafka等消息队列系统中使用Key-Value存储来跟踪消息的路由和分发

分布式系统在分布式系统中Key-Value存储可以用于管理分布式数据和实现数据复制

Web会话管理Web应用通常使用Key-Value存储来管理用户会话状态

游戏应用多人在线游戏中游戏状态通常存储在Key-Value存储中

2.2 分类

Key-Value数据库有很多当前主流的核心算法有三种基于Hash哈希的基于B+-tree的和基于LSM-tree

2.2.1 基于Hash算法

在基于哈希的Key-Value数据库中哈希表是一个非常关键的数据结构哈希表可以将任意键Key映射到一个索引Index),并将值Value存储在该索引的位置上这种映射关系使得我们可以非常快速地找到对应的键值对通常只需要O(1)的时间复杂度

在写操作时Key-Value数据库会使用哈希函数将键Key映射成索引Index),并将值Value存储在该索引位置上在查询操作时数据库会再次使用哈希函数将键Key映射成索引Index),并在该索引位置上查找对应的值Value

基于哈希的Key-Value数据库具有快速可扩展和高可用性的特点可以处理大量的数据并保证高并发访问的速度同时基于哈希的Key-Value数据库也具有一些潜在的缺点

可能会受到哈希冲突的影响而降低性能尽管这种可能性很小但在处理大量数据时可能会出现

数据的持久性没有很好的保证如果发生硬件故障或数据库崩溃数据可能会丢失一致性Hash& 多副本一些典型的基于哈希的Key-Value数据库包括RedisMemcachedAerospike

2.2.2 基于B+-tree算法

基于B+-treeKey-Value数据库是一种数据存储和检索系统它使用B+-tree作为其基本的数据结构在基于B+树的Key-Value数据库中B+树被用作索引结构所有的键Key和值Value都存储在叶子节点上并形成了一个链表查找插入和删除等操作时时间复杂度比较稳定且都为O(logn)

基于B+-treeKey-Value数据库具有一些显著的特点

由于B+-tree的特性相近的key-value对能够存储在一起数据库可以支持范围查询和有序查找等操作

B+-tree的平衡特性使得其可以支持多个线程或进程同时进行读写操作

B+-tree算法相对复杂维护存在难度基于B+-treeKey-Value数据库的插入操作通常需要在叶子节点上进行如果插入的键Key已经存在则需要进行分裂操作分裂操作会将节点分裂成两个节点并重新平衡树结构在分裂操作时如果根节点只有一个子节点则需要进行合并操作以保证树的平衡性

基于B+-tree算法的代表NoSQL数据库使MongoDB

2.2.3 基于LSM-Tree算法

LSM-Tree 采取读写分离的策略会优先保证写操作的性能其数据首先存储内存中而后需要定期Flush 到硬盘上LSM-Tree可以将离散的随机写请求转换成批量的顺序写操作无论是在RAMHDD还是在SSDLSM-Tree的写性能都更加优秀基于LSM-TreeKV数据库有HBase, Cassandra,RocksDB, LevelDB

 

根据LSM-tree算法写入请求通常直接写入在内存中维护的内存表数据结构中性能很好但当内存表的数据量达到一定阈值时将内存表持久化到SSTable文件同时在分层结构中上一层LevelSSTable数量达到一定阈值就会进行Compaction合并成下一级LevelSSTable


基于LSM-treeKey-Value数据库存在以下问题

写入性能的波动Compaction操作会占用CPU内存和IO资源这导致了写入性能波动

较大的写入放大WA>10x为了确保数据的一致性和完整性LSM-tree需要将写前日志Write Ahead Log存储在盘上这需要额外的空间数据在SSTable中从旧到新可能会存在多个版本成倍的增加了存储空间此外Compaction操作也需要额外的临时空间存放数据文件

随机读性能相对较差最好情况是从内存中直接读取最差情况是遍历所有Level层级的SSTable所以随机读的平均时延不可预期性能也相对较差

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0