最近在做项目时,遇到了一个问题,现在没有非常好的落地数据的key-value的库。下面就总结一下现有的实现方式,结合使用过程中发现的问题,最后找到一个简单的实现自用的库的方法。
首先总结一下现有的实现方式
1.在mysql上层封装一层接口,将mysql变成一个落地数据的key-value库,然后加上memcache。
这种方式比较适合域读多写少的地方,因为mysql的写性能比较差。读的时候多数会命中memcache所以性能比较好。
针对写性能差的缺点,mysql也有自己的解决方法:读写分离加上主从同步。
建立多个mysql节点,一个节点设置为master,然后其他节点设置为slave(这是扁平的mysql架构)。
在master上开启bin-log,然后slave会读取master的bin-log。
问题:
在一块磁盘上的分表作用有多大?
考虑只读的情况,对建立索引的查询,大部分都是一次IO就可以完成读操作。分表的作用就比较小
如果有写的情况,mysql如果只是锁记录的话,则分表做的作用也非常小。
2.leveldb
leveldb是一个非常好的支持落地数据的key-value的库,它的读性能和写性能都非常好。
性能分析:
读性能:在写不是很多的时候,能保证一次磁盘IO就能得到随机读的数据。
写性能:leveldb采取了合并写的模式,普通的写都是写到内存中,然后过一段时间会顺序的写到一个disk上。所以写的性能也是非常好的。
然后分析一下具体使用问题
在使用的过程中也发现了非常多的问题:
1.leveldb的读性能不是很稳定。我们几个开玩笑的时候说,如果一个库一般情况性能好,但是在某些情况下的性能差,还不如在所有情况下都比较差。因为在评估机器的时候,如果性能差,可以采用scale-out的方式来扩展。
leveldb的merge是一个非常耗时的操作,在通常情况下,merge会涉及到11-12个文件,一个文件2M,就是所涉及到22M文件的读写,这个会花费200ms(200M/s),这个最坏的情况会涉及到24次寻道的时间,大约会花费200ms(一次10ms)。在这个时间内,如果有读请求需要磁盘IO,那么就非常困难了。
可能的解决方法:
1).缩小文件的大小有可能能解决这个问题,比如一个文件1M,这样能降低一次merge花费的时间,涉及的文件会变少。
2).通过merge中的限制,减少merge中间可能会涉及的文件的数目。在merge时,leveldb生成一个文件时,会考虑如果这个文件merge会涉及到多少文件,可以修改这个参数做到减少merge中间可能会涉及的文件的数目。
2.leveldb不支持主从同步。
这个问题比较容易解决,可以采用和mysql的解决方法一样的思路,dump+bin-log的方法。
组装自己的落地数据的key-value库
个性化的leveldb+主从同步,用组装这个词非常合适,嘻嘻。
附:mysql主从同步的实现思路。
今天还学习了一下mysql的bin-log的实现思路,bin-log中记录了insert,update,delete操作的具体内容,然后在slave上重现执行一下bin-log。这种bin-log在slave上的执行时间是和master上一样的,本来我还以为mysql会在binlog中记录内部数据的一些操作(比如B+树的操作和文件diff等等),这样应该能减少slave上的执行时间。但是这样就会让bin-log的设计非常复杂。
分享到:
相关推荐
在日志数据的消费端,breeze使用MongoDB进行日志数据的落地,之所以选择MongoDB,而不是其他关系型数据库或key-value型数据库,是为了兼顾结构化日志的分析能力(MongoDB提供了强大的条件查询能力)和性能(抛弃强...
2. TiKV:是一个分布式 Key-Value 存储系统,负责存储和管理数据。 3. PD:是一个 metadata 服务器,负责管理 TiKV 节点的 metadata 信息。 4. Syncer:是一个数据同步工具,负责将 MySQL 生产库的数据同步到 TiDB ...
- **K-V存储**:所有数据通过键值(key-value)访问,便于快速定位和操作。 - **内存+持久化**:Redis的数据全在内存中,同时提供RDB和AOF两种持久化方式,确保数据安全。 - **数据结构丰富**:支持字符串、哈希、...
在iOS中,ViewModel通常通过KVO(Key-Value Observing)或者RxSwift等响应式编程库实现数据绑定。 **MVVM的优势:** 1. **解耦**:MVVM将业务逻辑从视图中分离出来,使得视图可以独立于业务逻辑进行修改,同时业务...
windows系统运行 consul(替换批处理里面...5.Key/Value存储 Consul支持Key/Value存储功能,可以将Consul作为配置中心使用,可以将一些公共配置信息配置到Consul,然后通过Consul提供的 HTTP API来获取对应Key的Value。
一方面,需要能够处理海量数据写入的系统,如key-value store;另一方面,需要能快速响应海量实时读取需求的缓存系统;此外,还需要能处理海量数据的分析引擎。技术上出现了Cassandra、HBase、Redis、Memcached等...
4. 对于POST数据,将其编码为字符串并设置到请求体:`byte[] data = Encoding.UTF8.GetBytes("key1=value1&key2=value2"); request.ContentLength = data.Length; Stream requestStream = request.GetRequestStream...
高性能存储引擎,支持key-value,k-k-row,list,set,zset多种数据结构,支持数据持久化落地后端DB。 集群模式,高扩展,高可用,支持异地镜像,就近接入。 通过名字访问,支持同步、异步、单向RPC调用。 高效运维...
1、用户前端UI点击上传excel文件,调用/general/importToRedis,解析excel数据和表头,分别储存到redis中,返回数据和表头对应的redis_key,并返回原始文件“导入文件表头字段:key=cell-index,value=cell-cnName”...
京东分布式KEY-VALUE存储设计与挑战 Qunar网数据库架构的发展 阿里巴巴数据库计算存储分离架构与实践 京东金融数据库多场景架构实践 财付通交易核心演进之路 开源大容量redis - pika 的前世今生 开源技术的线上应用...
4. KVO(Key-Value Observing)与通知:用于观察并响应对象属性的变化,是实现数据驱动UI的重要手段。 5. VIPER(View-Interactor-Presenter-Entity-Router):一种强化的MVC变体,将业务逻辑、数据处理和界面展示...
存储平台层基于分布式Key-Value存储系统,而存储服务层则提供多种存储服务和接口协议,确保访问安全。此外,华为的云存储解决方案还注重海量扩展性、自组织自管理、强一致性以及高性能块存储服务。 总之,华为在...
- **cdb存储结构**:通过table分段存储计数,一个key-value存储多个计数,提高了存储效率。 #### 六、总结 新浪微博在Redis优化过程中,从最初的尝试到最终的成熟方案,经历了一系列的探索和实践。通过对业务场景...
<EasingDoubleKeyFrame KeyTime="0" Value="0"/> <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="50"/> <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="10"/> <EasingDoubleKeyFrame KeyTime="0:0:0.6" ...
Java作为一种广泛使用的编程语言,提供了丰富的库和工具来实现这样的算法。本文将深入探讨两个关于Java抛物线算法的实例,旨在帮助开发者更好地理解和应用这类算法。 抛物线是一条由二次函数定义的曲线,其一般形式...
public static boolean BinarySearch(int keyValue) { int left; // 左边界变量 int right; // 右边界变量 int middle; // 中位数变量 System.out.println("数据长度:"+len); left = 0; ...