我設計的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,
沒有人能事先知道哪些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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/551666.html
標籤:其他
上一篇:【訪問者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作
下一篇:返回列表
