我设计了个【方案】:比redis好10倍的kv库【一统kv】

这篇具有很好参考价值的文章主要介绍了我设计了个【方案】:比redis好10倍的kv库【一统kv】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我设计的redis9.0方案:redis自带中间件

基于ssd磁盘,此我设计了比redis更好的缓存方案。此方案:没有缓存击穿问题。没有缓存雪崩问题。没有缓存污染问题。没有热key问题。
不需要snap和aof。支持任何sql库,sql库不需要带有任何分布式功能。

 基于ssd磁盘,此我设计了比redis更好的缓存方案:在ssd上增加key的lru信息。从ssd到网络存储,到sql。

 文章来源地址https://www.toymoban.com/news/detail-433364.html

redis 好10倍 一统kv 1.0 博客园
2023-0503,这个方案目前是1.0,方案会持续修补更新,版本号也会变。

世界上为什么没有这种3级数据库?


cpu3级缓存,大家都知道吧。
cpu3级缓存的作用,大家都知道吧。就是分冷热数据,冷数据淘汰。

那么为什么世界上,没有一种【3级,冷热数据自动分层,数据库】?

--------【1级=内存级。lru队列。】--------

内存级。lru队列。队列有容量限制。存储redis兼容的数据类型。队列中的每个键值,都有一个热度值。
客户端来读,已有数据:已有数据直接返回。
客户端来读,但本级无数据:绝不会去读下级队列,而是返回本级没有数据。解决缓存污染问题。

整理队列:只在没有客户端读请求时做。
超出lru队列的冷数据:放入写队列。写后移除。
当内存空余超过多少mb时,读下级队列中,最热的100条数据。把下级热度值一并读取。

内存中,永远只有最热的key。不支持客户端,把key写入内存。

内存中的某些key,有个属性,此属性阻止key写入到ssd磁盘。这样的key断电将丢失。

 

--------【2级=ssd磁盘级。】--------

 

直读请求:
1本级已有数据,返回数据,不写入上级队列。支持限制并发数。
2本级无数据:则放入读取下级队列。定时从下级读取。比如每隔2秒。读取每个数据时,相邻的16k数据一同读取。返回数据,不写入上级队列。
支持对客户端ip,限制并发数。比如,建立一个以客户端ip为key。ip{k1=v1; k2=v2}把已经向下级查找,但未返回的数据,写入到这个key中。
给这个key设置警告容量=50,最大容量=100。则超过100,返回:太频繁的查询。
支持对一批客户端ip,设定限制警告,最大并发数。

写请求:维护一个很小的缓冲区,基本每秒写入。

 

整理队列:
lru队列:队列有容量限制。队列中的每个键值,都有一个热度值。
超出lru队列的冷数据:放入写队列。定时写入下级,写后移除。
几乎必须要有这个功能:从kv到非kv,比如到sql,到存储。
定时计算出本级最热的100个key,算出几个,以供上级读取。


1级2级lru之间,有一个边缘。这个边缘记录在一个变量中。临近此边缘的数据,会被频繁移出,移入。
有一个设定值:
上级写下来的冷数据:标记为最冷-2。
上级写下来的冷数据:标记为最热-100。

ssd中的某些key,有个属性,此属性阻止key写入到下级存储。这样的key断电不会丢失。但迁移时会被丢弃,导致丢失。

通过半夜运行的统计功能插件,实现热key分门别类统计,为数据分片,分集群提供建议。
提供一个管理员命令,手动变更key的热度。


还可以在这个中间件中实现:
1对后端3级库分库分表。
2对后端3级库读写分离。
3对后端3级库:从未分库分表,到分库分表,读写分离转换。
4对后端3级库:从1种分库分表,读写分离,转换到另一种分库分表,读写分离的转换。
5分布式cap,做在此中间件上。不需要后端数据库,带有任何分布式功能。不需要后端数据库,带有主从功能。

问:不需要后端数据库,带有任何分布式功能。为什么?
问:它用什么实现的cap?
答:
中间件自己,通过客户端2步提交,实现了对数据库的cap。
2步提交是一种传统cap的手艺,并不神奇。


6这种库(你叫中间件也可以),支持多种后端nosql,sql库。只需要,用各种语言开发插件即可。
7
* 功能以脚本为接口,采用插件的方式。
* 支持各种语言编写的插件。
* 插件运行后是独立进程。支持各种数据库的客户端。
* 热变更。没有停服的概念。随时启动,停止所有功能。

 

集群:
通过一个标签,如ip,或域名,或项目名,来标识集群peer,最终写入文件名。
对于集群,提供如下管理功能:
1 收。把ssd上的信息,丢弃掉不需要保存的后,从每个集群peer,按照项目备份。
2 放。把备份的恢复到ssd上。
3 整理热key。根据key的热度,在每个peer上平均key。通过这一点,可以达到热key永远平均分布在每个peer。
经过热key重新分布后,在每个peer上的键值对,和项目无法一一对应。即节点1上,有项目125的热key。

没有人能事先知道哪些key热。我的方案通过在ssd上存储key的热度,通过一个每天半夜运行的热key移动程序,达到了热key平均分布在各个集群peer。

--------【3级=网络存储。】--------

 

不分冷热,存有所有数据。

 

--------【3级=任意sql,nosql数据库。数据库不需要带cap,数据库不需要带主从。】--------

 

不分冷热,存有所有数据。与上述3互斥。

 

 

--------【此数据库的特性:】--------

 

1必须有2级存储。即必须使用ssd。

2程序永远只操作redis的kv对象,不关心是否有sql。
后端库sql库不关心kv功能。
因为所有的活,都被这个库中的2级缓存中的,中间件干了。

3对于一个冷读取,至少需要等待3秒:即从3级库hdd磁盘到2级磁盘等2秒,从2级磁盘到1级ssd等1秒。

4对于每个写请求:可选写入:4-1内存表示写入成功,4-2写入ssd表示写入成功,4-3写入hdd磁盘表示成功,4-4写入分布式库表示成功。
4-1会丢数据。丢数据情况为:断电,进程死机,数据被列入队列抛弃。234不会。这其中,最不重要的数据写入4-1,其次大多数写入4-2,剩下所有重要的数据写入4-4。
从4-2,到4-3,或到4-4,只能管理员手动操作。给管理员提供一个命令即可。

5不需要redis的snap,和aof,落盘功能。因为上述234保证了数据安全。

ssd2级磁盘,相当于redis的snap。
hdd3级磁盘,相当于redis的snap的snap。但又不是单纯的snap。这里面有很多种玩法。

5-1 hsnap比ssnap更大。是数据库,这样就不需要任何sql数据库,nosql库。
5-2 hsnap文件的大小,格式,都可以自定义。
5-3 hsnap可以带上域名,服务器ip。这样就成了分布式缓存。如此一来只需要网络上的2个副本,redis3主3从集群也没必要了。


6redis只是缓存,不能当库用。redis不存冷数据,但这个库可以。redis存储空间有限,但这个库可以看做空间无限。

6没有缓存击穿问题。没有缓存雪崩问题。没有缓存污染问题。没有热key问题。

--------【结论】--------

 

内存缓存 ---> ssd硬盘 ---> 网络存储上的文件
内存缓存 ---> ssd硬盘 ---> nosql,sql数据库 <--- 数据分析工具

 

问:为什么说redis集群没必要了?为什么说redis集群错了?

答:

网络磁盘分为:【单台】,【冗余】。对于自带冗余的网络磁盘,我们只需要简单的写入1台即可。
这里我们只谈:【单台】。单台需要从ssd读取,写入到所有2台【单台】网络磁盘。这里采用2步提交即可。
对于从【ssd】到【nosql,sql数据库】也是采用2步提交。
也就是说redis的集群,维持心跳,都没必要。
我再说明白点:
1客户端给ab提交,带着uuid,和写入时间,只要成功写入其中1台ssd即可。
2读的时候,任意1台客户机读成功即可。

 

redis集群特色:
每个集群节点,只有部分数据。
通过分插槽的方法,尽量平均读写压力。

本架构集群特色:

集群服务器不需要选主。没有raft。不需要3,5节点。支持1-4节点。

每个节点【最多】只需要2台网络副本,简称网络raid1。不分主,从。
基于2级磁盘ssd,可以人为手动,或配置文件自动,分库,分表,合库,合表。
继而实现:分节点,合节点。

集群客户端:


每个集群节点内存中,内有个key,含有所有集群的节点的ip,端口,版本。此key永远存在内存中。
客户端来读,非本集群的key,返回错误。
客户端来写,非本集群的key,返回错误。
或者说从客户端,选择返回数据的服务器。即,假如客户端不知道某key所在的节点,客户端首次读写某key,需要遍历所有服务器。
得到某个key所在的服务器后,会把本key的服务器ip,端口,写在本地。
也就是说,客户端维持每个key的服务器属性。这个属性,保存到磁盘上。
当服务器上的key,迁移到其他服务器后,不会通知客户端,只会返回错误。此时,客户端将从新遍历服务器,以查找key的所在。

假设集群有10个节点,那么客户端最多读10次,才能读到key值。
为了给这个操作提速,可以增加一个【key索引服务器】。
【key索引服务器】也是一个内存kv库。它频繁从10个节点上的ssd中,读key,然后建立索引。
有了【key索引服务器】,客户端只需要2次,即可读到key值:
1读key索引服务器,返回此key所在的peer的ip,记录在本地。
2从peer的ip,读取值。
很显然,集群节点少的情况,不需要【key索引服务器】。

问:为什么说redis的snap错了?

答:
客户端进来的数据,直接写入ssd,相当于aof。
因为本架构不需要snap。本架构没有snap过程。
在本架构中,1级缓存写入数据到ssd,必须经过lru。分buffer,分时段,写入。这个过程最多耗时1-2秒。即分片写入。
而进程重启后,从下级ssd缓存读取,也只选择ssd盘上lru队列中的topn条数据,塞满内存缓存的95%即可。
或者说redis的缺点是:snap保存到磁盘时,丢失了lru队列信息。

--------【关于名字】--------

中文名字:一统kv
英文名字:kvAIO

这个数据库架构,我看不但能够一统kv,还能一统db。

 

到了这里,关于我设计了个【方案】:比redis好10倍的kv库【一统kv】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 公司来了个大牛:短短改了几行代码,接口吞吐量提升了 10 倍。。

    作者:FishBones 链接:https://juejin.cn/post/7185479136599769125 公司的一个ToB系统,因为客户使用的也不多,没啥并发要求,就一直没有经过压测。这两天来了一个“大客户”,对并发量提出了要求:核心接口与几个重点使用场景单节点 吞吐量 要满足最低500/s的要求。 当时一想,50

    2024年02月05日
    浏览(41)
  • 【征服redis15】分布式锁的功能与整体设计方案

    目录  1. 分布式锁的概念 2.基于数据库做分布式锁 2.1 基于表主键唯一做分布式锁 2.2 基于表字段版本号做分布式锁 2.3 基于数据库排他锁做分布式锁 3.使用Redis做分布式锁 3.1 redis实现分布式锁的基本原理 3.2 问题一:增加超时机制,防止长期持有的情况 3.3 问题2:重入的问题

    2024年01月22日
    浏览(38)
  • Redis缓存设计与性能优化【并发创建同一个缓存,解决方案:互斥锁】

    开发人员使用“缓存+过期时间”的策略既可以加速数据读写, 又保证数据的定期更新, 这种模式基本能够满足绝大部分需求。 但是有两个问题如果同时出现, 可能就会对应用造成致命的危害: 当前key是一个热点key(例如一个热门的娱乐新闻),并发量非常大。 重建缓存不

    2024年04月09日
    浏览(48)
  • 浅谈链改_羊了个羊_应如何设计通证模型?

    忽然间,好像所有人都在玩《羊了个羊》,虽然腾讯掌门人马化腾辟谣其传出的收入流水截图为PS伪造,但足以说明这个项目“家喻户晓”的程度。 《羊了个羊》 的爆款离不开其善于利用人性,“仅有万分之一的人才能通关”的胜负欲、攀比心和群体荣誉感等社交属性的设计

    2024年02月16日
    浏览(44)
  • 基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(一)总体设计

    2.1 引言 本课题是来源于雷达辐射源识别项目,需要对雷达辐射源中频信号进行采集传输 和存储。本章基于项目需求,介绍采集卡的总体设计方案。采集卡设计包括硬件设计 和软件设计。首先对采集卡的性能和指标进行分析,接着提出硬件的总体设计,在硬 件设计基础上提

    2024年02月05日
    浏览(46)
  • 223页10万字大数据中心总体架构及数据仓库顶层设计解决方案WORD

    提供智慧城市、智能制造、数据治理、信息化等领域的系统框架、总体架构、数据流架构资料,包括数据治理、信息化、精益生产改善知识。 本文文档69页,因篇幅限制,以下仅展示部分资料,需要完整资料,点击右上角红色按钮关注+私信,喜欢文章,欢迎转发评论点赞。本

    2024年01月18日
    浏览(45)
  • [4]PCB设计实验|LPWAN物联网系统解决方案 |LoRa模块/LoRa网关/云平台/LoRa应用案例|9:30~10:00

    目录 1.LPWAN物联网系统解决方案                             LoRa模块/LoRa网关/云平台/LoRa应用案例 2.LoRaWAN网络部署情况 LoRaWAN网络架构 3.基于LPWAN技术的无线通信端到端解决方案  LoRa低功耗广域网智能终端 CY-LRW-102开关控制器 CY-LRB-101开关检测器 4.LoRa无线模块 4.1规格 4.2Lo

    2024年02月08日
    浏览(41)
  • Redis缓存设计与性能优化【缓存和数据库不一致问题,解决方案:1.加过期时间这样可以一段时间后自动刷新 2.分布式的读写锁】

    在大并发下,同时操作数据库与缓存会存在数据不一致性问题 1、双写不一致情况 2、读写并发不一致 解决方案: 1、对于并发几率很小的数据(如个人维度的订单数据、用户数据等),这种几乎不用考虑这个问题,很少会发生缓存不一致, 可以给缓存数据加上过期时间,每隔一

    2024年04月13日
    浏览(51)
  • 查询效率至少提高4倍的MySQL技巧

    SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from t where num in(1,2,3) 对于连续的数值,能用between就不要用in了;再或者使用连接来替

    2024年04月26日
    浏览(34)
  • UIE: 信息抽取的大一统模型

    论文链接: https://arxiv.org/abs/2203.12277 最近由于业务需要,一直在关注信息抽取领域的一些文章,实验上尝试了BERT+Softmax、BERT+NER以及GlobalPointer等模型,效果都还可以,就是标数据有点费人。所以,想找一些few-shot效果比较好的模型,可以辅助标注。无意间,就发现了这篇论文,

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包