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

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

时间:2023-05-04 14:46:30浏览次数:28  
标签:10 缓存 redis 写入 kv key ssd 客户端

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

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

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

 

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。

 

--------【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。

 

标签:10,缓存,redis,写入,kv,key,ssd,客户端
From: https://www.cnblogs.com/piapia/p/17371154.html

相关文章

  • redis集成
    1、linux下源码安装redis官网http://redis.io下载redis解压tar-zvsfredis-7.0.11.tar.gz移动到usr/local路径下mvredis-7.0.11/usr/local/redis进入redis文件夹cd/usr/local/redis使用两个cpu编译文件,速度快点。因为服务器是2核,根据自己配置即可make-j2将编......
  • Linux安装部署Redis(超级详细)
    原文链接:https://www.cnblogs.com/AllWjw/p/15771097.html网上搜索了一筐如何在Linux下安装部署Redis的文章,各种文章混搭在一起勉强安装成功了。自己也记录下,方便后续安装时候有个借鉴之处。Redis版本5.0.4服务器版本LinuxCentOS7.664位下载Redis进入官网找到下载地......
  • 在Alibaba Cloud Linux操作系统上安装Redis教程
    AlibabaCloudLinux2内置Redis6.0.5和Redis3.2.12的yum源,执行sudoyuminstall命令即可部署Redis6.0.5和Redis3.2.12。本文阿里云百科以阿里云持久内存服务器ECS为例,使用AlibabaCloudLinux2.1903LTS64位操作系统,安装Redis6.0.5或Redis3.2.12详细流程如下:AlibabaCloud......
  • 一路输入四路输出四进四出模拟信号隔离分配器0-5V/0-10V/1-5V转0-10mA/0-20mA/4-20mA
    主要特性:>>精度等级:0.1级、0.2级。产品出厂前已检验校正,用户可以直接使用>>辅助电源:5V/12V/15V/24VDC(范围±10%)>>国际标准一路信号输入:0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等>>四路输出标准信号:0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等,具有高负载能力>>全量程范围内极高的线性......
  • 08 KVM虚拟机配置-总体介绍
    08KVM虚拟机配置-总体介绍8.1概述Libvirt工具采用XML格式的文件描述一个虚拟机特征,包括虚拟机名称、CPU、内存、磁盘、网卡、鼠标、键盘等信息。用户可以通过修改配置文件,对虚拟机进行管理。本章介绍XML配置文件各个元素的含义,指导用户完成虚拟机配置。8.2基本格式虚拟机XML......
  • Go | 一分钟掌握Go | 10 - 反射
     作者:Mars酱 声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。 转载:欢迎转载,转载前先请联系我!前言反射你以为只在Java中有吗?Go也有反射机制,很多的标准库中,也使用了反射机制,比如fmt包中的encoding包,都是依赖反射机制的。Go的反射比Java的更简单,就只依赖两两个对象:......
  • 记忆化搜索 P1028 数的计算
    P1028[NOIP2001普及组]数的计算-洛谷|计算机科学教育新生态(luogu.com.cn)一开始是想暴力搜索的,也就是枚举比n/2小的数,但是只过了5个点,其他点都TLE然后就开始想有没有优化方法以6为例子6/2=3,那么以6为首的长度为2的序列就有61,62,63,也就是所有小于等于3的数的个数接下......
  • 力扣---1003. 检查替换后的词是否有效
    给你一个字符串s,请你判断它是否有效。字符串s有效需要满足:假设开始有一个空字符串t="",你可以执行任意次下述操作将t转换为s:将字符串"abc"插入到t中的任意位置。形式上,t变为tleft+"abc"+tright,其中t==tleft+tright。注意,tleft和tright可能为......
  • 2022 杭电多校 第十场 1001 Winner Prediction(最大流)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=7244杭电题解:先让1号选手赢下所有和他有关的比赛,设此时选手赢了a场比赛。如果存在某个ai>a1则1号选手不可能成为冠军。否则选手至多还能再赢bi=a1-ai场比赛。考虑建立一张网络流图:每场未进行的比赛在图中用一个点......
  • NC51101 Lost Cows
    题目链接题目题目描述\(N(2\leqN\leq8,000)\)cowshaveuniquebrandsintherange1..N.Inaspectaculardisplayofpoorjudgment,theyvisitedtheneighborhood'wateringhole'anddrankafewtoomanybeersbeforedinner.Whenitwastimetoli......