來,把KeeWiDB的架構(gòu)拆開給你們瞧瞧!
友好:完全兼容 Redis 協(xié)議,原先使用 Redis 的業(yè)務(wù)無需修改任何代碼便可以遷移到 KeeWiDB 上; 高性能低延遲:通過創(chuàng)新性的分級存儲架構(gòu)設(shè)計,單節(jié)點(diǎn)讀寫能力超過 18 萬 QPS,訪問延遲達(dá)到毫秒級; 更低的成本:內(nèi)核自動區(qū)分冷熱數(shù)據(jù),冷數(shù)據(jù)存儲在相對低價的 SSD 上; 更大的容量:節(jié)點(diǎn)支持 TB 級別的數(shù)據(jù)存儲,集群支持 PB 級別的數(shù)據(jù)存儲; 保證了事務(wù)的 ACID (原子性 Atomicity、一致性 Consitency、隔離性 Isolation、持久性 Durability)四大特性;
整體架構(gòu)
圖:KeeWiDB整體架構(gòu)圖
代理層
客戶端直接和 Proxy 進(jìn)行交互,后端集群在擴(kuò)縮容場景不會影響客戶端請求; Proxy 內(nèi)部有自己的連接池和后端 KeeWiDB 進(jìn)行交互,可大大減少 KeeWiDB 上的連接數(shù)量,同時有效避免業(yè)務(wù)短連接場景下反復(fù)建連斷連對內(nèi)核造成性能的影響; 支持讀寫分離,針對讀多寫少的場景,通過添加副本數(shù)量可以有效分?jǐn)?KeeWiDB 的訪問壓力; 支持命令攔截和審計功能,針對高危命令進(jìn)行攔截和日志審計,大幅度提高系統(tǒng)的安全性; 由于 Proxy 是無狀態(tài)的,負(fù)載較高場景下可以通過增加 Proxy 數(shù)量來緩解壓力,此外我們的 Proxy 支持熱升級功能,后續(xù) Proxy 添加了新功能或者性能優(yōu)化,存量 KeeWiDB 實例的 Proxy 都可以進(jìn)行對客戶端無感知的平滑升級;

服務(wù)層
Server內(nèi)部模型
圖:Server內(nèi)部模塊
線程模型
圖:線程模型
引入?yún)f(xié)程
開啟過多的線程會耗費(fèi)大量的系統(tǒng)資源, 包括內(nèi)存; 線程的上下文切換涉及到用戶空間和內(nèi)核空間的切換, 大量線程的上下文切換同樣會給 CPU 帶來額外的開銷;
A coroutine is a function that can suspend execution to be resumed later. Coroutines are stackless: they suspend execution by returning to the caller and the data that is required to resume execution is stored separately from the stack. This allows for sequential code that executes asynchronously (e.g. to handle non-blocking I/O without explicit callbacks).
圖:協(xié)程切換示意圖
數(shù)據(jù)存儲
圖:Dram和PMem以及SSD的性能比較
In computing, a page cache, sometimes also called disk cache, is a transparent cache for the pages originating from a secondary storage device such as a hard disk drive (HDD) or a solid-state drive (SSD). The operating system keeps a page cache in otherwise unused portions of the main memory (RAM), resulting in quicker access to the contents of cached pages and overall performance improvements. A page cache is implemented in kernels with the paging memory management, and is mostly transparent to applications.
圖:數(shù)據(jù)頁的升溫和落冷主從同步
存儲型數(shù)據(jù)庫的請求執(zhí)行過程中涉及到磁盤 IO,單個請求的執(zhí)行耗時本身就比較長; 主節(jié)點(diǎn)同時服務(wù)多個客戶端連接,不同連接的請求并發(fā)執(zhí)行,發(fā)揮了協(xié)程異步 IO 的優(yōu)勢,節(jié)點(diǎn)整體 QPS 有保障; 主從同步只有一個連接,由于從庫順序回放請求,無法并發(fā),回放的 QPS 遠(yuǎn)遠(yuǎn)跟不上主節(jié)點(diǎn)處理用戶請求的 QPS;
在從節(jié)點(diǎn)增加 RelayLog 作為中繼,將從節(jié)點(diǎn)的命令接收和回放兩個過程拆開,避免回放過程拖慢命令的接收速度; 在主節(jié)點(diǎn)記錄 Binlog 的時候增加邏輯時鐘信息,回放的時候根據(jù)邏輯時鐘確定依賴關(guān)系,將互相之間沒有依賴的命令一起放進(jìn)回放的協(xié)程池,并發(fā)完成這批命令的回放,提升從節(jié)點(diǎn)整體的回放 QPS;
圖:從庫并發(fā)回放
seqnum 是主節(jié)點(diǎn)事務(wù) commit 的序列號,每次有新的事務(wù) commit,當(dāng)前 seqnum 賦給當(dāng)前事務(wù),全局 seqnum 自增1; parent 由主節(jié)點(diǎn)在每個事務(wù)開始執(zhí)行前的 prepare 階段獲取,記錄此時已經(jīng) commit 的最大 seqnum,記為 max,說明當(dāng)前事務(wù)是在 max 對應(yīng)事務(wù) commit 之后才開始執(zhí)行,二者在主節(jié)點(diǎn)端有邏輯上的先后關(guān)系;
總結(jié)
,即可進(jìn)入官網(wǎng)申請公測),現(xiàn)已在內(nèi)外部已經(jīng)接下了不少業(yè)務(wù),其中不乏有一些超大規(guī)模以及百萬 QPS 級的業(yè)務(wù),線上服務(wù)均穩(wěn)定運(yùn)行中。﹀
﹀
﹀

給你一本武林秘籍,和KeeWiDB一起登頂高性能

Hi,我是KeeWiDB
